@hfunlabs/hypurr-connect 0.1.24 → 0.1.26

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["#style-inject:#style-inject","../src/styles.css","../src/HypurrConnectProvider.tsx","../src/privateKeySigner.ts","../src/agent.ts","../src/grpc.ts","../src/GrpcExchangeTransport.ts","../src/agentWallet.ts","../src/LoginModal.tsx","../src/useIsMobile.ts","../src/icons/MetaMaskColorIcon.tsx","../src/icons/TelegramColorIcon.tsx","../src/AddWalletModal.tsx","../src/icons/lucide.tsx","../src/RenewAgentModal.tsx","../src/WalletSelectorDropdown.tsx","../src/AgentExpiryWarning.tsx","../src/UserProfileModal.tsx","../src/DeleteWalletModal.tsx","../src/profileStyles.ts","../src/RenameWalletModal.tsx","../src/types.ts"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@import \\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Google+Sans+Code:wght@400;500;600;700&display=swap\\\";\\n.hypurr-connect .btn-raised {\\n background-color: rgb(var(--btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.03),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.1),\\n inset 0 -1px 0 rgba(0, 0, 0, .35),\\n inset 0 0 0 1px rgb(var(--btn-ring));\\n color: rgb(var(--btn-fg));\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.hypurr-connect .btn-raised:hover:not(:disabled) {\\n background-color: rgb(var(--surface-btn-hover));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.04),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.14),\\n inset 0 -1px 0 rgba(0, 0, 0, .4),\\n inset 0 0 0 1px rgb(var(--surface-bd-hover));\\n color: rgb(var(--content-tertiary));\\n}\\n.hypurr-connect .btn-raised-active {\\n background-color: rgb(var(--surface-btn-active));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.05),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.18),\\n inset 0 -1px 0 rgba(0, 0, 0, .45),\\n inset 0 0 0 1px rgb(var(--surface-bd-active)),\\n 0 1px 2px rgba(0, 0, 0, .5);\\n color: rgb(var(--content));\\n}\\n.hypurr-connect .btn-raised-accent,\\n.hypurr-connect .btn-raised-active {\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.hypurr-connect .btn-raised-accent {\\n background-color: rgb(var(--accent-btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.03),\\n transparent);\\n box-shadow: inset 0 1px 0 rgb(var(--btn-bevel)/.1), inset 0 -1px 0 rgb(var(--accent-btn-inset)/.75);\\n color: rgb(var(--accent-btn-fg));\\n}\\n.hypurr-connect .btn-raised-accent:hover:not(:disabled) {\\n background-color: rgb(var(--accent-btn-bg-hover));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.04),\\n transparent);\\n box-shadow: inset 0 1px 0 rgb(var(--btn-bevel)/.14), inset 0 -1px 0 rgb(var(--accent-btn-inset)/.8);\\n color: rgb(var(--accent-btn-fg-hover));\\n}\\n.hypurr-connect .btn-raised-disabled {\\n background-color: rgb(var(--btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.02),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 -1px 0 rgba(0, 0, 0, .25),\\n inset 0 0 0 1px rgb(var(--btn-ring)/.6);\\n color: rgb(var(--content-faint));\\n cursor: not-allowed;\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.light .hypurr-connect .btn-raised {\\n background-image:\\n linear-gradient(\\n to bottom,\\n #fff,\\n rgb(var(--surface-btn)));\\n box-shadow:\\n 0 1px 2px rgba(15, 23, 42, .08),\\n 0 1px 1px rgba(15, 23, 42, .04),\\n inset 0 0 0 1px rgb(var(--surface-bd));\\n}\\n.light .hypurr-connect .btn-raised:hover:not(:disabled) {\\n background-image:\\n linear-gradient(\\n to bottom,\\n #fff,\\n rgb(var(--surface-btn-hover)));\\n box-shadow:\\n 0 2px 6px rgba(15, 23, 42, .12),\\n 0 1px 2px rgba(15, 23, 42, .06),\\n inset 0 0 0 1px rgb(var(--surface-bd-hover));\\n}\\n.light .hypurr-connect .btn-raised-active {\\n background-image: none;\\n background-color: rgb(var(--surface-btn-active));\\n box-shadow: inset 0 1px 2px rgba(15, 23, 42, .12), inset 0 0 0 1px rgb(var(--surface-bd-active));\\n}\\n.light .hypurr-connect .btn-raised-disabled {\\n background-image: none;\\n box-shadow: inset 0 0 0 1px rgb(var(--surface-bd));\\n}\\n.light .hypurr-connect .btn-raised-accent {\\n box-shadow: 0 1px 2px rgba(124, 58, 237, .18), inset 0 0 0 1px rgba(124, 58, 237, .22);\\n}\\n.light .hypurr-connect .btn-raised-accent:hover:not(:disabled) {\\n box-shadow: 0 2px 6px rgba(124, 58, 237, .24), inset 0 0 0 1px rgba(124, 58, 237, .28);\\n}\\n.hypurr-connect .input {\\n background-color: rgb(var(--input-bg));\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .5),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 0 0 1px rgb(var(--input-ring));\\n color: rgb(var(--content));\\n transition: box-shadow .15s, background-color .15s;\\n}\\n.hypurr-connect .input::-moz-placeholder {\\n color: rgb(var(--content-faint));\\n opacity: 1;\\n}\\n.hypurr-connect .input::placeholder {\\n color: rgb(var(--content-faint));\\n opacity: 1;\\n}\\n.hypurr-connect .input:focus,\\n.hypurr-connect .input:focus-within {\\n background-color: rgb(var(--input-bg-focus));\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .45),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.06),\\n inset 0 0 0 1px rgb(var(--input-ring-focus));\\n}\\n.hypurr-connect .input-error,\\n.hypurr-connect .input-error:focus,\\n.hypurr-connect .input-error:focus-within {\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .5),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 0 0 1px hsla(0, 91%, 71%, .7);\\n}\\n.light .hypurr-connect .input {\\n box-shadow: inset 0 2px 3px rgba(15, 23, 42, .08), inset 0 0 0 1px rgb(var(--input-ring));\\n}\\n.light .hypurr-connect .input:focus,\\n.light .hypurr-connect .input:focus-within {\\n box-shadow: inset 0 2px 4px rgba(15, 23, 42, .1), inset 0 0 0 1px rgb(var(--input-ring-focus));\\n}\\n.light .hypurr-connect .input-error,\\n.light .hypurr-connect .input-error:focus,\\n.light .hypurr-connect .input-error:focus-within {\\n box-shadow: inset 0 2px 3px rgba(15, 23, 42, .08), inset 0 0 0 1px rgba(220, 38, 38, .7);\\n}\\n.hypurr-connect .\\\\!visible {\\n visibility: visible !important;\\n}\\n.hypurr-connect .visible {\\n visibility: visible;\\n}\\n.hypurr-connect .fixed {\\n position: fixed;\\n}\\n.hypurr-connect .absolute {\\n position: absolute;\\n}\\n.hypurr-connect .relative {\\n position: relative;\\n}\\n.hypurr-connect .inset-0 {\\n inset: 0;\\n}\\n.hypurr-connect .right-2 {\\n right: .5rem;\\n}\\n.hypurr-connect .right-6 {\\n right: 1.5rem;\\n}\\n.hypurr-connect .top-1\\\\/2 {\\n top: 50%;\\n}\\n.hypurr-connect .z-\\\\[100\\\\] {\\n z-index: 100;\\n}\\n.hypurr-connect .z-\\\\[101\\\\] {\\n z-index: 101;\\n}\\n.hypurr-connect .z-\\\\[110\\\\] {\\n z-index: 110;\\n}\\n.hypurr-connect .z-\\\\[111\\\\] {\\n z-index: 111;\\n}\\n.hypurr-connect .mb-1\\\\.5 {\\n margin-bottom: .375rem;\\n}\\n.hypurr-connect .mb-2 {\\n margin-bottom: .5rem;\\n}\\n.hypurr-connect .mt-0\\\\.5 {\\n margin-top: .125rem;\\n}\\n.hypurr-connect .mt-1 {\\n margin-top: .25rem;\\n}\\n.hypurr-connect .mt-1\\\\.5 {\\n margin-top: .375rem;\\n}\\n.hypurr-connect .block {\\n display: block;\\n}\\n.hypurr-connect .inline-block {\\n display: inline-block;\\n}\\n.hypurr-connect .inline {\\n display: inline;\\n}\\n.hypurr-connect .flex {\\n display: flex;\\n}\\n.hypurr-connect .inline-flex {\\n display: inline-flex;\\n}\\n.hypurr-connect .grid {\\n display: grid;\\n}\\n.hypurr-connect .contents {\\n display: contents;\\n}\\n.hypurr-connect .hidden {\\n display: none;\\n}\\n.hypurr-connect .h-8 {\\n height: 2rem;\\n}\\n.hypurr-connect .w-8 {\\n width: 2rem;\\n}\\n.hypurr-connect .w-full {\\n width: 100%;\\n}\\n.hypurr-connect .min-w-0 {\\n min-width: 0;\\n}\\n.hypurr-connect .max-w-md {\\n max-width: 28rem;\\n}\\n.hypurr-connect .flex-1 {\\n flex: 1 1 0%;\\n}\\n.hypurr-connect .flex-shrink-0 {\\n flex-shrink: 0;\\n}\\n.hypurr-connect .-translate-y-1\\\\/2 {\\n --tw-translate-y:-50%;\\n}\\n.hypurr-connect .-translate-y-1\\\\/2,\\n.hypurr-connect .transform {\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.hypurr-connect .grid-cols-4 {\\n grid-template-columns: repeat(4, minmax(0, 1fr));\\n}\\n.hypurr-connect .items-start {\\n align-items: flex-start;\\n}\\n.hypurr-connect .items-center {\\n align-items: center;\\n}\\n.hypurr-connect .justify-center {\\n justify-content: center;\\n}\\n.hypurr-connect .justify-between {\\n justify-content: space-between;\\n}\\n.hypurr-connect .gap-1\\\\.5 {\\n gap: .375rem;\\n}\\n.hypurr-connect .gap-2 {\\n gap: .5rem;\\n}\\n.hypurr-connect .gap-3 {\\n gap: .75rem;\\n}\\n.hypurr-connect :is(.space-y-2 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(.5rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(.5rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect :is(.space-y-3 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(.75rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(.75rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect :is(.space-y-4 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(1rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(1rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect .overflow-hidden {\\n overflow: hidden;\\n}\\n.hypurr-connect .truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.hypurr-connect .break-all {\\n word-break: break-all;\\n}\\n.hypurr-connect .rounded {\\n border-radius: .25rem;\\n}\\n.hypurr-connect .rounded-lg {\\n border-radius: .5rem;\\n}\\n.hypurr-connect .rounded-md {\\n border-radius: .375rem;\\n}\\n.hypurr-connect .border {\\n border-width: 1px;\\n}\\n.hypurr-connect .border-b {\\n border-bottom-width: 1px;\\n}\\n.hypurr-connect .border-amber-500\\\\/25 {\\n border-color: rgb(var(--amber-500)/.25);\\n}\\n.hypurr-connect .border-line {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--line)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-line-strong {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--line-strong)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-surface-bd {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-surface-bd-active {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd-active)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-trade-down\\\\/20 {\\n border-color: rgb(var(--trade-down)/.2);\\n}\\n.hypurr-connect .bg-amber-500\\\\/\\\\[0\\\\.08\\\\] {\\n background-color: rgb(var(--amber-500)/.08);\\n}\\n.hypurr-connect .bg-overlay\\\\/70 {\\n background-color: rgb(var(--overlay)/.7);\\n}\\n.hypurr-connect .bg-surface-btn {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-btn-active {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-active)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-btn-hover {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-hover)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-modal {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-modal)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-trade-down\\\\/\\\\[0\\\\.08\\\\] {\\n background-color: rgb(var(--trade-down)/.08);\\n}\\n.hypurr-connect .p-1\\\\.5 {\\n padding: .375rem;\\n}\\n.hypurr-connect .p-3 {\\n padding: .75rem;\\n}\\n.hypurr-connect .p-4 {\\n padding: 1rem;\\n}\\n.hypurr-connect .px-2 {\\n padding-left: .5rem;\\n padding-right: .5rem;\\n}\\n.hypurr-connect .px-3 {\\n padding-left: .75rem;\\n padding-right: .75rem;\\n}\\n.hypurr-connect .px-6 {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem;\\n}\\n.hypurr-connect .py-1 {\\n padding-top: .25rem;\\n padding-bottom: .25rem;\\n}\\n.hypurr-connect .py-1\\\\.5 {\\n padding-top: .375rem;\\n padding-bottom: .375rem;\\n}\\n.hypurr-connect .py-2 {\\n padding-top: .5rem;\\n padding-bottom: .5rem;\\n}\\n.hypurr-connect .py-2\\\\.5 {\\n padding-top: .625rem;\\n padding-bottom: .625rem;\\n}\\n.hypurr-connect .py-5 {\\n padding-top: 1.25rem;\\n}\\n.hypurr-connect .pb-5,\\n.hypurr-connect .py-5 {\\n padding-bottom: 1.25rem;\\n}\\n.hypurr-connect .pb-6 {\\n padding-bottom: 1.5rem;\\n}\\n.hypurr-connect .pr-11 {\\n padding-right: 2.75rem;\\n}\\n.hypurr-connect .pt-5 {\\n padding-top: 1.25rem;\\n}\\n.hypurr-connect .pt-6 {\\n padding-top: 1.5rem;\\n}\\n.hypurr-connect .font-mono {\\n font-family:\\n Google Sans Code,\\n Roboto Mono,\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n}\\n.hypurr-connect .font-sans {\\n font-family:\\n Inter,\\n ui-sans-serif,\\n system-ui,\\n -apple-system,\\n BlinkMacSystemFont,\\n Segoe UI,\\n Roboto,\\n Helvetica Neue,\\n Arial,\\n sans-serif;\\n}\\n.hypurr-connect .text-base {\\n font-size: 12.5px;\\n line-height: 1rem;\\n}\\n.hypurr-connect .text-lg {\\n font-size: 14px;\\n line-height: 1.25rem;\\n}\\n.hypurr-connect .font-medium {\\n font-weight: 500;\\n}\\n.hypurr-connect .uppercase {\\n text-transform: uppercase;\\n}\\n.hypurr-connect .tabular-nums {\\n --tw-numeric-spacing:tabular-nums;\\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\\n}\\n.hypurr-connect .tracking-\\\\[0\\\\.1em\\\\] {\\n letter-spacing: .1em;\\n}\\n.hypurr-connect .text-amber-200 {\\n --tw-text-opacity:1;\\n color: rgb(var(--amber-200)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-amber-400 {\\n --tw-text-opacity:1;\\n color: rgb(var(--amber-400)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content {\\n --tw-text-opacity:1;\\n color: rgb(var(--content)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-faint {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-muted {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-muted)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-subtle {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-subtle)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-trade-down {\\n --tw-text-opacity:1;\\n color: rgb(var(--trade-down)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-trade-up {\\n --tw-text-opacity:1;\\n color: rgb(var(--trade-up)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .placeholder-content-faint::-moz-placeholder {\\n --tw-placeholder-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-placeholder-opacity,1));\\n}\\n.hypurr-connect .placeholder-content-faint::placeholder {\\n --tw-placeholder-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-placeholder-opacity,1));\\n}\\n.hypurr-connect .shadow-modal {\\n --tw-shadow:var(--shadow-modal);\\n --tw-shadow-colored:var(--shadow-modal);\\n box-shadow:\\n var(--tw-ring-offset-shadow,0 0 #0000),\\n var(--tw-ring-shadow,0 0 #0000),\\n var(--tw-shadow);\\n}\\n.hypurr-connect .outline {\\n outline-style: solid;\\n}\\n.hypurr-connect .blur {\\n --tw-blur:blur(8px);\\n}\\n.hypurr-connect .blur,\\n.hypurr-connect .drop-shadow {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.hypurr-connect .drop-shadow {\\n --tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06));\\n}\\n.hypurr-connect .filter {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.hypurr-connect .backdrop-blur-sm {\\n --tw-backdrop-blur:blur(4px);\\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n}\\n.hypurr-connect .transition {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n -webkit-backdrop-filter;\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n backdrop-filter;\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n backdrop-filter,\\n -webkit-backdrop-filter;\\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\\n transition-duration: .15s;\\n}\\n.hypurr-connect .transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\\n transition-duration: .15s;\\n}\\n.hypurr-connect {\\n -webkit-font-smoothing: auto;\\n -moz-osx-font-smoothing: auto;\\n}\\n:root {\\n --surface-btn:13 18 25;\\n --surface-btn-hover:21 23 26;\\n --surface-btn-active:30 33 36;\\n --surface-bd:38 42 48;\\n --surface-bd-hover:68 69 72;\\n --surface-bd-active:75 77 80;\\n --surface-modal:14 18 24;\\n --surface-dropdown:17 24 32;\\n --surface-base:11 14 17;\\n --surface-deep:9 11 14;\\n --surface-raised:17 24 39;\\n --surface-elevated:31 41 55;\\n --surface-inset:55 65 81;\\n --surface-inverse:255 255 255;\\n --content:243 244 246;\\n --content-secondary:229 231 235;\\n --content-tertiary:209 213 219;\\n --content-muted:170 177 193;\\n --content-subtle:125 133 151;\\n --content-faint:107 114 128;\\n --content-disabled:55 65 81;\\n --line:31 41 55;\\n --line-strong:55 65 81;\\n --line-subtle:17 24 39;\\n --line-inverse:255 255 255;\\n --overlay:0 0 0;\\n --accent:168 85 247;\\n --trade-up:52 211 153;\\n --trade-down:248 113 113;\\n --purple-400:216 180 254;\\n --purple-500:185 125 241;\\n --blue-500:90 153 255;\\n --green-400:83 203 127;\\n --amber-200:253 230 138;\\n --amber-400:251 191 36;\\n --amber-500:245 158 11;\\n --btn-bg:13 18 25;\\n --btn-fg:170 177 193;\\n --btn-ring:38 42 48;\\n --btn-bevel:255 255 255;\\n --accent-btn-bg:37 28 57;\\n --accent-btn-bg-hover:52 35 80;\\n --accent-btn-fg:216 180 254;\\n --accent-btn-fg-hover:233 213 255;\\n --accent-btn-inset:15 5 35;\\n --input-bg:18 23 31;\\n --input-bg-focus:26 33 44;\\n --input-ring:45 53 64;\\n --input-ring-focus:59 69 82;\\n --shadow-modal:0 25px 50px -12px rgba(0,0,0,.6);\\n --shadow-dropdown:0 8px 40px rgba(0,0,0,.85);\\n}\\n.light {\\n --surface-btn:244 246 249;\\n --surface-btn-hover:236 239 243;\\n --surface-btn-active:226 230 236;\\n --surface-bd:214 220 228;\\n --surface-bd-hover:194 201 211;\\n --surface-bd-active:168 176 191;\\n --surface-modal:255 255 255;\\n --surface-dropdown:255 255 255;\\n --surface-base:245 244 249;\\n --surface-deep:233 236 242;\\n --surface-raised:255 255 255;\\n --surface-elevated:228 231 237;\\n --surface-inset:225 229 235;\\n --surface-inverse:17 24 39;\\n --content:17 24 39;\\n --content-secondary:31 41 55;\\n --content-tertiary:55 65 81;\\n --content-muted:91 101 115;\\n --content-subtle:107 114 128;\\n --content-faint:148 163 184;\\n --content-disabled:179 185 196;\\n --line:222 226 234;\\n --line-strong:205 211 220;\\n --line-subtle:238 240 243;\\n --line-inverse:17 24 39;\\n --overlay:0 0 0;\\n --accent:147 51 234;\\n --trade-up:5 150 105;\\n --trade-down:220 38 38;\\n --purple-400:124 58 237;\\n --purple-500:109 40 217;\\n --blue-500:37 99 235;\\n --green-400:22 163 74;\\n --amber-200:161 98 7;\\n --amber-400:180 83 9;\\n --amber-500:180 83 9;\\n --btn-bg:255 255 255;\\n --btn-fg:71 85 105;\\n --btn-ring:217 221 228;\\n --btn-bevel:15 23 42;\\n --accent-btn-bg:243 232 255;\\n --accent-btn-bg-hover:233 213 255;\\n --accent-btn-fg:109 40 217;\\n --accent-btn-fg-hover:88 28 135;\\n --accent-btn-inset:147 51 234;\\n --input-bg:238 240 246;\\n --input-bg-focus:230 232 240;\\n --input-ring:200 206 218;\\n --input-ring-focus:168 175 192;\\n --shadow-modal:0 16px 40px -12px rgba(15,23,42,.24),0 4px 12px -4px rgba(15,23,42,.12);\\n --shadow-dropdown:0 12px 28px -8px rgba(15,23,42,.2),0 2px 8px -2px rgba(15,23,42,.1);\\n}\\n.hypurr-connect .hover\\\\:border-surface-bd-hover:hover {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd-hover)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:bg-surface-btn-hover:hover {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-hover)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:text-content:hover {\\n --tw-text-opacity:1;\\n color: rgb(var(--content)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:text-content-tertiary:hover {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-tertiary)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .focus\\\\:outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.hypurr-connect .disabled\\\\:cursor-not-allowed:disabled {\\n cursor: not-allowed;\\n}\\n.hypurr-connect .disabled\\\\:opacity-40:disabled {\\n opacity: .4;\\n}\\n.hypurr-connect .disabled\\\\:opacity-50:disabled {\\n opacity: .5;\\n}\\n\")","import {\n ExchangeClient,\n HttpTransport,\n type IRequestTransport,\n} from \"@hfunlabs/hyperliquid\";\nimport {\n signUserSignedAction,\n type AbstractViemLocalAccount,\n} from \"@hfunlabs/hyperliquid/signing\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramUserResponse } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type {\n TelegramUser as HypurrTelegramUser,\n TelegramChatWalletPack,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n AGENT_NAME,\n clearAgent as clearStoredAgent,\n fetchAgentByAddress,\n fetchActiveAgent,\n generateAgentKey,\n isAgentValid,\n isDeadAgentError,\n loadAgent,\n saveAgent,\n} from \"./agent\";\nimport { createStaticClient, createTelegramClient } from \"./grpc\";\nimport { GrpcExchangeTransport } from \"./GrpcExchangeTransport\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\nimport { createTelegramAgentApprovalName } from \"./agentWallet\";\nimport type {\n AuthMethod,\n EoaSigner,\n EvmTransactionRequest,\n Hex,\n HypurrConnectConfig,\n HypurrConnectState,\n HypurrUser,\n RenewAgentWalletParams,\n SignTypedDataFn,\n StoredAgent,\n} from \"./types\";\n\n/** @internal context value — extends the public type with fields used only by library internals */\ninterface InternalConnectState extends HypurrConnectState {\n loginTelegram: () => void;\n}\n\nconst TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-jwt\";\nconst LEGACY_TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-user\";\nconst TELEGRAM_AUTH_STATE_KEY = \"hypurr-connect-auth-state\";\nconst TELEGRAM_AUTH_CODE_VERIFIER_PREFIX =\n \"hypurr-connect-auth-code-verifier:\";\nconst TELEGRAM_AUTH_RETURN_TO_PREFIX = \"hypurr-connect-auth-return-to:\";\nconst TELEGRAM_AUTH_MESSAGE = \"hypurr-connect:telegram-auth\";\nconst DEFAULT_AUTH_HUB_URL = \"https://auth.hypurr.fun/login\";\nconst DEFAULT_MEDIA_URL = \"https://media.hypurr.fun\";\nconst USER_SIGNED_DOMAIN_NAME = \"HyperliquidSignTransaction\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\nconst APPROVE_AGENT_PRIMARY_TYPE = \"HyperliquidTransaction:ApproveAgent\";\nconst APPROVE_AGENT_TYPES = {\n [APPROVE_AGENT_PRIMARY_TYPE]: [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\nconst EIP712_DOMAIN_TYPES = [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n];\nconst IGNORED_EXTERNAL_SIGNATURE =\n \"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b\" as const;\nconst DEFAULT_TELEGRAM_SCOPES = [\n \"telegram:user:read\",\n \"telegram:wallet:read\",\n \"telegram:wallet:write\",\n \"telegram:trade:read\",\n \"telegram:trade:write\",\n \"telegram:cabal:read\",\n \"telegram:cabal:write\",\n \"telegram:agent:write\",\n \"telegram:support:read\",\n \"telegram:support:write\",\n];\n\nfunction createExternalSigningWallet(address: Hex): AbstractViemLocalAccount {\n return {\n address,\n signTypedData(params) {\n void params;\n return Promise.resolve(IGNORED_EXTERNAL_SIGNATURE);\n },\n };\n}\n\nfunction isInvalidTelegramAuthError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n msg,\n );\n}\n\nfunction normalizeMediaUrl(mediaUrl?: string): string {\n return (mediaUrl?.trim() || DEFAULT_MEDIA_URL).replace(/\\/+$/, \"\");\n}\n\nfunction isAddress(value?: string | null): value is Hex {\n return !!value && /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\nfunction createApproveAgentAction(params: {\n agentAddress: Hex;\n agentName: string;\n chainId: number;\n isTestnet: boolean;\n}) {\n const nonce = Date.now();\n return {\n action: {\n type: \"approveAgent\" as const,\n signatureChainId: `0x${params.chainId.toString(16)}` as Hex,\n hyperliquidChain: (params.isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: params.agentAddress.toLowerCase() as Hex,\n agentName: params.agentName,\n nonce,\n },\n nonce,\n };\n}\n\ntype ApproveAgentAction = ReturnType<typeof createApproveAgentAction>[\"action\"];\n\nasync function signApproveAgentAction(params: {\n signTypedDataAsync: SignTypedDataFn;\n agentAddress: Hex;\n agentName: string;\n chainId: number;\n isTestnet: boolean;\n}): Promise<{\n action: ApproveAgentAction;\n signatureHex: Hex;\n}> {\n const { action } = createApproveAgentAction(params);\n const signatureHex = await params.signTypedDataAsync({\n domain: {\n name: USER_SIGNED_DOMAIN_NAME,\n version: \"1\",\n chainId: params.chainId,\n verifyingContract: ZERO_ADDRESS,\n },\n types: {\n EIP712Domain: EIP712_DOMAIN_TYPES,\n ...APPROVE_AGENT_TYPES,\n },\n primaryType: APPROVE_AGENT_PRIMARY_TYPE,\n message: {\n hyperliquidChain: action.hyperliquidChain,\n agentAddress: action.agentAddress,\n agentName: action.agentName,\n nonce: action.nonce,\n },\n });\n\n return {\n action,\n signatureHex,\n };\n}\n\nfunction getRawSignedTransaction(result: unknown): Hex | null {\n if (typeof result === \"string\" && result.startsWith(\"0x\")) {\n return result as Hex;\n }\n if (!result || typeof result !== \"object\") return null;\n\n const record = result as Record<string, unknown>;\n const candidates = [\n record.raw,\n record.rawTransaction,\n record.signedTransaction,\n record.serializedTransaction,\n record.result,\n ];\n const raw = candidates.find(\n (value): value is string =>\n typeof value === \"string\" && value.startsWith(\"0x\"),\n );\n return raw ? (raw as Hex) : null;\n}\n\nfunction decodeJsonBytes(bytes: Uint8Array): unknown {\n const text = new TextDecoder().decode(bytes);\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction encodeJsonBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(value));\n}\n\nfunction withExpectedFrom(\n transaction: EvmTransactionRequest,\n address: Hex,\n): EvmTransactionRequest {\n if (\n transaction.from &&\n transaction.from.toLowerCase() !== address.toLowerCase()\n ) {\n throw new Error(\n \"[HypurrConnect] EVM transaction `from` does not match the connected wallet.\",\n );\n }\n return transaction.from ? transaction : { ...transaction, from: address };\n}\n\nfunction currentReturnTo(): string {\n const url = new URL(window.location.href);\n for (const param of [\n \"code\",\n \"error\",\n \"error_description\",\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n url.searchParams.delete(param);\n }\n return url.toString();\n}\n\nfunction cleanAuthCallbackUrl(): void {\n const cleanUrl = new URL(window.location.href);\n for (const param of [\n \"code\",\n \"error\",\n \"error_description\",\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n cleanUrl.searchParams.delete(param);\n }\n window.history.replaceState({}, document.title, cleanUrl.toString());\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let value = \"\";\n for (const byte of bytes) {\n value += String.fromCharCode(byte);\n }\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction randomState(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\nfunction randomCodeVerifier(): string {\n const bytes = new Uint8Array(64);\n crypto.getRandomValues(bytes);\n return base64UrlEncode(bytes);\n}\n\nasync function createCodeChallenge(codeVerifier: string): Promise<string> {\n if (!crypto.subtle) {\n throw new Error(\n \"[HypurrConnect] Web Crypto API is required for Telegram auth.\",\n );\n }\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(codeVerifier),\n );\n return base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction normalizeScopes(scope?: string | string[]): string {\n if (Array.isArray(scope)) return scope.join(\" \");\n return scope?.trim() || DEFAULT_TELEGRAM_SCOPES.join(\" \");\n}\n\nfunction normalizeClientId(clientId: unknown): string {\n const normalized = typeof clientId === \"string\" ? clientId.trim() : \"\";\n if (!normalized) {\n throw new Error(\"[HypurrConnect] config.clientId is required.\");\n }\n return normalized;\n}\n\nfunction codeVerifierStorageKey(state: string): string {\n return `${TELEGRAM_AUTH_CODE_VERIFIER_PREFIX}${state}`;\n}\n\nfunction returnToStorageKey(state: string): string {\n return `${TELEGRAM_AUTH_RETURN_TO_PREFIX}${state}`;\n}\n\nfunction storeTelegramAuthSession(\n state: string,\n codeVerifier: string,\n returnTo: string,\n): void {\n const previousState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n if (previousState) {\n sessionStorage.removeItem(codeVerifierStorageKey(previousState));\n sessionStorage.removeItem(returnToStorageKey(previousState));\n }\n sessionStorage.setItem(TELEGRAM_AUTH_STATE_KEY, state);\n sessionStorage.setItem(codeVerifierStorageKey(state), codeVerifier);\n sessionStorage.setItem(returnToStorageKey(state), returnTo);\n}\n\nfunction clearTelegramAuthSession(state: string): void {\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(codeVerifierStorageKey(state));\n sessionStorage.removeItem(returnToStorageKey(state));\n}\n\nfunction takeTelegramAuthSession(state: string):\n | {\n codeVerifier: string | null;\n returnTo: string | null;\n }\n | null {\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || state !== expectedState) {\n if (expectedState) {\n sessionStorage.removeItem(codeVerifierStorageKey(expectedState));\n sessionStorage.removeItem(returnToStorageKey(expectedState));\n }\n return null;\n }\n\n const codeVerifierKey = codeVerifierStorageKey(state);\n const returnToKey = returnToStorageKey(state);\n const codeVerifier = sessionStorage.getItem(codeVerifierKey);\n const returnTo = sessionStorage.getItem(returnToKey);\n sessionStorage.removeItem(codeVerifierKey);\n sessionStorage.removeItem(returnToKey);\n return { codeVerifier, returnTo };\n}\n\nfunction fallbackAuthTokenUrl(authHubUrl?: string): string {\n const url = new URL(authHubUrl || DEFAULT_AUTH_HUB_URL);\n url.pathname = \"/oauth/token\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction authMetadataUrls(authHubUrl?: string): string[] {\n const authUrl = new URL(authHubUrl || DEFAULT_AUTH_HUB_URL);\n const urls = [\n new URL(\"/.well-known/oauth-authorization-server\", authUrl).toString(),\n new URL(\"/.well-known/openid-configuration\", authUrl).toString(),\n ];\n\n const authPath = authUrl.pathname.replace(/\\/+$/, \"\");\n const basePath = authPath.replace(/\\/[^/]*$/, \"\");\n if (basePath) {\n urls.push(\n new URL(\n `/.well-known/oauth-authorization-server${basePath}`,\n authUrl,\n ).toString(),\n );\n }\n\n return Array.from(new Set(urls));\n}\n\nasync function tokenUrlFromMetadata(\n authHubUrl?: string,\n): Promise<string | undefined> {\n for (const metadataUrl of authMetadataUrls(authHubUrl)) {\n try {\n const response = await fetch(metadataUrl, {\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) continue;\n const metadata = (await response.json()) as { token_endpoint?: unknown };\n const tokenEndpoint = metadata.token_endpoint;\n if (typeof tokenEndpoint === \"string\" && tokenEndpoint.trim()) {\n return tokenEndpoint.trim();\n }\n } catch {\n // Metadata discovery is best effort; fall back to the conventional route.\n }\n }\n\n return undefined;\n}\n\nasync function resolveAuthTokenUrl(authHubUrl?: string): Promise<string> {\n return (\n (await tokenUrlFromMetadata(authHubUrl)) || fallbackAuthTokenUrl(authHubUrl)\n );\n}\n\nfunction getTokenFromExchangeResponse(data: unknown): string | null {\n if (typeof data === \"string\") {\n const token = data.trim();\n return token || null;\n }\n if (typeof data !== \"object\" || data === null) return null;\n\n const response = data as {\n access_token?: unknown;\n jwt?: unknown;\n token?: unknown;\n };\n for (const token of [response.token, response.access_token, response.jwt]) {\n if (typeof token === \"string\" && token.trim()) return token.trim();\n }\n return null;\n}\n\nasync function exchangeTelegramAuthCode({\n authHubUrl,\n clientId,\n code,\n codeVerifier,\n returnTo,\n}: {\n authHubUrl?: string;\n clientId: string;\n code: string;\n codeVerifier: string;\n returnTo: string;\n}): Promise<string> {\n const body = new URLSearchParams({\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n grant_type: \"authorization_code\",\n return_to: returnTo,\n });\n\n const response = await fetch(await resolveAuthTokenUrl(authHubUrl), {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n },\n body,\n });\n const responseText = await response.text();\n\n if (!response.ok) {\n const detail = responseText.trim();\n throw new Error(\n detail\n ? `[HypurrConnect] Auth code exchange failed: ${detail}`\n : `[HypurrConnect] Auth code exchange failed with HTTP ${response.status}.`,\n );\n }\n\n let responseData: unknown = responseText;\n if (responseText) {\n try {\n responseData = JSON.parse(responseText) as unknown;\n } catch {\n responseData = responseText;\n }\n }\n\n const token = getTokenFromExchangeResponse(responseData);\n if (!token) {\n throw new Error(\"[HypurrConnect] Auth code exchange did not return a JWT.\");\n }\n return token;\n}\n\ntype TelegramAuthCallback = {\n type?: typeof TELEGRAM_AUTH_MESSAGE;\n state: string;\n token?: string;\n code?: string;\n error?: string;\n};\n\nfunction isTelegramAuthMessage(data: unknown): data is {\n type: typeof TELEGRAM_AUTH_MESSAGE;\n state: string;\n token?: string;\n code?: string;\n error?: string;\n} {\n if (typeof data !== \"object\" || data === null) return false;\n if (!(\"type\" in data) || !(\"state\" in data)) return false;\n const message = data as {\n type: unknown;\n state: unknown;\n token?: unknown;\n code?: unknown;\n error?: unknown;\n };\n const hasToken = typeof message.token === \"string\";\n const hasCode = typeof message.code === \"string\";\n const hasError = typeof message.error === \"string\";\n return (\n message.type === TELEGRAM_AUTH_MESSAGE &&\n typeof message.state === \"string\" &&\n (hasToken || hasCode || hasError)\n );\n}\n\nconst HypurrConnectContext = createContext<InternalConnectState | null>(null);\n\nexport function useHypurrConnect(): HypurrConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnect must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\n/** @internal — gives library components access to fields not on the public API */\nexport function useHypurrConnectInternal(): InternalConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnectInternal must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\nexport function HypurrConnectProvider({\n config,\n children,\n}: {\n config: HypurrConnectConfig;\n children: ReactNode;\n}) {\n const tgClient = useMemo(() => createTelegramClient(config), [config]);\n const staticClient = useMemo(() => createStaticClient(config), [config]);\n\n // ── Telegram auth state ──────────────────────────────────────\n const [tgAuthToken, setTgAuthToken] = useState<string | null>(() => {\n try {\n return localStorage.getItem(TELEGRAM_STORAGE_KEY);\n } catch {\n return null;\n }\n });\n const [tgUser, setTgUser] = useState<HypurrTelegramUser | null>(null);\n const [tgLoading, setTgLoading] = useState(false);\n const [tgError, setTgError] = useState<string | null>(null);\n\n const authDataMap = useMemo(() => ({}), []);\n const telegramRpcOptions = useMemo<RpcOptions | undefined>(\n () =>\n tgAuthToken\n ? { meta: { authorization: `Bearer ${tgAuthToken}` } }\n : undefined,\n [tgAuthToken],\n );\n\n const [tgUserTick, setTgUserTick] = useState(0);\n\n // Auto-disconnect when the server rejects telegram auth data.\n const onInvalidAuthRef = useRef<(() => void) | null>(null);\n onInvalidAuthRef.current = () => {\n console.warn(\n \"[HypurrConnect] Invalid Telegram auth token — disconnecting.\",\n );\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n };\n\n const acceptTelegramToken = useCallback((token: string) => {\n setTgAuthToken(token);\n setTgError(null);\n localStorage.setItem(TELEGRAM_STORAGE_KEY, token);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n const handleTelegramAuthCallback = useCallback(\n (callback: TelegramAuthCallback) => {\n const authSession = takeTelegramAuthSession(callback.state);\n if (!authSession) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n if (callback.error) {\n setTgError(callback.error);\n return;\n }\n\n if (callback.code) {\n if (!authSession.codeVerifier) {\n setTgError(\"Missing auth code verifier.\");\n return;\n }\n\n setTgLoading(true);\n setTgError(null);\n void exchangeTelegramAuthCode({\n authHubUrl: config.telegram?.authHubUrl,\n clientId: normalizeClientId(config.clientId),\n code: callback.code,\n codeVerifier: authSession.codeVerifier,\n returnTo: authSession.returnTo || currentReturnTo(),\n })\n .then(acceptTelegramToken)\n .catch((err) =>\n setTgError(err instanceof Error ? err.message : String(err)),\n )\n .finally(() => setTgLoading(false));\n return;\n }\n\n if (callback.token) {\n acceptTelegramToken(callback.token);\n return;\n }\n\n setTgError(\"Invalid auth callback.\");\n },\n [\n acceptTelegramToken,\n config.clientId,\n config.telegram?.authHubUrl,\n ],\n );\n\n // Eagerly fetch the modal fonts on mount. They're declared via @import in the\n // injected stylesheet but browsers only fetch a webfont when visible text\n // first uses it — that lazy fetch makes scores/labels flash the system\n // fallback and render inconsistently across views. Loading them up front\n // keeps the bold mono numbers consistent.\n useEffect(() => {\n if (typeof document === \"undefined\" || !document.fonts) return;\n for (const face of [\n \"500 1em 'Google Sans Code'\",\n \"700 1em 'Google Sans Code'\",\n \"600 1em Inter\",\n \"700 1em Inter\",\n ]) {\n void document.fonts.load(face).catch(() => {});\n }\n }, []);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\");\n const code = params.get(\"code\");\n const error =\n params.get(\"error_description\") || params.get(\"error\") || undefined;\n if (!token && !code && !error) {\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n return;\n }\n\n const callbackState = params.get(\"state\") ?? \"\";\n const callback = {\n code: code || undefined,\n error,\n state: callbackState,\n token: token || undefined,\n type: TELEGRAM_AUTH_MESSAGE,\n } satisfies TelegramAuthCallback;\n\n if (window.opener && window.opener !== window) {\n window.opener.postMessage(callback, window.location.origin);\n window.close();\n return;\n }\n\n cleanAuthCallbackUrl();\n handleTelegramAuthCallback(callback);\n }, [handleTelegramAuthCallback]);\n\n useEffect(() => {\n function onMessage(event: MessageEvent) {\n if (event.origin !== window.location.origin) return;\n if (!isTelegramAuthMessage(event.data)) return;\n\n handleTelegramAuthCallback(event.data);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleTelegramAuthCallback]);\n\n useEffect(() => {\n if (!tgAuthToken || !telegramRpcOptions) return;\n let cancelled = false;\n setTgLoading(true);\n setTgError(null);\n\n (async () => {\n try {\n const [{ response: userResp }, { response: walletsResp }] =\n await Promise.all([\n tgClient.telegramUser({ authData: {} }, telegramRpcOptions),\n tgClient.telegramUserWallets({ authData: {} }, telegramRpcOptions),\n ]);\n if (cancelled) return;\n const user = (userResp as TelegramUserResponse).user ?? null;\n if (user) {\n // TelegramUser.wallets lacks twap/scale sessions; replace with\n // the full wallets from TelegramUserWallets which populates them.\n user.wallets = walletsResp.wallets;\n }\n setTgUser(user);\n } catch (err) {\n if (cancelled) return;\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n console.error(\"[HypurrConnect] gRPC TelegramUser failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n } finally {\n if (!cancelled) setTgLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [tgAuthToken, telegramRpcOptions, tgClient, tgUserTick]);\n\n // ── EOA auth state ───────────────────────────────────────────\n const [eoaAddress, setEoaAddress] = useState<`0x${string}` | null>(null);\n const [agent, setAgent] = useState<StoredAgent | null>(null);\n const [eoaLoading, setEoaLoading] = useState(false);\n const [eoaError, setEoaError] = useState<string | null>(null);\n const eoaSignerRef = useRef<EoaSigner | null>(null);\n\n // ── Derived auth ─────────────────────────────────────────────\n const authMethod: AuthMethod = tgAuthToken\n ? \"telegram\"\n : eoaAddress\n ? \"eoa\"\n : null;\n\n // ── Multi-wallet state (Telegram) ─────────────────────────────\n const [wallets, setWallets] = useState<HyperliquidWallet[]>([]);\n const [selectedWalletId, setSelectedWalletId] = useState<number>(0);\n const [packs, setPacks] = useState<TelegramChatWalletPack[]>([]);\n\n const refreshWallets = useCallback(() => setTgUserTick((t) => t + 1), []);\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !tgUser) {\n setWallets([]);\n setSelectedWalletId(0);\n setPacks([]);\n return;\n }\n\n const userWallets = tgUser.wallets ?? [];\n setWallets(userWallets);\n setPacks(tgUser.packs ?? []);\n\n const defaultId = tgUser.walletId || userWallets[0]?.id || 0;\n setSelectedWalletId((prev) => {\n if (prev && userWallets.some((w) => w.id === prev)) return prev;\n return defaultId;\n });\n }, [authMethod, tgUser]);\n\n const selectedWallet = useMemo(\n () => wallets.find((w) => w.id === selectedWalletId) ?? wallets[0] ?? null,\n [wallets, selectedWalletId],\n );\n\n const selectWallet = useCallback(\n (walletId: number) => {\n if (wallets.some((w) => w.id === walletId)) {\n setSelectedWalletId(walletId);\n }\n },\n [wallets],\n );\n\n // ── Session poller (TWAP + Scale for selected wallet) ──────\n const pollInterval = config.sessionPollInterval ?? 5_000;\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !selectedWalletId || !pollInterval) return;\n\n let cancelled = false;\n\n const poll = async () => {\n try {\n const [{ response: twapResp }, { response: scaleResp }] =\n await Promise.all([\n tgClient.hyperliquidWalletTwapSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n tgClient.hyperliquidWalletScaleSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n ]);\n if (cancelled) return;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: twapResp.sessions,\n scaleSessions: scaleResp.sessions,\n }\n : w,\n ),\n );\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n // Silently ignore poll errors — next tick will retry.\n }\n };\n\n // Fire immediately on mount / wallet switch, then on interval.\n poll();\n const id = setInterval(poll, pollInterval);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [\n authMethod,\n selectedWalletId,\n pollInterval,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const user = useMemo<HypurrUser | null>(() => {\n if (tgAuthToken && authMethod === \"telegram\" && selectedWallet && tgUser) {\n const mediaUrl = normalizeMediaUrl(config.mediaUrl);\n return {\n address: selectedWallet.ethereumAddress,\n walletId: selectedWallet.id,\n displayName: tgUser.telegramUsername\n ? `@${tgUser.telegramUsername}`\n : `Telegram ${tgUser.telegramId}`,\n photoUrl: (() => {\n // `pictureFileId` is read at runtime; the schema may not type it.\n const fileId = (tgUser as unknown as { pictureFileId?: string })\n .pictureFileId;\n return fileId ? `${mediaUrl}/${fileId}` : undefined;\n })(),\n authMethod: \"telegram\",\n telegramId: String(tgUser.telegramId),\n hfunScore: tgUser?.reputation?.hfunScore,\n reputationScore: tgUser?.reputation?.reputationScore,\n addressBook: tgUser.addressBook,\n };\n }\n if (eoaAddress && authMethod === \"eoa\") {\n return {\n address: eoaAddress,\n walletId: 0,\n displayName: `${eoaAddress.slice(0, 6)}...${eoaAddress.slice(-4)}`,\n authMethod: \"eoa\",\n };\n }\n return null;\n }, [\n tgAuthToken,\n selectedWallet,\n eoaAddress,\n authMethod,\n tgUser,\n config.mediaUrl,\n ]);\n\n // ── Exchange client ──────────────────────────────────────────\n // Telegram: dummy local wallet → GrpcExchangeTransport → HyperliquidCoreAction (server signs)\n // EOA: dual wallet — agent key for L1 actions, master signer for user-signed\n // actions (transfers, withdrawals, etc.). The dual wallet inspects the\n // EIP-712 domain name to decide which key signs each request.\n // When a signer is available but no agent exists yet, the dual wallet\n // auto-provisions an agent on the first L1 action (triggers one extra\n // wallet popup for the approveAgent user-signed action).\n\n const onDeadAgentRef = useRef<((address: `0x${string}`) => void) | null>(\n null,\n );\n onDeadAgentRef.current = (addr: `0x${string}`) => {\n clearStoredAgent(addr);\n setAgent(null);\n setEoaError(\"Agent expired or was deregistered. Please reconnect.\");\n };\n\n // Mutable slot for the agent signer — the dual wallet reads this so it can\n // pick up a newly provisioned agent without waiting for a React re-render.\n const agentSignerRef = useRef<PrivateKeySigner | null>(\n agent ? new PrivateKeySigner(agent.privateKey) : null,\n );\n useEffect(() => {\n agentSignerRef.current = agent\n ? new PrivateKeySigner(agent.privateKey)\n : null;\n }, [agent]);\n\n // Lock to prevent concurrent auto-provisioning attempts\n const provisioningRef = useRef<Promise<PrivateKeySigner> | null>(null);\n\n const agentReady =\n authMethod === \"telegram\" || (authMethod === \"eoa\" && !!agent);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const exchange = useMemo<ExchangeClient<any> | null>(() => {\n if (authMethod === \"telegram\" && user?.address) {\n const transport = new GrpcExchangeTransport({\n isTestnet: config.isTestnet ?? false,\n telegramClient: tgClient,\n rpcOptions: telegramRpcOptions,\n walletId: user.walletId,\n onAuthError: () => onInvalidAuthRef.current?.(),\n });\n return new ExchangeClient({\n transport,\n wallet: createExternalSigningWallet(user.address as Hex),\n });\n }\n\n if (authMethod === \"eoa\" && eoaAddress) {\n const hasSigner = !!eoaSignerRef.current;\n\n if (!agent && !hasSigner) {\n const noAgentTransport: IRequestTransport = {\n isTestnet: config.isTestnet ?? false,\n request(): Promise<never> {\n throw new Error(\n \"[HypurrConnect] No agent key approved and no wallet signer available. \" +\n \"Either call approveAgent(signTypedDataAsync) or pass a signer to \" +\n \"connectEoa(address, { signTypedData, chainId }).\",\n );\n },\n };\n return new ExchangeClient({\n transport: noAgentTransport,\n wallet: createExternalSigningWallet(eoaAddress),\n });\n }\n\n const isTestnet = config.isTestnet ?? false;\n const inner = new HttpTransport({ isTestnet });\n const deadAgentAddr = eoaAddress;\n const guardedTransport: IRequestTransport = {\n isTestnet: inner.isTestnet,\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n try {\n return await inner.request<T>(endpoint, payload, signal);\n } catch (err) {\n if (endpoint === \"exchange\" && isDeadAgentError(err)) {\n onDeadAgentRef.current?.(deadAgentAddr);\n }\n throw err;\n }\n },\n };\n\n const signerRef = eoaSignerRef;\n const agentRef = agentSignerRef;\n const provRef = provisioningRef;\n const ownerAddress = eoaAddress;\n\n /**\n * Auto-provision an agent key when one doesn't exist yet.\n *\n * Bypasses the SDK's `executeUserSignedAction` (and its per-address\n * semaphore) to avoid deadlocking when called from inside\n * `dualWallet.signTypedData`, which is already inside the SDK's\n * `executeL1Action` lock for the same address.\n */\n const ensureAgent = async (): Promise<PrivateKeySigner> => {\n const existing = agentRef.current;\n if (existing) return existing;\n\n if (provRef.current) return provRef.current;\n\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available to auto-provision agent. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n\n provRef.current = (async () => {\n try {\n const { privateKey, address: agentAddress } =\n await generateAgentKey();\n\n const chainIdHex =\n `0x${signer.chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signer.signTypedData(params);\n },\n getAddresses: async () => [ownerAddress] as `0x${string}`[],\n getChainId: async () => signer.chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api-ui.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(ownerAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(ownerAddress, stored);\n\n const newSigner = new PrivateKeySigner(privateKey);\n agentRef.current = newSigner;\n setAgent(stored);\n\n return newSigner;\n } finally {\n provRef.current = null;\n }\n })();\n\n return provRef.current;\n };\n\n // Dual wallet: routes signing based on the EIP-712 domain.\n // \"Exchange\" domain → L1 action → agent key signs (auto-provisions if needed).\n // \"HyperliquidSignTransaction\" domain → user-signed → master wallet (popup).\n const dualWallet: AbstractViemLocalAccount = {\n address: ownerAddress,\n async signTypedData(params): Promise<`0x${string}`> {\n if (params.domain.name === \"HyperliquidSignTransaction\") {\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available for user-signed actions. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n return signer.signTypedData(\n params as Parameters<typeof signer.signTypedData>[0],\n );\n }\n\n const agentSigner = await ensureAgent();\n return agentSigner.signTypedData(params);\n },\n };\n\n return new ExchangeClient({\n transport: guardedTransport,\n wallet: dualWallet,\n signatureChainId: () => {\n const id = signerRef.current?.chainId ?? 42161;\n return `0x${id.toString(16)}` as `0x${string}`;\n },\n });\n }\n\n return null;\n }, [\n authMethod,\n user,\n agent,\n eoaAddress,\n config.isTestnet,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const handleClearAgent = useCallback(() => {\n if (eoaAddress) {\n clearStoredAgent(eoaAddress);\n setAgent(null);\n }\n }, [eoaAddress]);\n\n const signEvmTransaction = useCallback(\n async (transaction: EvmTransactionRequest): Promise<Hex> => {\n if (authMethod === \"eoa\") {\n if (!eoaAddress) {\n throw new Error(\"[HypurrConnect] No EOA wallet connected.\");\n }\n\n const signer = eoaSignerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No EOA signer available. Pass a signer to connectEoa(address, signer).\",\n );\n }\n\n const tx = withExpectedFrom(transaction, eoaAddress);\n const result = signer.signTransaction\n ? await signer.signTransaction(tx)\n : signer.request\n ? await signer.request({\n method: \"eth_signTransaction\",\n params: [tx],\n })\n : null;\n const rawTransaction = getRawSignedTransaction(result);\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] EOA signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n }\n\n if (authMethod === \"telegram\") {\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n if (!selectedWallet) {\n throw new Error(\"[HypurrConnect] No Telegram wallet selected.\");\n }\n if (\n selectedWallet.id <= 0 ||\n selectedWallet.isReadOnly ||\n selectedWallet.isAgent\n ) {\n throw new Error(\n \"[HypurrConnect] Select a Telegram private-key wallet to sign EVM transactions.\",\n );\n }\n if (!isAddress(selectedWallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Selected Telegram wallet does not have a valid EVM address.\",\n );\n }\n\n const tx = withExpectedFrom(\n transaction,\n selectedWallet.ethereumAddress,\n );\n try {\n const signResponse = await tgClient.eVMSignTransaction(\n {\n authData: {},\n walletId: selectedWallet.id,\n params: encodeJsonBytes(tx),\n },\n telegramRpcOptions,\n );\n const rawTransaction = getRawSignedTransaction(\n decodeJsonBytes(signResponse.response.result),\n );\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] Telegram signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n }\n throw err;\n }\n }\n\n throw new Error(\"[HypurrConnect] No wallet connected.\");\n },\n [authMethod, eoaAddress, selectedWallet, telegramRpcOptions, tgClient],\n );\n\n // ── Wallet management (Telegram only) ───────────────────────\n const createWallet = useCallback(\n async (name: string): Promise<HyperliquidWallet> => {\n const { response } = await tgClient.hyperliquidWalletCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n if (!response.wallet)\n throw new Error(\"Wallet creation returned no wallet\");\n return response.wallet;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const deleteWallet = useCallback(\n async (walletId: number): Promise<void> => {\n await tgClient.hyperliquidWalletDelete(\n {\n authData: {},\n walletId,\n },\n telegramRpcOptions,\n );\n if (walletId === selectedWalletId) {\n const remaining = wallets.filter((w) => w.id !== walletId);\n setSelectedWalletId(remaining[0]?.id ?? 0);\n }\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, selectedWalletId, wallets, refreshWallets],\n );\n\n const renameWallet = useCallback(\n async (walletId: number, name: string): Promise<void> => {\n await tgClient.hyperliquidWalletUpdate(\n {\n authData: {},\n walletId,\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const renewAgentWallet = useCallback(\n async ({\n walletId,\n ownerAddress,\n signTypedDataAsync,\n chainId,\n approvalDurationMs,\n agentName,\n }: RenewAgentWalletParams): Promise<void> => {\n if (authMethod !== \"telegram\") {\n throw new Error(\n \"[HypurrConnect] Agent wallet renewal is only available for Telegram wallets.\",\n );\n }\n if (!isAddress(ownerAddress)) {\n throw new Error(\n \"[HypurrConnect] Connect the owner EOA wallet before renewing this agent.\",\n );\n }\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n\n const wallet = wallets.find((w) => w.id === walletId);\n if (!wallet) {\n throw new Error(\"[HypurrConnect] Agent wallet not found.\");\n }\n if (!wallet.isAgent) {\n throw new Error(\n \"[HypurrConnect] Selected wallet is not an agent wallet.\",\n );\n }\n if (!isAddress(wallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Agent wallet does not have a valid owner EVM address.\",\n );\n }\n if (ownerAddress.toLowerCase() !== wallet.ethereumAddress.toLowerCase()) {\n throw new Error(\n \"[HypurrConnect] Connect the owner EOA for this agent wallet before renewing.\",\n );\n }\n\n const agentAddress = wallet.agentEthereumAddress?.value;\n if (!isAddress(agentAddress)) {\n throw new Error(\n \"[HypurrConnect] Agent wallet does not have a valid agent EVM address.\",\n );\n }\n\n const isTestnet = config.isTestnet ?? false;\n const approvalAgentName =\n agentName ?? createTelegramAgentApprovalName(approvalDurationMs);\n setTgError(null);\n\n try {\n const { action, signatureHex } = await signApproveAgentAction({\n signTypedDataAsync,\n agentAddress,\n agentName: approvalAgentName,\n chainId,\n isTestnet,\n });\n\n await tgClient.hyperliquidAgentWalletRenew(\n {\n authData: {},\n address: { value: wallet.ethereumAddress },\n signature: {\n agentAddress: action.agentAddress,\n agentName: action.agentName,\n nonce: action.nonce,\n chainId,\n signature: signatureHex,\n },\n },\n telegramRpcOptions,\n );\n\n const remote = await fetchAgentByAddress(\n ownerAddress,\n agentAddress,\n isTestnet,\n );\n if (remote && remote.validUntil <= Date.now()) {\n throw new Error(\n \"[HypurrConnect] Agent renewal was submitted, but the agent is still expired.\",\n );\n }\n\n refreshWallets();\n } catch (err) {\n console.error(\"[HypurrConnect] Agent wallet renewal failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n throw err;\n }\n },\n [\n authMethod,\n config.isTestnet,\n refreshWallets,\n telegramRpcOptions,\n tgClient,\n wallets,\n ],\n );\n\n const createWalletPack = useCallback(\n async (name: string): Promise<number> => {\n const { response } = await tgClient.telegramChatWalletPackCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n return response.packId;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const addPackLabel = useCallback(\n async (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelAdd(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const modifyPackLabel = useCallback(\n async (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelModify(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const removePackLabel = useCallback(\n async (params: { walletLabel: string; packId: number }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelRemove(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n // ── TWAP session management (Telegram only) ─────────────────\n const createTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"TWAP creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, twapSessions: [...w.twapSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const modifyTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapModify>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapModify(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session) throw new Error(\"TWAP modify returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.map((s) =>\n s.id === session.id ? session : s,\n ),\n }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelTwap = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidTwapCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n twapSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.filter((s) => s.id !== sessionId),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Scale session management (Telegram only) ───────────────\n const createScale = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidScaleCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidScaleCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"Scale creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, scaleSessions: [...w.scaleSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelScale = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidScaleCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n scaleSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n scaleSessions: w.scaleSessions.filter(\n (s) => s.id !== sessionId,\n ),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Login modal state ────────────────────────────────────────\n const [loginModalOpen, setLoginModalOpen] = useState(false);\n const openLoginModal = useCallback(() => setLoginModalOpen(true), []);\n const closeLoginModal = useCallback(() => setLoginModalOpen(false), []);\n\n // ── Auth actions ─────────────────────────────────────────────\n const loginTelegram = useCallback(() => {\n const state = randomState();\n const codeVerifier = randomCodeVerifier();\n\n const configuredReturnTo = config.telegram?.returnTo;\n const returnTo =\n typeof configuredReturnTo === \"function\"\n ? configuredReturnTo()\n : configuredReturnTo || currentReturnTo();\n storeTelegramAuthSession(state, codeVerifier, returnTo);\n\n const width = 520;\n const height = 720;\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\n const popup = window.open(\n \"about:blank\",\n \"hypurr_telegram_auth\",\n [\n `width=${width}`,\n `height=${height}`,\n `left=${Math.round(left)}`,\n `top=${Math.round(top)}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n ].join(\",\"),\n );\n\n void (async () => {\n try {\n const authUrl = new URL(\n config.telegram?.authHubUrl || DEFAULT_AUTH_HUB_URL,\n );\n authUrl.searchParams.set(\n \"client_id\",\n normalizeClientId(config.clientId),\n );\n authUrl.searchParams.set(\"return_to\", returnTo);\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\n \"scope\",\n normalizeScopes(config.telegram?.scope),\n );\n authUrl.searchParams.set(\n \"code_challenge\",\n await createCodeChallenge(codeVerifier),\n );\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n if (popup) {\n popup.location.assign(authUrl.toString());\n popup.focus();\n return;\n }\n\n window.location.assign(authUrl.toString());\n } catch (err) {\n clearTelegramAuthSession(state);\n if (popup && !popup.closed) popup.close();\n setTgError(err instanceof Error ? err.message : String(err));\n }\n })();\n }, [\n config.clientId,\n config.telegram?.authHubUrl,\n config.telegram?.returnTo,\n config.telegram?.scope,\n ]);\n\n const connectEoa = useCallback(\n (address: `0x${string}`, signer?: EoaSigner) => {\n eoaSignerRef.current = signer ?? null;\n setEoaAddress(address);\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n setEoaError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n\n const existing = loadAgent(address);\n if (existing && existing.validUntil > Date.now()) {\n setAgent(existing);\n } else {\n if (existing) clearStoredAgent(address);\n setAgent(null);\n }\n },\n [],\n );\n\n const approveAgentFn = useCallback(\n async (signTypedDataAsync: SignTypedDataFn, chainId: number) => {\n if (!eoaAddress) {\n throw new Error(\n \"[HypurrConnect] Cannot approve agent: no EOA wallet connected. Call connectEoa(address) first.\",\n );\n }\n\n const currentSigner = eoaSignerRef.current;\n eoaSignerRef.current = {\n signTypedData: signTypedDataAsync,\n signTransaction: currentSigner?.signTransaction,\n request: currentSigner?.request,\n chainId,\n };\n\n setEoaLoading(true);\n setEoaError(null);\n try {\n const existing = loadAgent(eoaAddress);\n if (existing) {\n const isTestnet = config.isTestnet ?? false;\n const valid = await isAgentValid(existing, eoaAddress, isTestnet);\n if (valid) {\n setAgent(existing);\n return;\n }\n clearStoredAgent(eoaAddress);\n }\n\n const { privateKey, address: agentAddress } = await generateAgentKey();\n const isTestnet = config.isTestnet ?? false;\n\n const chainIdHex = `0x${chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signTypedDataAsync(params);\n },\n getAddresses: async () => [eoaAddress] as `0x${string}`[],\n getChainId: async () => chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(eoaAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(eoaAddress, stored);\n setAgent(stored);\n } catch (err) {\n console.error(\"[HypurrConnect] EOA agent approval failed:\", err);\n setEoaError(err instanceof Error ? err.message : String(err));\n setAgent(null);\n } finally {\n setEoaLoading(false);\n }\n },\n [eoaAddress, config.isTestnet],\n );\n\n const logout = useCallback(() => {\n setTgUser(null);\n setTgError(null);\n setTgAuthToken(null);\n setEoaAddress(null);\n setAgent(null);\n setEoaError(null);\n eoaSignerRef.current = null;\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n // ── Context value ────────────────────────────────────────────\n const value = useMemo<InternalConnectState>(\n () => ({\n user,\n isLoggedIn: !!user,\n isLoading: tgLoading || eoaLoading,\n error: tgError ?? eoaError,\n authMethod,\n exchange,\n\n wallets,\n selectedWalletId,\n selectWallet,\n\n createWallet,\n deleteWallet,\n renameWallet,\n renewAgentWallet,\n refreshWallets,\n\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n\n createTwap,\n modifyTwap,\n cancelTwap,\n\n createScale,\n cancelScale,\n\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgent: approveAgentFn,\n logout,\n\n agent,\n agentReady,\n clearAgent: handleClearAgent,\n\n authDataMap,\n authToken: tgAuthToken,\n telegramRpcOptions,\n telegramClient: tgClient,\n staticClient,\n }),\n [\n user,\n tgLoading,\n eoaLoading,\n tgError,\n eoaError,\n authMethod,\n exchange,\n wallets,\n selectedWalletId,\n selectWallet,\n createWallet,\n deleteWallet,\n renameWallet,\n renewAgentWallet,\n refreshWallets,\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n createTwap,\n modifyTwap,\n cancelTwap,\n createScale,\n cancelScale,\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgentFn,\n logout,\n agent,\n agentReady,\n handleClearAgent,\n authDataMap,\n tgAuthToken,\n telegramRpcOptions,\n tgClient,\n staticClient,\n ],\n );\n\n return (\n <HypurrConnectContext.Provider value={value}>\n {children}\n </HypurrConnectContext.Provider>\n );\n}\n","import type { AbstractViemLocalAccount } from \"@hfunlabs/hyperliquid/signing\";\nimport { privateKeyToAccount, type PrivateKeyAccount } from \"viem/accounts\";\nimport type { Hex } from \"./types\";\n\ntype SignTypedDataParams = Parameters<\n AbstractViemLocalAccount[\"signTypedData\"]\n>[0];\n\n/**\n * Compatibility wrapper for SDK versions that removed PrivateKeySigner.\n *\n * It exposes the viem local-account shape accepted by the Hyperliquid SDK.\n */\nexport class PrivateKeySigner implements AbstractViemLocalAccount {\n #account: PrivateKeyAccount;\n readonly address: Hex;\n\n constructor(privateKey: string) {\n this.#account = privateKeyToAccount(normalizePrivateKey(privateKey));\n this.address = this.#account.address;\n }\n\n signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return this.#account.signTypedData(\n params as Parameters<PrivateKeyAccount[\"signTypedData\"]>[0],\n );\n }\n}\n\nfunction normalizePrivateKey(privateKey: string): Hex {\n return (privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`) as Hex;\n}\n","import type { StoredAgent } from \"./types\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\n\nexport const AGENT_NAME = \"hypurr-connect\";\n\nconst AGENT_STORAGE_PREFIX = \"hypurr-connect-agent\";\n\nfunction storageKey(masterAddress: string): string {\n return `${AGENT_STORAGE_PREFIX}:${masterAddress.toLowerCase()}`;\n}\n\nexport function loadAgent(masterAddress: string): StoredAgent | null {\n try {\n const raw = localStorage.getItem(storageKey(masterAddress));\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nexport function saveAgent(masterAddress: string, agent: StoredAgent): void {\n localStorage.setItem(storageKey(masterAddress), JSON.stringify(agent));\n}\n\nexport function clearAgent(masterAddress: string): void {\n localStorage.removeItem(storageKey(masterAddress));\n}\n\n/**\n * Generate a random 32-byte private key and derive its address using the\n * local PrivateKeySigner compatibility wrapper.\n */\nexport async function generateAgentKey(): Promise<{\n privateKey: `0x${string}`;\n address: `0x${string}`;\n}> {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const privateKey = `0x${hex}` as `0x${string}`;\n\n const signer = new PrivateKeySigner(privateKey);\n return { privateKey, address: signer.address };\n}\n\ninterface ExtraAgent {\n address: string;\n name: string;\n validUntil: number;\n}\n\nfunction isNamedAgent(agent: ExtraAgent): boolean {\n return agent.name.replace(/ valid_until \\d+$/, \"\") === AGENT_NAME;\n}\n\nasync function fetchExtraAgents(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent[]> {\n const url = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/info\"\n : \"https://api.hyperliquid.xyz/info\";\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type: \"extraAgents\", user: userAddress }),\n });\n\n if (!res.ok) return [];\n\n const agents: unknown = await res.json();\n if (!Array.isArray(agents)) return [];\n\n return (agents as ExtraAgent[]).map((agent) => ({\n ...agent,\n validUntil: agent.validUntil * 1000,\n }));\n}\n\n/**\n * Query the Hyperliquid info API for the named agents registered to a user.\n * Returns the matching entry for AGENT_NAME if it exists and is still valid.\n */\nexport async function fetchActiveAgent(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const nowMs = Date.now();\n const agents = await fetchExtraAgents(userAddress, isTestnet);\n const match = agents.find((a) => isNamedAgent(a) && a.validUntil > nowMs);\n if (!match) return null;\n return match;\n}\n\nexport async function fetchAgentByAddress(\n userAddress: string,\n agentAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const agents = await fetchExtraAgents(userAddress, isTestnet);\n return (\n agents.find(\n (agent) => agent.address.toLowerCase() === agentAddress.toLowerCase(),\n ) ?? null\n );\n}\n\n/**\n * Checks whether a stored agent is still valid: the address must appear in the\n * on-chain `extraAgents` list and not be expired.\n */\nexport async function isAgentValid(\n stored: StoredAgent,\n userAddress: string,\n isTestnet: boolean,\n): Promise<boolean> {\n if (stored.validUntil <= Date.now()) return false;\n\n const remote = await fetchActiveAgent(userAddress, isTestnet);\n if (!remote) return false;\n\n return (\n remote.address.toLowerCase() === stored.address.toLowerCase() &&\n remote.validUntil > Date.now()\n );\n}\n\nconst DEAD_AGENT_PATTERNS = [\n /agent address .+ is not valid/i,\n /unknown signer/i,\n /not authorized/i,\n /not an agent/i,\n];\n\n/**\n * Returns true if the error indicates the agent has been pruned, expired,\n * or is otherwise no longer registered on-chain.\n */\nexport function isDeadAgentError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return DEAD_AGENT_PATTERNS.some((p) => p.test(msg));\n}\n","import { GrpcWebFetchTransport } from \"@protobuf-ts/grpcweb-transport\";\nimport { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type { HypurrConnectConfig } from \"./types\";\n\nconst DEFAULT_GRPC_URL = \"https://grpc.hypurr.fun\";\n\nfunction resolveGrpcUrl(config: HypurrConnectConfig): string {\n return config.grpcUrl?.trim() || DEFAULT_GRPC_URL;\n}\n\nfunction createTransport(config: HypurrConnectConfig) {\n return new GrpcWebFetchTransport({\n baseUrl: resolveGrpcUrl(config),\n timeout: config.grpcTimeout ?? 15_000,\n });\n}\n\nexport function createTelegramClient(\n config: HypurrConnectConfig,\n): TelegramClient {\n return new TelegramClient(createTransport(config));\n}\n\nexport function createStaticClient(config: HypurrConnectConfig): StaticClient {\n return new StaticClient(createTransport(config));\n}\n","import type { IRequestTransport } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\n\nexport interface GrpcExchangeTransportConfig {\n isTestnet?: boolean;\n telegramClient: TelegramClient;\n rpcOptions?: RpcOptions;\n walletId: number;\n onAuthError?: () => void;\n}\n\ninterface ExchangePayload {\n action: { type: string; [key: string]: unknown };\n nonce: number;\n signature?: { r: string; s: string; v: number };\n vaultAddress?: string | null;\n}\n\n/**\n * Routes exchange requests through the Hypurr gRPC backend (HyperliquidCoreAction)\n * for server-side signing. The backend handles signature generation.\n *\n * The SDK-generated nonce is forwarded; the action payload is JSON-encoded as bytes.\n * Info/explorer requests are proxied directly to the Hyperliquid HTTP API.\n */\nexport class GrpcExchangeTransport implements IRequestTransport {\n isTestnet: boolean;\n private telegramClient: TelegramClient;\n private rpcOptions?: RpcOptions;\n private walletId: number;\n private infoUrl: string;\n private onAuthError?: () => void;\n\n constructor(config: GrpcExchangeTransportConfig) {\n this.isTestnet = config.isTestnet ?? false;\n this.telegramClient = config.telegramClient;\n this.rpcOptions = config.rpcOptions;\n this.walletId = config.walletId;\n this.onAuthError = config.onAuthError;\n this.infoUrl = this.isTestnet\n ? \"https://api.hyperliquid-testnet.xyz\"\n : \"https://api.hyperliquid.xyz\";\n }\n\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n if (endpoint === \"exchange\") {\n return this.exchangeViaGrpc<T>(payload as ExchangePayload, signal);\n }\n return this.directRequest<T>(endpoint, payload, signal);\n }\n\n private async exchangeViaGrpc<T>(\n payload: ExchangePayload,\n signal?: AbortSignal,\n ): Promise<T> {\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const actionBytes = new TextEncoder().encode(\n JSON.stringify(payload.action),\n );\n\n console.debug(\"[GrpcExchangeTransport] sending action:\", payload.action);\n\n let response;\n try {\n ({ response } = await this.telegramClient.hyperliquidCoreAction(\n {\n authData: {},\n walletId: this.walletId,\n action: actionBytes,\n nonce: payload.nonce || Date.now(),\n },\n this.rpcOptions,\n ));\n } catch (err) {\n if (\n this.onAuthError &&\n err instanceof Error &&\n /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n err.message,\n )\n ) {\n this.onAuthError();\n }\n throw err;\n }\n\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const { status, result, error } = response;\n\n console.debug(\n \"[GrpcExchangeTransport] gRPC status:\",\n status,\n \"error:\",\n error,\n );\n\n if (error) {\n throw new Error(`GrpcExchangeTransport: ${error}`);\n }\n\n // The backend's `result` contains the raw Hyperliquid API JSON response.\n // The SDK's assertSuccessResponse expects the same shape as the HTTP API,\n // e.g. { status: \"ok\", response: { type: \"order\", data: { statuses: [...] } } }\n if (result && result.length > 0) {\n const parsed = JSON.parse(new TextDecoder().decode(result));\n console.debug(\"[GrpcExchangeTransport] parsed result:\", parsed);\n return parsed as T;\n }\n\n // Fallback: return a minimal success shape if no result bytes\n return { status: \"ok\", response: status } as T;\n }\n\n private async directRequest<T>(\n endpoint: string,\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const res = await fetch(`${this.infoUrl}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n }\n\n return (await res.json()) as T;\n }\n}\n","import type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\nconst MS_PER_SECOND = 1_000;\nconst NS_PER_MS = 1_000_000;\nconst MS_PER_DAY = 24 * 60 * 60 * 1_000;\nconst TELEGRAM_AGENT_APPROVAL_NAME = \"xyz\";\n\nexport interface AgentApprovalDurationOption {\n label: string;\n durationMs: number;\n}\n\nexport const DEFAULT_AGENT_APPROVAL_DURATION_MS = MS_PER_DAY;\n\nexport const AGENT_APPROVAL_DURATION_OPTIONS: AgentApprovalDurationOption[] = [\n { label: \"1 day\", durationMs: MS_PER_DAY },\n { label: \"7 days\", durationMs: 7 * MS_PER_DAY },\n { label: \"30 days\", durationMs: 30 * MS_PER_DAY },\n { label: \"90 days\", durationMs: 90 * MS_PER_DAY },\n];\n\ntype TimestampLike =\n | {\n seconds?: number | string | bigint;\n nanos?: number | string | bigint;\n }\n | string\n | number\n | Date;\n\nfunction toFiniteNumber(value: number | string | bigint | undefined): number {\n if (value === undefined) return 0;\n const numeric = typeof value === \"bigint\" ? Number(value) : Number(value);\n return Number.isFinite(numeric) ? numeric : 0;\n}\n\nexport function normalizeAgentApprovalDurationMs(durationMs?: number): number {\n return typeof durationMs === \"number\" &&\n Number.isFinite(durationMs) &&\n durationMs > 0\n ? durationMs\n : DEFAULT_AGENT_APPROVAL_DURATION_MS;\n}\n\nexport function createTelegramAgentApprovalName(durationMs?: number): string {\n const expiresAt = Date.now() + normalizeAgentApprovalDurationMs(durationMs);\n return `${TELEGRAM_AGENT_APPROVAL_NAME} valid_until ${expiresAt}`;\n}\n\ntype WalletWithAgentExpiry = Pick<HyperliquidWallet, \"isAgent\"> & {\n agentExpiresAt?: unknown;\n};\n\nexport function agentExpiresAtMs(wallet: WalletWithAgentExpiry): number | null {\n if (!wallet.isAgent || !wallet.agentExpiresAt) return null;\n\n const timestamp = wallet.agentExpiresAt as TimestampLike;\n if (timestamp instanceof Date) return timestamp.getTime();\n if (typeof timestamp === \"number\") return timestamp;\n if (typeof timestamp === \"string\") {\n const parsed = Date.parse(timestamp);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n const seconds = toFiniteNumber(timestamp.seconds);\n const nanos = toFiniteNumber(timestamp.nanos);\n const ms = seconds * MS_PER_SECOND + Math.floor(nanos / NS_PER_MS);\n return Number.isFinite(ms) && ms > 0 ? ms : null;\n}\n\nexport function formatAgentExpiry(expiresAtMs: number): string {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(new Date(expiresAtMs));\n}\n\nexport function getAgentExpiryTitle(\n wallet: WalletWithAgentExpiry,\n): string | null {\n const expiresAtMs = agentExpiresAtMs(wallet);\n if (!expiresAtMs || expiresAtMs > Date.now()) return null;\n\n const expiresAt = formatAgentExpiry(expiresAtMs);\n return `Agent approval expired ${expiresAt}. Connect the owner wallet to renew this agent.`;\n}\n","import {\n AnimatePresence,\n motion,\n useAnimationControls,\n type PanInfo,\n} from \"framer-motion\";\nimport { useCallback, type CSSProperties, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { useIsMobile } from \"./useIsMobile\";\nimport { MetaMaskColorIcon } from \"./icons/MetaMaskColorIcon\";\nimport { TelegramColorIcon } from \"./icons/TelegramColorIcon\";\n\nexport interface LoginModalProps {\n onConnectWallet: () => void;\n walletIcon?: ReactNode;\n /** CSS color used as the modal/drawer background. Defaults to `rgba(20,20,20,0.95)`. */\n backgroundColor?: string;\n}\n\nconst DEFAULT_BACKGROUND_COLOR = \"rgba(20,20,20,0.95)\";\n\nconst btnStyle: CSSProperties = {\n display: \"flex\",\n height: 53,\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n overflow: \"hidden\",\n borderRadius: 4,\n background: \"rgba(255,255,255,0.1)\",\n padding: \"4px 24px\",\n fontSize: 14,\n fontWeight: 500,\n letterSpacing: \"-0.03em\",\n color: \"#fff\",\n cursor: \"pointer\",\n border: \"none\",\n transition: \"background 150ms\",\n};\n\nconst btnHoverBg = { background: \"rgba(255,255,255,0.15)\" };\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 100,\n background: \"rgba(0,0,0,0.6)\",\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n};\n\nconst modalWrapperStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 101,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n};\n\nconst modalBoxStyle: CSSProperties = {\n display: \"flex\",\n width: 400,\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n overflow: \"hidden\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.1)\",\n padding: 24,\n};\n\nconst headingStyle: CSSProperties = {\n fontSize: 20,\n fontWeight: 500,\n letterSpacing: \"-0.03em\",\n color: \"#fff\",\n margin: 0,\n};\n\nconst dividerStyle: CSSProperties = {\n height: 1,\n width: \"100%\",\n background: \"rgba(255,255,255,0.05)\",\n};\n\nconst iconSize: CSSProperties = { width: 26, height: 26 };\n\nfunction HoverButton({\n onClick,\n children,\n}: {\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <motion.button\n type=\"button\"\n onClick={onClick}\n style={btnStyle}\n whileHover={btnHoverBg}\n >\n {children}\n </motion.button>\n );\n}\n\nexport function LoginModal({\n onConnectWallet,\n walletIcon,\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n}: LoginModalProps) {\n const { loginTelegram, loginModalOpen, closeLoginModal } =\n useHypurrConnectInternal();\n\n const handleTelegramAuth = useCallback(() => {\n closeLoginModal();\n loginTelegram();\n }, [loginTelegram, closeLoginModal]);\n\n const isMobile = useIsMobile();\n\n const modalContent = (\n <>\n <div\n style={{\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n <HoverButton onClick={handleTelegramAuth}>\n <TelegramColorIcon style={iconSize} />\n Telegram\n </HoverButton>\n </div>\n\n <div style={dividerStyle} />\n\n <HoverButton\n onClick={() => {\n closeLoginModal();\n onConnectWallet();\n }}\n >\n {walletIcon ?? <MetaMaskColorIcon style={iconSize} />}\n Wallet\n </HoverButton>\n </>\n );\n\n return (\n <AnimatePresence>\n {loginModalOpen &&\n (isMobile ? (\n <MobileDrawer\n key=\"drawer\"\n onClose={closeLoginModal}\n backgroundColor={backgroundColor}\n >\n {modalContent}\n </MobileDrawer>\n ) : (\n <>\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={closeLoginModal}\n />\n <motion.div\n key=\"modal-wrapper\"\n style={modalWrapperStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.05 }}\n onClick={closeLoginModal}\n >\n <motion.div\n style={{ ...modalBoxStyle, background: backgroundColor }}\n initial={{ scale: 0.96, opacity: 0, y: 8 }}\n animate={{ scale: 1, opacity: 1, y: 0 }}\n exit={{ scale: 0.96, opacity: 0, y: 8 }}\n transition={{ duration: 0.12 }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 style={headingStyle}>Connect</h2>\n {modalContent}\n </motion.div>\n </motion.div>\n </>\n ))}\n </AnimatePresence>\n );\n}\n\nconst drawerSheetStyle: CSSProperties = {\n position: \"fixed\",\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 101,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderLeft: \"1px solid rgba(255,255,255,0.1)\",\n borderRight: \"1px solid rgba(255,255,255,0.1)\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n padding: \"12px 24px max(24px, env(safe-area-inset-bottom))\",\n};\n\nconst drawerBgStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n right: 0,\n top: 0,\n bottom: \"-100vh\",\n zIndex: -1,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n};\n\nconst grabHandleAreaStyle: CSSProperties = {\n width: \"100%\",\n cursor: \"grab\",\n paddingBottom: 4,\n};\n\nconst grabHandleStyle: CSSProperties = {\n margin: \"0 auto\",\n height: 4,\n width: 100,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.05)\",\n};\n\nfunction MobileDrawer({\n children,\n onClose,\n backgroundColor,\n}: {\n children: ReactNode;\n onClose: () => void;\n backgroundColor: string;\n}) {\n const controls = useAnimationControls();\n\n const handleDragEnd = useCallback(\n (_: unknown, info: PanInfo) => {\n if (info.offset.y > 100 || info.velocity.y > 500) {\n onClose();\n } else {\n controls.start({ y: 0 });\n }\n },\n [onClose, controls],\n );\n\n return (\n <>\n <motion.div\n key=\"drawer-backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n\n <motion.div\n key=\"drawer-sheet\"\n style={{ ...drawerSheetStyle, background: backgroundColor }}\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ type: \"tween\", duration: 0.3, ease: [0.32, 0.72, 0, 1] }}\n drag=\"y\"\n dragConstraints={{ top: 0, bottom: 0 }}\n dragElastic={{ top: 0, bottom: 0.4 }}\n onDragEnd={handleDragEnd}\n >\n <div style={{ ...drawerBgStyle, background: backgroundColor }} />\n\n <div style={grabHandleAreaStyle}>\n <div style={grabHandleStyle} />\n </div>\n\n <p style={headingStyle}>Connect</p>\n\n {children}\n </motion.div>\n </>\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nconst MOBILE_BREAKPOINT = 640;\n\nconst mobileQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`)\n : null;\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener(\"change\", cb);\n return () => mobileQuery?.removeEventListener(\"change\", cb);\n}\n\nfunction getSnapshotMobile() {\n return mobileQuery?.matches ?? false;\n}\n\n/** Tracks whether the viewport is at or below the mobile breakpoint (640px). */\nexport function useIsMobile() {\n return useSyncExternalStore(subscribeMobile, getSnapshotMobile, () => false);\n}\n","import type { CSSProperties } from \"react\";\n\nexport function MetaMaskColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_2567_1088)\">\n <path\n d=\"M19.8188 19.418L15.9421 18.2871L13.0186 19.9994L10.9788 19.9985L8.05356 18.2871L4.17862 19.418L3 15.5193L4.17875 11.1924L3 7.5341L4.17875 3L10.2336 6.54437H13.7639L19.8188 3L20.9976 7.5341L19.8188 11.1924L20.9976 15.5193L19.8188 19.418Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M4.17969 3L10.2347 6.54685L9.99394 8.98101L4.17969 3ZM8.05476 15.5209L10.7189 17.5093L8.05476 18.2869V15.5209ZM10.5059 12.2335L9.99394 8.98275L6.71642 11.1934L6.71464 11.1925V11.1941L6.72479 13.4695L8.05387 12.2336L10.5059 12.2335ZM19.819 3L13.7641 6.54685L14.004 8.98101L19.819 3ZM15.9441 15.5209L13.2798 17.5093L15.9441 18.2869V15.5209ZM17.2833 11.194V11.1924L17.2825 11.1932L14.0049 8.98275L13.4929 12.2335H15.944L17.2739 13.4693L17.2833 11.194Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M8.05369 18.2867L4.17875 19.4177L3 15.5207H8.05369V18.2867ZM10.5049 12.2324L11.245 16.9321L10.2191 14.319L6.72296 13.4691L8.0528 12.2325L10.5049 12.2324ZM15.9438 18.2867L19.8188 19.4177L20.9976 15.5206H15.9438C15.9438 15.5207 15.9438 18.2867 15.9438 18.2867ZM13.4927 12.2324L12.7526 16.9321L13.7783 14.319L17.2748 13.4691L15.944 12.2325L13.4927 12.2324Z\"\n fill=\"#E34807\"\n />\n <path\n d=\"M3 15.5194L4.17875 11.1924H6.71358L6.72283 13.4686L10.2194 14.3185L11.2451 16.9315L10.7178 17.5069L8.05369 15.5185H3V15.5194ZM20.9976 15.5194L19.8188 11.1924H17.2839L17.2746 13.4686L13.7783 14.3185L12.7524 16.9315L13.2796 17.5069L15.9439 15.5185H20.9976V15.5194ZM13.7639 6.54443H10.2336L9.99389 8.97859L11.2453 16.9289H12.7526L14.0047 8.97859L13.7639 6.54443Z\"\n fill=\"#FF8D5D\"\n />\n <path\n d=\"M4.17875 3L3 7.5341L4.17875 11.1924H6.71358L9.99287 8.98114L4.17875 3ZM9.77231 13.1766H8.62399L7.9988 13.7771L10.2202 14.3166L9.77231 13.1757V13.1766ZM19.8188 3L20.9976 7.5341L19.8188 11.1924H17.2839L14.0047 8.98114L19.8188 3ZM14.2269 13.1766H15.3769L16.0021 13.7778L13.7782 14.3184L14.2269 13.1757V13.1766ZM13.0178 18.4484L13.2798 17.5086L12.7524 16.9332H11.244L10.7168 17.5086L10.9787 18.4484\"\n fill=\"#661800\"\n />\n <path\n d=\"M13.0173 18.4482V20.0001H10.9785V18.4482H13.0173Z\"\n fill=\"#C0C4CD\"\n />\n <path\n d=\"M8.05469 18.2854L10.9807 19.9994V18.4475L10.7187 17.5078L8.05469 18.2854ZM15.944 18.2854L13.0179 19.9994V18.4475L13.2799 17.5078L15.944 18.2854Z\"\n fill=\"#E7EBF6\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2567_1088\">\n <rect\n width=\"18\"\n height=\"17\"\n fill=\"white\"\n transform=\"translate(3 3)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function TelegramColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z\"\n fill=\"url(#paint0_linear_2571_1084)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.07426 11.905C9.69794 10.7619 11.4475 10.0083 12.3229 9.64417C14.8222 8.60458 15.3416 8.424 15.6801 8.41803C15.7546 8.41672 15.921 8.43517 16.0289 8.52267C16.1199 8.59655 16.145 8.69635 16.1569 8.7664C16.1689 8.83645 16.1839 8.99602 16.172 9.1207C16.0366 10.5438 15.4505 13.9973 15.1523 15.5912C15.0262 16.2657 14.7778 16.4918 14.5373 16.514C14.0146 16.562 13.6178 16.1686 13.1115 15.8367C12.3194 15.3175 11.8719 14.9943 11.103 14.4876C10.2145 13.902 10.7905 13.5802 11.2969 13.0542C11.4294 12.9166 13.7322 10.822 13.7768 10.632C13.7824 10.6082 13.7875 10.5196 13.7349 10.4729C13.6823 10.4261 13.6046 10.4421 13.5486 10.4548C13.4691 10.4728 12.2037 11.3092 9.75232 12.964C9.39313 13.2106 9.06779 13.3308 8.7763 13.3245C8.45496 13.3176 7.83681 13.1428 7.37729 12.9934C6.81366 12.8102 6.3657 12.7134 6.40471 12.4022C6.42503 12.2401 6.64821 12.0744 7.07426 11.905Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_2571_1084\"\n x1=\"903\"\n y1=\"3\"\n x2=\"903\"\n y2=\"1789.65\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#2AABEE\" />\n <stop offset=\"1\" stopColor=\"#229ED9\" />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport { useCallback, useState, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport {\n AGENT_APPROVAL_DURATION_OPTIONS,\n DEFAULT_AGENT_APPROVAL_DURATION_MS,\n createTelegramAgentApprovalName,\n type AgentApprovalDurationOption,\n} from \"./agentWallet\";\nimport {\n AlertTriangle,\n Check,\n Eye,\n EyeOff,\n KeyRound,\n Loader2,\n Plus,\n SpinKeyframes,\n Wallet,\n X,\n} from \"./icons/lucide\";\nimport type { Hex, SignTypedDataFn } from \"./types\";\n\nexport interface AddWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n ownerAddress?: string | null;\n isWalletConnected?: boolean;\n chainId?: number;\n signTypedDataAsync?: SignTypedDataFn;\n onConnectWallet?: () => void;\n onDisconnectWallet?: () => void;\n onWalletAdded?: (wallet?: HyperliquidWallet) => void | Promise<void>;\n onAddReadOnlyWallet?: (address: string) => void | Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n hyperliquidChain?: \"Mainnet\" | \"Testnet\" | string;\n /** Expiration choices for owner-approved agent wallets. Defaults to 1/7/30/90 days. */\n agentApprovalDurationOptions?: AgentApprovalDurationOption[];\n /** Initial owner approval duration. Defaults to 1 day. */\n defaultAgentApprovalDurationMs?: number;\n}\n\ntype TabKey = \"generate\" | \"import\" | \"api\" | \"readonly\";\n\nconst WALLET_NAME_REGEX = /^[a-zA-Z0-9/]*$/;\nconst PRIVATE_KEY_REGEX = /^(0x)?[a-fA-F0-9]{64}$/;\nconst BASE_TAB_KEYS: TabKey[] = [\"generate\", \"import\", \"api\"];\n\nfunction createAuthSignatureRequest(\n chainId: number,\n hyperliquidChain: string,\n agentAddress: string,\n approvalDurationMs: number,\n) {\n const nonce = Date.now();\n\n return {\n domain: {\n name: \"HyperliquidSignTransaction\",\n version: \"1\",\n chainId,\n verifyingContract: \"0x0000000000000000000000000000000000000000\" as const,\n },\n types: {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n },\n primaryType: \"HyperliquidTransaction:ApproveAgent\",\n message: {\n hyperliquidChain,\n agentAddress: agentAddress.toLowerCase() as Hex,\n agentName: createTelegramAgentApprovalName(approvalDurationMs),\n nonce,\n },\n };\n}\n\nconst tabClass = (selected: boolean) =>\n `flex-1 py-1.5 rounded text-base font-medium flex items-center justify-center gap-1.5 ${\n selected ? \"btn-raised-active\" : \"btn-raised\"\n }`;\n\nconst inputClass = (hasError?: boolean) =>\n `input ${\n hasError ? \"input-error\" : \"\"\n } w-full rounded-lg px-3 py-2.5 text-content placeholder-content-faint focus:outline-none font-mono text-base`;\n\nconst formatAddress = (address: string) =>\n `${address.slice(0, 6)}...${address.slice(-4)}`;\n\nexport function AddWalletModal({\n isOpen,\n onClose,\n ownerAddress,\n isWalletConnected,\n chainId,\n signTypedDataAsync,\n onConnectWallet,\n onDisconnectWallet,\n onWalletAdded,\n onAddReadOnlyWallet,\n onNotify,\n hyperliquidChain = \"Mainnet\",\n agentApprovalDurationOptions,\n defaultAgentApprovalDurationMs = DEFAULT_AGENT_APPROVAL_DURATION_MS,\n}: AddWalletModalProps): ReactNode {\n const tabKeys = onAddReadOnlyWallet\n ? [...BASE_TAB_KEYS, \"readonly\" as const]\n : BASE_TAB_KEYS;\n\n const [activeTab, setActiveTab] = useState<TabKey>(\"generate\");\n const [isLoading, setIsLoading] = useState(false);\n const [walletName, setWalletName] = useState(\"\");\n const [newWalletName, setNewWalletName] = useState(\"\");\n const [importWalletName, setImportWalletName] = useState(\"\");\n const [importPrivateKey, setImportPrivateKey] = useState(\"\");\n const [showImportPrivateKey, setShowImportPrivateKey] = useState(false);\n const [readOnlyAddress, setReadOnlyAddress] = useState(\"\");\n const [agentApprovalDurationMs, setAgentApprovalDurationMs] = useState(\n defaultAgentApprovalDurationMs,\n );\n const [error, setError] = useState<string | null>(null);\n\n const {\n authMethod,\n createWallet,\n isLoading: userLoading,\n refreshWallets,\n telegramClient,\n telegramRpcOptions,\n } = useHypurrConnectInternal();\n\n const isValidWalletName =\n walletName.length > 0 && WALLET_NAME_REGEX.test(walletName);\n const isValidNewWalletName =\n newWalletName.length > 0 && WALLET_NAME_REGEX.test(newWalletName);\n const isValidImportWalletName =\n importWalletName.length > 0 && WALLET_NAME_REGEX.test(importWalletName);\n const trimmedImportPrivateKey = importPrivateKey.trim();\n const isValidImportPrivateKey = PRIVATE_KEY_REGEX.test(\n trimmedImportPrivateKey,\n );\n const isProcessing = isLoading || userLoading;\n const durationOptions =\n agentApprovalDurationOptions && agentApprovalDurationOptions.length > 0\n ? agentApprovalDurationOptions\n : AGENT_APPROVAL_DURATION_OPTIONS;\n\n const handleClose = useCallback(() => {\n if (isProcessing) return;\n setError(null);\n setImportPrivateKey(\"\");\n setShowImportPrivateKey(false);\n onClose();\n }, [isProcessing, onClose]);\n\n const assertTelegramReady = useCallback(() => {\n if (authMethod !== \"telegram\" || !telegramRpcOptions) {\n throw new Error(\"Telegram login is required to add wallets\");\n }\n }, [authMethod, telegramRpcOptions]);\n\n const completeWalletAdded = useCallback(\n async (wallet?: HyperliquidWallet) => {\n refreshWallets();\n await onWalletAdded?.(wallet);\n },\n [onWalletAdded, refreshWallets],\n );\n\n const handleCreateWallet = useCallback(async () => {\n if (!isValidNewWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const wallet = await createWallet(newWalletName);\n await completeWalletAdded(wallet);\n onNotify?.({ type: \"success\", message: \"Wallet created successfully\" });\n setNewWalletName(\"\");\n handleClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to create wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n completeWalletAdded,\n createWallet,\n handleClose,\n isValidNewWalletName,\n newWalletName,\n onNotify,\n ]);\n\n const handleImportWallet = useCallback(async () => {\n if (!isValidImportWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n if (!isValidImportPrivateKey) {\n setError(\"Please enter a valid 64-character hex private key\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const response = await telegramClient.hyperliquidWalletImport(\n {\n authData: {},\n name: importWalletName,\n privateKey: trimmedImportPrivateKey,\n },\n telegramRpcOptions,\n );\n await completeWalletAdded(response.response.wallet);\n onNotify?.({ type: \"success\", message: \"Wallet imported successfully\" });\n setImportWalletName(\"\");\n setImportPrivateKey(\"\");\n handleClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to import wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n completeWalletAdded,\n handleClose,\n importWalletName,\n isValidImportPrivateKey,\n isValidImportWalletName,\n onNotify,\n telegramClient,\n telegramRpcOptions,\n trimmedImportPrivateKey,\n ]);\n\n const handleSignAndAdd = useCallback(async () => {\n if (!ownerAddress) {\n onConnectWallet?.();\n return;\n }\n if (!signTypedDataAsync || !chainId) {\n setError(\"Wallet signing is not ready yet\");\n return;\n }\n if (!isValidWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const res = await telegramClient.hyperliquidAgentSignatureCreate(\n { authData: {}, address: ownerAddress },\n telegramRpcOptions,\n );\n const agentAddress = res.response.agent;\n const request = createAuthSignatureRequest(\n chainId,\n hyperliquidChain,\n agentAddress,\n agentApprovalDurationMs,\n );\n const signature = await signTypedDataAsync(request);\n\n await telegramClient.hyperliquidAgentWalletCreate(\n {\n authData: {},\n name: walletName,\n signature: {\n agentAddress: request.message.agentAddress,\n agentName: request.message.agentName,\n nonce: request.message.nonce,\n chainId,\n signature,\n },\n },\n telegramRpcOptions,\n );\n\n await completeWalletAdded();\n onNotify?.({ type: \"success\", message: \"Wallet added successfully\" });\n onDisconnectWallet?.();\n setWalletName(\"\");\n handleClose();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to add wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n agentApprovalDurationMs,\n chainId,\n completeWalletAdded,\n handleClose,\n hyperliquidChain,\n isValidWalletName,\n onConnectWallet,\n onDisconnectWallet,\n onNotify,\n ownerAddress,\n signTypedDataAsync,\n telegramClient,\n telegramRpcOptions,\n walletName,\n ]);\n\n const handleAddReadOnly = useCallback(async () => {\n const trimmed = readOnlyAddress.trim();\n if (!trimmed) {\n setError(\"Please enter a wallet address\");\n return;\n }\n if (!/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {\n setError(\"Invalid Ethereum address format\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n await onAddReadOnlyWallet?.(trimmed);\n onNotify?.({ type: \"success\", message: \"Read-only wallet added\" });\n setReadOnlyAddress(\"\");\n handleClose();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to add wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [handleClose, onAddReadOnlyWallet, onNotify, readOnlyAddress]);\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <SpinKeyframes />\n <motion.div\n className=\"fixed inset-0 z-[100] bg-overlay/70 backdrop-blur-sm\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div\n className=\"fixed inset-0 z-[101] flex items-center justify-center p-4\"\n onClick={handleClose}\n >\n <motion.div\n className=\"relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6\">\n <h3 className=\"text-lg font-medium text-content\">Add Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isProcessing}\n className=\"absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"flex gap-1.5 px-6 pt-5\">\n {tabKeys.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => {\n setError(null);\n setActiveTab(tab);\n }}\n className={tabClass(activeTab === tab)}\n >\n {tab === \"generate\" ? (\n <>\n <Plus size={13} /> New\n </>\n ) : tab === \"import\" ? (\n <>\n <KeyRound size={13} /> Import\n </>\n ) : tab === \"api\" ? (\n <>\n <Wallet size={13} /> Link\n </>\n ) : (\n <>\n <Eye size={13} /> Watch\n </>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"px-6 pb-6 pt-5\">\n {activeTab === \"generate\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Create a new Hyperliquid wallet.\n </p>\n <WalletNameInput\n value={newWalletName}\n setValue={setNewWalletName}\n isValid={isValidNewWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyNewWallet\"\n />\n <button\n onClick={handleCreateWallet}\n disabled={isProcessing || !isValidNewWalletName}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && isValidNewWalletName\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Creating...\n </>\n ) : (\n <>\n <Plus size={14} /> Create Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"import\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Import a Hyperliquid wallet with its private key.\n </p>\n <WalletNameInput\n value={importWalletName}\n setValue={setImportWalletName}\n isValid={isValidImportWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyImportedWallet\"\n />\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Private Key\n </label>\n <div className=\"relative\">\n <input\n type={showImportPrivateKey ? \"text\" : \"password\"}\n value={importPrivateKey}\n onChange={(event) => {\n setImportPrivateKey(event.target.value);\n setError(null);\n }}\n placeholder=\"0x...\"\n spellCheck={false}\n autoComplete=\"off\"\n className={`${inputClass(\n !!importPrivateKey && !isValidImportPrivateKey,\n )} pr-11`}\n />\n <button\n type=\"button\"\n onClick={() =>\n setShowImportPrivateKey((visible) => !visible)\n }\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-content-subtle transition-colors hover:text-content-tertiary\"\n aria-label={\n showImportPrivateKey\n ? \"Hide private key\"\n : \"Show private key\"\n }\n >\n {showImportPrivateKey ? (\n <EyeOff size={15} />\n ) : (\n <Eye size={15} />\n )}\n </button>\n </div>\n </div>\n <button\n onClick={handleImportWallet}\n disabled={\n isProcessing ||\n !isValidImportWalletName ||\n !isValidImportPrivateKey\n }\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing &&\n isValidImportWalletName &&\n isValidImportPrivateKey\n ? \"btn-raised-accent\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Importing...\n </>\n ) : (\n <>\n <KeyRound size={14} /> Import Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"api\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Connect your wallet and sign to link it for trading.\n </p>\n {!isWalletConnected || !ownerAddress ? (\n <button\n onClick={onConnectWallet}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium\"\n >\n <Wallet size={14} /> Connect Wallet\n </button>\n ) : (\n <>\n <div className=\"flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5\">\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover\">\n <Wallet size={14} className=\"text-content-muted\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base text-content-muted\">\n Connected\n </p>\n <p className=\"font-mono text-base text-content\">\n {formatAddress(ownerAddress)}\n </p>\n </div>\n <Check\n size={16}\n className=\"flex-shrink-0 text-trade-up\"\n />\n </div>\n <WalletNameInput\n value={walletName}\n setValue={setWalletName}\n isValid={isValidWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyWallet\"\n />\n <ApprovalDurationPicker\n value={agentApprovalDurationMs}\n onChange={setAgentApprovalDurationMs}\n options={durationOptions}\n disabled={isProcessing}\n />\n <button\n onClick={handleSignAndAdd}\n disabled={isProcessing || !isValidWalletName}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && isValidWalletName\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Signing...\n </>\n ) : (\n \"Sign & Add Wallet\"\n )}\n </button>\n {onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n className=\"w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary\"\n >\n Disconnect & use different wallet\n </button>\n )}\n </>\n )}\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"readonly\" && onAddReadOnlyWallet && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n View positions and balances without trading access.\n </p>\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Wallet Address\n </label>\n <input\n type=\"text\"\n value={readOnlyAddress}\n onChange={(event) =>\n setReadOnlyAddress(event.target.value)\n }\n placeholder=\"0x...\"\n className={inputClass()}\n />\n </div>\n <button\n onClick={handleAddReadOnly}\n disabled={isProcessing || !readOnlyAddress.trim()}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && readOnlyAddress.trim()\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Adding...\n </>\n ) : (\n <>\n <Eye size={14} /> Add Watch Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n </div>\n </motion.div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nfunction WalletNameInput({\n value,\n setValue,\n isValid,\n clearError,\n placeholder,\n}: {\n value: string;\n setValue: (value: string) => void;\n isValid: boolean;\n clearError: () => void;\n placeholder: string;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Wallet Name\n </label>\n <input\n type=\"text\"\n value={value}\n onChange={(event) => {\n const nextValue = event.target.value;\n if (WALLET_NAME_REGEX.test(nextValue) || nextValue === \"\") {\n setValue(nextValue);\n clearError();\n }\n }}\n placeholder={placeholder}\n className={inputClass(!!value && !isValid)}\n />\n <p className=\"mt-1.5 text-base text-content-faint\">\n Letters, numbers, and / only\n </p>\n </div>\n );\n}\n\nfunction ApprovalDurationPicker({\n value,\n onChange,\n options,\n disabled,\n}: {\n value: number;\n onChange: (value: number) => void;\n options: AgentApprovalDurationOption[];\n disabled?: boolean;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Approval Duration\n </label>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {options.map((option) => (\n <button\n key={`${option.label}-${option.durationMs}`}\n type=\"button\"\n onClick={() => onChange(option.durationMs)}\n disabled={disabled}\n className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n value === option.durationMs\n ? \"bg-surface-btn-active text-content border-surface-bd-active\"\n : \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction ErrorBox({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <p className=\"text-base text-trade-down\">{message}</p>\n </div>\n );\n}\n","import type { CSSProperties, SVGProps } from \"react\";\n\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, \"fill\"> {\n size?: number;\n color?: string;\n fill?: string;\n style?: CSSProperties;\n}\n\nfunction svgBase({\n size = 16,\n color = \"currentColor\",\n fill = \"none\",\n ...rest\n}: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill,\n stroke: color,\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n ...rest,\n };\n}\n\nexport function Copy(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n );\n}\n\nexport function Star(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function User(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\nexport function Zap(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />\n </svg>\n );\n}\n\nexport function Wallet(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 12V8H6a2 2 0 0 1-2-2c0-1.1.9-2 2-2h12v4\" />\n <path d=\"M4 6v12c0 1.1.9 2 2 2h14v-4\" />\n <path d=\"M18 12a2 2 0 0 0-2 2c0 1.1.9 2 2 2h4v-4z\" />\n </svg>\n );\n}\n\nexport function Bot(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n );\n}\n\nexport function Eye(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function EyeOff(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M10.733 5.076a10.74 10.74 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.8 10.8 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function Check(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function KeyRound(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function RefreshCw(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M3 12a9 9 0 0 1 15.18-6.49\" />\n <path d=\"M21 3v6h-6\" />\n <path d=\"M21 12a9 9 0 0 1-15.18 6.49\" />\n <path d=\"M3 21v-6h6\" />\n </svg>\n );\n}\n\nexport function TrendingUp(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\" />\n <polyline points=\"16 7 22 7 22 13\" />\n </svg>\n );\n}\n\nexport function Trash2(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Pencil(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n );\n}\n\nexport function LayoutDashboard(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nexport function AlertTriangle(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Loader2(props: IconProps) {\n const { size = 16, color = \"currentColor\", style, ...rest } = props;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: \"hypurr-spin 1s linear infinite\",\n ...style,\n }}\n {...rest}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function Crown(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\" />\n <path d=\"M5 21h14\" />\n </svg>\n );\n}\n\nexport function Folder(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\" />\n </svg>\n );\n}\n\nexport function LogOut(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function Plus(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nexport function X(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/** Inject the keyframes used by {@link Loader2}. Mount once at the top of any modal that spins. */\nexport function SpinKeyframes() {\n return (\n <style>{`@keyframes hypurr-spin { to { transform: rotate(360deg); } }`}</style>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport {\n AGENT_APPROVAL_DURATION_OPTIONS,\n DEFAULT_AGENT_APPROVAL_DURATION_MS,\n agentExpiresAtMs,\n formatAgentExpiry,\n getAgentExpiryTitle,\n type AgentApprovalDurationOption,\n} from \"./agentWallet\";\nimport {\n AlertTriangle,\n Check,\n Loader2,\n SpinKeyframes,\n Wallet,\n X,\n} from \"./icons/lucide\";\nimport type { Hex, SignTypedDataFn } from \"./types\";\n\nexport interface RenewAgentModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n ownerAddress?: string | null;\n isWalletConnected?: boolean;\n chainId?: number;\n signTypedDataAsync?: SignTypedDataFn;\n onConnectWallet?: () => void;\n onDisconnectWallet?: () => void;\n onRenewed?: (wallet: HyperliquidWallet) => void | Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Expiration choices for the renewed owner approval. Defaults to 1/7/30/90 days. */\n approvalDurationOptions?: AgentApprovalDurationOption[];\n /** Initial renewal approval duration. Defaults to 1 day. */\n defaultApprovalDurationMs?: number;\n}\n\nconst isHexAddress = (address?: string | null): address is Hex =>\n !!address && /^0x[a-fA-F0-9]{40}$/.test(address);\n\nconst formatAddress = (address?: string | null) =>\n address ? `${address.slice(0, 6)}...${address.slice(-4)}` : \"\";\n\nconst isSameAddress = (a?: string | null, b?: string | null) =>\n isHexAddress(a) && isHexAddress(b) && a.toLowerCase() === b.toLowerCase();\n\nexport function RenewAgentModal({\n isOpen,\n onClose,\n wallet,\n ownerAddress,\n isWalletConnected,\n chainId,\n signTypedDataAsync,\n onConnectWallet,\n onDisconnectWallet,\n onRenewed,\n onNotify,\n approvalDurationOptions,\n defaultApprovalDurationMs = DEFAULT_AGENT_APPROVAL_DURATION_MS,\n}: RenewAgentModalProps): ReactNode {\n const { renewAgentWallet } = useHypurrConnectInternal();\n const [isRenewing, setIsRenewing] = useState(false);\n const [approvalDurationMs, setApprovalDurationMs] = useState(\n defaultApprovalDurationMs,\n );\n const [error, setError] = useState<string | null>(null);\n\n const expiryMessage = useMemo(\n () => (wallet ? getAgentExpiryTitle(wallet) : null),\n [wallet],\n );\n const currentExpiryMs = useMemo(\n () => (wallet ? agentExpiresAtMs(wallet) : null),\n [wallet],\n );\n const durationOptions =\n approvalDurationOptions && approvalDurationOptions.length > 0\n ? approvalDurationOptions\n : AGENT_APPROVAL_DURATION_OPTIONS;\n const expectedOwnerAddress = wallet?.ethereumAddress ?? null;\n const agentAddress = wallet?.agentEthereumAddress?.value ?? null;\n const hasExpectedOwner = isHexAddress(expectedOwnerAddress);\n const hasAgentAddress = isHexAddress(agentAddress);\n const hasConnectedOwner = isWalletConnected && isHexAddress(ownerAddress);\n const ownerMatches = isSameAddress(ownerAddress, expectedOwnerAddress);\n const ownerReady = ownerMatches && !!chainId;\n const canRenew =\n !!wallet &&\n hasAgentAddress &&\n ownerReady &&\n !!signTypedDataAsync &&\n !isRenewing;\n\n const handleClose = useCallback(() => {\n if (isRenewing) return;\n setError(null);\n onClose();\n }, [isRenewing, onClose]);\n\n const handleRenew = useCallback(async () => {\n if (!wallet) return;\n if (!isHexAddress(agentAddress)) {\n setError(\"This wallet is missing its agent address.\");\n return;\n }\n if (!isHexAddress(expectedOwnerAddress)) {\n setError(\"This wallet is missing its owner address.\");\n return;\n }\n if (!isHexAddress(ownerAddress)) {\n onConnectWallet?.();\n return;\n }\n if (!isSameAddress(ownerAddress, expectedOwnerAddress)) {\n setError(\n `Connect the owner wallet ${formatAddress(expectedOwnerAddress)} to renew this agent.`,\n );\n return;\n }\n if (!chainId || !signTypedDataAsync) {\n setError(\"Wallet signing is not ready yet\");\n return;\n }\n\n setError(null);\n setIsRenewing(true);\n try {\n await renewAgentWallet({\n walletId: wallet.id,\n ownerAddress,\n signTypedDataAsync,\n chainId,\n approvalDurationMs,\n });\n await onRenewed?.(wallet);\n onNotify?.({ type: \"success\", message: \"Agent wallet renewed\" });\n onClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to renew agent wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsRenewing(false);\n }\n }, [\n agentAddress,\n approvalDurationMs,\n chainId,\n expectedOwnerAddress,\n onClose,\n onConnectWallet,\n onNotify,\n onRenewed,\n ownerAddress,\n renewAgentWallet,\n signTypedDataAsync,\n wallet,\n ]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <motion.div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <SpinKeyframes />\n <motion.div\n className=\"fixed inset-0 z-[110] bg-overlay/70 backdrop-blur-sm\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div\n className=\"fixed inset-0 z-[111] flex items-center justify-center p-4\"\n onClick={handleClose}\n >\n <motion.div\n className=\"relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6\">\n <h3 className=\"text-lg font-medium text-content\">\n Renew Agent Wallet\n </h3>\n <button\n onClick={handleClose}\n disabled={isRenewing}\n className=\"absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"space-y-4 px-6 py-5\">\n <div className=\"flex items-start gap-2 rounded-lg border border-amber-500/25 bg-amber-500/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-amber-400\"\n />\n <p className=\"text-base text-amber-200\">\n {expiryMessage ??\n (currentExpiryMs\n ? `Current approval expires ${formatAgentExpiry(\n currentExpiryMs,\n )}. Renew to extend this agent wallet.`\n : \"Renew this agent wallet with a fresh owner approval.\")}\n </p>\n </div>\n\n <div className=\"rounded-lg border border-line bg-surface-btn p-3\">\n <p className=\"mb-1.5 text-base uppercase tracking-[0.1em] text-content-muted\">\n Agent address\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-base font-medium text-content\">\n {wallet.name || \"Unnamed Wallet\"}\n </p>\n <p className=\"font-mono text-base text-content-muted\">\n {hasAgentAddress\n ? formatAddress(agentAddress)\n : \"Missing agent address\"}\n </p>\n </div>\n <AlertTriangle\n size={16}\n className=\"flex-shrink-0 text-amber-400\"\n />\n </div>\n </div>\n\n {ownerReady ? (\n <div className=\"flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5\">\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover\">\n <Wallet size={14} className=\"text-content-muted\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base text-content-muted\">\n Owner wallet connected\n </p>\n <p className=\"font-mono text-base text-content\">\n {formatAddress(ownerAddress)}\n </p>\n </div>\n <Check size={16} className=\"flex-shrink-0 text-trade-up\" />\n </div>\n ) : hasConnectedOwner && !ownerMatches ? (\n <div className=\"space-y-3 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-base text-trade-down\">\n Wrong owner wallet connected\n </p>\n <p className=\"mt-1 font-mono text-base text-content-muted\">\n Connected {formatAddress(ownerAddress)}\n </p>\n <p className=\"font-mono text-base text-content-muted\">\n Required {formatAddress(expectedOwnerAddress)}\n </p>\n </div>\n </div>\n {onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n disabled={isRenewing}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Disconnect Wallet\n </button>\n )}\n </div>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium\"\n >\n <Wallet size={14} /> Connect Owner Wallet\n {hasExpectedOwner\n ? ` ${formatAddress(expectedOwnerAddress)}`\n : \"\"}\n </button>\n )}\n\n <ApprovalDurationPicker\n value={approvalDurationMs}\n onChange={setApprovalDurationMs}\n options={durationOptions}\n disabled={isRenewing}\n />\n\n {error && (\n <div className=\"flex items-start gap-2 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <p className=\"text-base text-trade-down\">{error}</p>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2 px-6 pb-6\">\n <button\n onClick={handleRenew}\n disabled={!canRenew}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n canRenew ? \"btn-raised\" : \"btn-raised-disabled\"\n }`}\n >\n {isRenewing ? (\n <>\n <Loader2 size={14} /> Renewing...\n </>\n ) : (\n \"Renew Agent Wallet\"\n )}\n </button>\n {ownerReady && onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n disabled={isRenewing}\n className=\"w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Disconnect & use different owner\n </button>\n )}\n </div>\n </motion.div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nfunction ApprovalDurationPicker({\n value,\n onChange,\n options,\n disabled,\n}: {\n value: number;\n onChange: (value: number) => void;\n options: AgentApprovalDurationOption[];\n disabled?: boolean;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Approval Duration\n </label>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {options.map((option) => (\n <button\n key={`${option.label}-${option.durationMs}`}\n type=\"button\"\n onClick={() => onChange(option.durationMs)}\n disabled={disabled}\n className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n value === option.durationMs\n ? \"bg-surface-btn-active text-content border-surface-bd-active\"\n : \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n Fragment,\n useCallback,\n useMemo,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n AgentExpiryWarningIcon,\n EXPIRED_AGENT_COLOR,\n} from \"./AgentExpiryWarning\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { useIsMobile } from \"./useIsMobile\";\nimport { UserProfileModal, type SlippageOption } from \"./UserProfileModal\";\nimport { getAgentExpiryTitle } from \"./agentWallet\";\nimport {\n Copy,\n Crown,\n Folder,\n LayoutDashboard,\n LogOut,\n Plus,\n RefreshCw,\n Star,\n User,\n Wallet,\n} from \"./icons/lucide\";\nimport {\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n resolvePrincipalColors,\n} from \"./profileStyles\";\n\nexport interface WalletSelectorDropdownProps {\n isOpen: boolean;\n onClose: () => void;\n /** Called when the user clicks \"Add Wallet\". Host renders the add-wallet UI. */\n onAddWallet?: () => void;\n /** Called when the user clicks the portfolio icon on a wallet row. */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /** Called when the user clicks an agent wallet renew action. Host should connect the owner wallet and call `renewAgentWallet`. */\n onRenewAgentWallet?: (wallet: HyperliquidWallet) => void;\n /**\n * Called before the SDK's `logout()` runs. Host can do extra cleanup\n * (e.g. wagmi `disconnect()`).\n */\n onLogout?: () => void;\n /** Toast callback. Fires \"Address copied\" success on copy-address clicks. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** HFun score threshold for the VIP crown. Defaults to 10. */\n vipThreshold?: number;\n\n // ─── Profile & Settings modal (rendered internally) ────────────\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /** Fired after the SDK successfully deletes a wallet. */\n onWalletDeleted?: (walletId: number) => void;\n /** Fired after the SDK successfully renames a wallet. */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for add-wallet text, wallet icon surfaces, and the Profile & Settings modal. */\n principalColors?: PrincipalColorOverrides;\n /** CSS color used as the dropdown panel background. Defaults to `rgba(20,20,20,0.95)`. */\n backgroundColor?: string;\n /** Extra footer rows rendered between \"Profile & Settings\" and \"Logout\". */\n extraFooterItems?: ExtraFooterItem[];\n}\n\nexport interface ExtraFooterItem {\n /** Stable key for React reconciliation. */\n key: string;\n /** Leading icon (e.g. an icon from `./icons/lucide`). */\n icon: ReactNode;\n /** Row label. */\n label: string;\n /** Click handler. The dropdown is NOT auto-closed — call `onClose` yourself if desired. */\n onClick: () => void;\n /** Optional hover text color (matches the \"Logout\" red-on-hover pattern). */\n hoverColor?: string;\n}\n\nconst DEFAULT_BACKGROUND_COLOR = \"rgb(var(--surface-dropdown))\";\n\ninterface DropdownWallet {\n id: number;\n name?: string | null;\n ethereumAddress?: string;\n agentEthereumAddress?: HyperliquidWallet[\"agentEthereumAddress\"];\n isAgent?: boolean;\n isReadOnly?: boolean;\n agentExpiresAt?: HyperliquidWallet[\"agentExpiresAt\"];\n}\n\ninterface WalletListItem {\n wallet: DropdownWallet;\n label: string | null;\n}\n\ntype WalletListEntry =\n | { type: \"wallet\"; item: WalletListItem }\n | { type: \"group\"; path: string; items: WalletListItem[] };\n\nconst getWalletNameParts = (name?: string | null) =>\n (name ?? \"\")\n .split(\"/\")\n .map((part) => part.trim())\n .filter(Boolean);\n\nconst buildWalletListEntries = (\n wallets: DropdownWallet[] | undefined,\n): WalletListEntry[] => {\n const standalone: WalletListItem[] = [];\n const grouped = new Map<string, WalletListItem[]>();\n const walletParts = (wallets ?? []).map((wallet) => ({\n wallet,\n parts: getWalletNameParts(wallet.name),\n }));\n const prefixCounts = new Map<string, number>();\n\n walletParts.forEach(({ parts }) => {\n for (let index = 1; index < parts.length; index += 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n prefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n }\n });\n\n walletParts.forEach(({ wallet, parts }) => {\n const groupPath = (() => {\n for (let index = parts.length - 1; index > 0; index -= 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n if ((prefixCounts.get(prefix) ?? 0) > 1) {\n return prefix;\n }\n }\n return null;\n })();\n const groupDepth = groupPath ? groupPath.split(\"/\").length : 0;\n const item: WalletListItem = {\n wallet,\n label: parts.length > 0 ? parts.slice(groupDepth).join(\"/\") : null,\n };\n\n if (!groupPath) {\n standalone.push(item);\n return;\n }\n\n const groupItems = grouped.get(groupPath) ?? [];\n groupItems.push(item);\n grouped.set(groupPath, groupItems);\n });\n\n const entries: WalletListEntry[] = standalone.map((item) => ({\n type: \"wallet\",\n item,\n }));\n\n grouped.forEach((items, path) => {\n if (items.length === 1) {\n entries.push({\n type: \"wallet\",\n item: { ...items[0], label: `${path}/${items[0].label ?? \"\"}` },\n });\n return;\n }\n\n entries.push({\n type: \"group\",\n path,\n items: [...items].sort((a, b) =>\n (a.label ?? \"\").localeCompare(b.label ?? \"\"),\n ),\n });\n });\n\n return entries.sort((a, b) => {\n const aLabel = a.type === \"group\" ? a.path : (a.item.label ?? \"\");\n const bLabel = b.type === \"group\" ? b.path : (b.item.label ?? \"\");\n return aLabel.localeCompare(bLabel);\n });\n};\n\nconst formatCompactAddress = (addr: string | undefined) => {\n if (!addr) return \"\";\n return `${addr.slice(0, 4)}...${addr.slice(-2)}`;\n};\n\nconst rootStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"calc(100% + 4px)\",\n width: 240,\n borderRadius: 9,\n boxShadow: \"var(--shadow-dropdown)\",\n border: \"1px solid rgb(var(--line))\",\n zIndex: 50,\n transformOrigin: \"top right\",\n overflow: \"hidden\",\n};\n\n// Scoped scrollbar styling so the dropdown looks the same on every host site\n// (matches alpha-trade). Inline styles can't target ::-webkit-scrollbar, so\n// inject a scoped <style>; Firefox uses the standard props on the element.\nconst SCROLLBAR_CLASS = \"hpc-wallet-scroll\";\nconst scrollbarCss = `\n.${SCROLLBAR_CLASS}::-webkit-scrollbar { width: 6px; height: 6px; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-track { background: #0b0e11; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-thumb { background: #374151; border-radius: 3px; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-thumb:hover { background: #4b5563; }\n`;\n\nconst sectionBorder = \"1px solid rgb(var(--line))\";\n\nconst sectionHeaderStyle: CSSProperties = {\n padding: \"8px 16px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"rgb(var(--content-muted))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n};\n\nconst footerBtnStyle: CSSProperties = {\n width: \"100%\",\n textAlign: \"left\",\n padding: \"10px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgb(var(--content-muted))\",\n transition: \"background 120ms, color 120ms\",\n};\n\nexport function WalletSelectorDropdown({\n isOpen,\n onClose,\n onAddWallet,\n onShowPortfolio,\n onRenewAgentWallet,\n onLogout,\n onNotify,\n vipThreshold = 10,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions,\n onWalletDeleted,\n onWalletRenamed,\n accentColor,\n principalColors,\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n extraFooterItems,\n}: WalletSelectorDropdownProps): ReactNode {\n const { user, wallets, selectedWalletId, selectWallet, logout, authMethod } =\n useHypurrConnectInternal();\n\n const [profileOpen, setProfileOpen] = useState(false);\n const openProfile = useCallback(() => {\n setProfileOpen(true);\n onClose();\n }, [onClose]);\n\n const walletListEntries = useMemo(\n () => buildWalletListEntries(Array.isArray(wallets) ? wallets : undefined),\n [wallets],\n );\n\n const handleCopyAddress = useCallback(\n (address: string | undefined) => {\n if (!address) return;\n navigator.clipboard.writeText(address);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n },\n [onNotify],\n );\n\n const handleLogout = useCallback(() => {\n onLogout?.();\n logout();\n onClose();\n }, [logout, onClose, onLogout]);\n\n const profilePic = user?.photoUrl;\n const displayName = user?.displayName ?? \"\";\n const hfunScore = user?.hfunScore ?? 0;\n const isVip = hfunScore > vipThreshold;\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const renderWalletRow = (item: WalletListItem, depth: number): ReactNode => {\n const { wallet, label } = item;\n const isSelected = wallet.id === selectedWalletId;\n const compactAddress = formatCompactAddress(wallet.ethereumAddress);\n const agentExpiryTitle = getAgentExpiryTitle({\n isAgent: !!wallet.isAgent,\n agentExpiresAt: wallet.agentExpiresAt,\n });\n return (\n <WalletRow\n key={wallet.id}\n depth={depth}\n isSelected={isSelected}\n label={label}\n compactAddress={compactAddress}\n onSelect={() => {\n selectWallet(wallet.id);\n onClose();\n }}\n onShowPortfolio={\n onShowPortfolio\n ? () => {\n onShowPortfolio(wallet as HyperliquidWallet);\n onClose();\n }\n : undefined\n }\n onCopy={() => handleCopyAddress(wallet.ethereumAddress)}\n agentExpiryTitle={agentExpiryTitle}\n onRenewAgentWallet={\n wallet.isAgent && onRenewAgentWallet\n ? () => {\n onRenewAgentWallet(wallet as HyperliquidWallet);\n onClose();\n }\n : undefined\n }\n colors={colors}\n />\n );\n };\n\n return (\n <div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n style={{ ...rootStyle, background: backgroundColor }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n <style>{scrollbarCss}</style>\n {/* Profile header */}\n <button\n onClick={openProfile}\n style={{\n width: \"100%\",\n padding: \"12px 16px\",\n borderBottom: sectionBorder,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n background: \"transparent\",\n border: \"none\",\n borderBottomColor: \"rgb(var(--btn-bevel) / 0.06)\",\n borderBottomStyle: \"solid\",\n borderBottomWidth: 1,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background =\n \"rgb(var(--btn-bevel) / 0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n {profilePic ? (\n <div\n style={{\n position: \"relative\",\n padding: isVip ? 2 : 0,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(to right, #fde047, #eab308, #ca8a04)\"\n : \"transparent\",\n }}\n >\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n display: \"block\",\n }}\n />\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n ) : authMethod === \"eoa\" ? (\n <div\n style={{\n height: 32,\n width: 32,\n borderRadius: 7,\n background: colors.accentBackground,\n border: `1px solid ${colors.accentBorder}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Wallet size={14} color={colors.accentText} />\n </div>\n ) : (\n <div\n style={{\n position: \"relative\",\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(135deg, #ca8a04, #fde047)\"\n : colors.accentBackground,\n border: `1px solid ${\n isVip ? \"rgba(255,255,255,0.08)\" : colors.accentBorder\n }`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: isVip ? profileColors.text : colors.accentText,\n fontSize: 14,\n fontWeight: 700,\n }}\n >\n {displayName.charAt(0)}\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n )}\n <div style={{ overflow: \"hidden\", flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <p\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 500,\n color: \"rgb(var(--content))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </p>\n {hfunScore > 0 && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 2,\n fontSize: 12,\n color: \"#eab308\",\n fontWeight: 500,\n background: \"rgba(234,179,8,0.1)\",\n padding: \"2px 6px\",\n borderRadius: 4,\n }}\n >\n <Star size={10} color=\"#eab308\" fill=\"#eab308\" />\n {hfunScore.toFixed(0)}\n </span>\n )}\n </div>\n </div>\n </button>\n\n {/* Wallets section */}\n <div style={{ borderBottom: sectionBorder }}>\n <div style={sectionHeaderStyle}>Wallets</div>\n <div\n className={SCROLLBAR_CLASS}\n style={{\n maxHeight: 256,\n overflowY: \"auto\",\n paddingBottom: 4,\n scrollbarWidth: \"thin\",\n scrollbarColor: \"#374151 #0b0e11\",\n }}\n >\n {walletListEntries.map((entry) => {\n if (entry.type === \"wallet\") {\n return renderWalletRow(entry.item, 0);\n }\n const isSelectedGroup = entry.items.some(\n (item) => item.wallet.id === selectedWalletId,\n );\n return (\n <Fragment key={entry.path}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px 4px\",\n fontSize: 11,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: isSelectedGroup\n ? \"rgb(var(--content-secondary))\"\n : \"rgb(var(--content-faint))\",\n }}\n >\n <Folder size={12} style={{ flexShrink: 0 }} />\n <span\n style={{\n minWidth: 0,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {entry.path}\n </span>\n <span\n style={{\n flexShrink: 0,\n fontVariantNumeric: \"tabular-nums\",\n color: \"rgb(var(--content-disabled))\",\n }}\n >\n {entry.items.length}\n </span>\n </div>\n {entry.items.map((item) => renderWalletRow(item, 1))}\n </Fragment>\n );\n })}\n </div>\n {authMethod !== \"eoa\" && onAddWallet && (\n <button\n onClick={() => {\n onAddWallet();\n onClose();\n }}\n style={{\n width: \"100%\",\n textAlign: \"left\",\n padding: \"8px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: colors.accentText,\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background =\n \"rgb(var(--btn-bevel) / 0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n <Plus size={14} />\n Add Wallet\n </button>\n )}\n </div>\n\n {/* Footer actions */}\n <div>\n <FooterBtn\n onClick={openProfile}\n icon={<User size={14} />}\n label=\"Profile & Settings\"\n />\n {extraFooterItems?.map((item) => (\n <FooterBtn\n key={item.key}\n onClick={item.onClick}\n icon={item.icon}\n label={item.label}\n hoverColor={item.hoverColor}\n />\n ))}\n <FooterBtn\n onClick={handleLogout}\n icon={<LogOut size={14} />}\n label=\"Logout\"\n hoverColor=\"#ef4444\"\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <UserProfileModal\n isOpen={profileOpen}\n onClose={() => setProfileOpen(false)}\n animationsEnabled={animationsEnabled}\n onToggleAnimations={onToggleAnimations}\n defaultSlippage={defaultSlippage}\n onSlippageChange={onSlippageChange}\n slippageOptions={slippageOptions}\n accentColor={accentColor}\n principalColors={principalColors}\n onWalletDeleted={onWalletDeleted}\n onWalletRenamed={onWalletRenamed}\n onRenewAgentWallet={onRenewAgentWallet}\n onShowPortfolio={\n onShowPortfolio\n ? (wallet) => {\n onShowPortfolio(wallet);\n setProfileOpen(false);\n }\n : undefined\n }\n onNotify={onNotify}\n />\n </div>\n );\n}\n\nfunction FooterBtn({\n onClick,\n icon,\n label,\n hoverColor = \"rgb(var(--content))\",\n}: {\n onClick: () => void;\n icon: ReactNode;\n label: string;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n style={footerBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgb(var(--btn-bevel) / 0.06)\";\n e.currentTarget.style.color = hoverColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgb(var(--content-muted))\";\n }}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nfunction WalletRow({\n depth,\n isSelected,\n label,\n compactAddress,\n onSelect,\n onShowPortfolio,\n onCopy,\n agentExpiryTitle,\n onRenewAgentWallet,\n colors,\n}: {\n depth: number;\n isSelected: boolean;\n label: string | null;\n compactAddress: string;\n onSelect: () => void;\n onShowPortfolio?: () => void;\n onCopy: () => void;\n agentExpiryTitle?: string | null;\n onRenewAgentWallet?: () => void;\n colors: PrincipalColors;\n}) {\n const isAgentExpired = !!agentExpiryTitle;\n const walletTextColor = isAgentExpired\n ? EXPIRED_AGENT_COLOR\n : \"rgb(var(--content-tertiary))\";\n const mutedTextColor = isAgentExpired\n ? \"rgba(245,158,11,0.78)\"\n : \"rgb(var(--content-faint))\";\n // Touch devices have no hover, so keep row actions visible on mobile.\n const isMobile = useIsMobile();\n return (\n <div\n style={{\n width: \"100%\",\n paddingLeft: 16 + depth * 14,\n paddingRight: 16,\n paddingTop: 6,\n paddingBottom: 6,\n fontSize: 14,\n color: walletTextColor,\n display: \"flex\",\n alignItems: \"center\",\n background: isSelected ? \"rgb(var(--btn-bevel) / 0.06)\" : \"transparent\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgb(var(--btn-bevel) / 0.06)\";\n if (isMobile) return;\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isSelected\n ? \"rgb(var(--btn-bevel) / 0.06)\"\n : \"transparent\";\n if (isMobile) return;\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"0\";\n }}\n >\n <button\n onClick={onSelect}\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n {label ? (\n <>\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n color: isAgentExpired\n ? walletTextColor\n : isSelected\n ? \"rgb(var(--content))\"\n : undefined,\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {label}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n flexShrink: 0,\n color: mutedTextColor,\n }}\n >\n ({compactAddress})\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 12,\n color: isAgentExpired\n ? walletTextColor\n : isSelected\n ? \"rgb(var(--content))\"\n : \"rgb(var(--content-muted))\",\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {compactAddress}\n </span>\n )}\n </button>\n {agentExpiryTitle && (\n <AgentExpiryWarningIcon\n message={agentExpiryTitle}\n onClick={onRenewAgentWallet}\n />\n )}\n <div\n data-row-actions\n style={{\n display: \"flex\",\n alignItems: \"center\",\n opacity: isMobile ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n {onRenewAgentWallet && (\n <RowIconBtn\n title=\"Renew agent wallet\"\n hoverColor={isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onRenewAgentWallet();\n }}\n >\n <RefreshCw size={12} />\n </RowIconBtn>\n )}\n {onShowPortfolio && (\n <RowIconBtn\n title=\"View portfolio\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onShowPortfolio();\n }}\n >\n <LayoutDashboard size={12} />\n </RowIconBtn>\n )}\n <RowIconBtn\n title=\"Copy address\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onCopy();\n }}\n >\n <Copy size={12} />\n </RowIconBtn>\n </div>\n </div>\n );\n}\n\nfunction RowIconBtn({\n children,\n title,\n onClick,\n hoverColor = profileColors.text,\n}: {\n children: ReactNode;\n title: string;\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n title={title}\n style={{\n padding: 4,\n marginLeft: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"rgb(var(--content-disabled))\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = hoverColor)}\n onMouseLeave={(e) =>\n (e.currentTarget.style.color = \"rgb(var(--content-disabled))\")\n }\n >\n {children}\n </button>\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type RefCallback,\n} from \"react\";\nimport { AlertTriangle } from \"./icons/lucide\";\n\nconst EXPIRED_AGENT_COLOR = \"#f59e0b\";\n\ninterface TooltipPosition {\n left: number;\n top: number;\n}\n\nexport function AgentExpiryWarningIcon({\n message,\n onClick,\n size = 13,\n}: {\n message: string;\n onClick?: () => void;\n size?: number;\n}) {\n const triggerRef = useRef<HTMLElement | null>(null);\n const [tooltipPosition, setTooltipPosition] =\n useState<TooltipPosition | null>(null);\n\n const setTriggerRef: RefCallback<HTMLElement> = useCallback((node) => {\n triggerRef.current = node;\n }, []);\n\n const showTooltip = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const tooltipWidth = 260;\n const left = Math.min(\n Math.max(rect.left + rect.width / 2, tooltipWidth / 2 + 8),\n window.innerWidth - tooltipWidth / 2 - 8,\n );\n const top =\n rect.bottom + 8 < window.innerHeight - 48\n ? rect.bottom + 8\n : Math.max(8, rect.top - 44);\n\n setTooltipPosition({ left, top });\n }, []);\n\n const hideTooltip = useCallback(() => {\n setTooltipPosition(null);\n }, []);\n\n const triggerStyle: CSSProperties = {\n width: size + 5,\n height: size + 5,\n padding: 0,\n border: \"none\",\n borderRadius: 4,\n background: \"transparent\",\n color: EXPIRED_AGENT_COLOR,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n cursor: onClick ? \"pointer\" : \"help\",\n };\n\n const sharedProps = {\n ref: setTriggerRef,\n \"aria-label\": \"Agent approval expired\",\n onMouseEnter: showTooltip,\n onMouseLeave: hideTooltip,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n style: triggerStyle,\n };\n\n return (\n <>\n {onClick ? (\n <button\n type=\"button\"\n {...sharedProps}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n >\n <AlertTriangle size={size} color={EXPIRED_AGENT_COLOR} />\n </button>\n ) : (\n <span {...sharedProps}>\n <AlertTriangle size={size} color={EXPIRED_AGENT_COLOR} />\n </span>\n )}\n {tooltipPosition && (\n <div\n role=\"tooltip\"\n style={{\n position: \"fixed\",\n left: tooltipPosition.left,\n top: tooltipPosition.top,\n transform: \"translateX(-50%)\",\n zIndex: 10_000,\n width: 260,\n maxWidth: \"calc(100vw - 16px)\",\n padding: \"7px 9px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"#111827\",\n boxShadow: \"0 10px 28px rgba(0,0,0,0.45)\",\n color: \"#e5e7eb\",\n fontSize: 12,\n lineHeight: \"1rem\",\n fontWeight: 500,\n pointerEvents: \"none\",\n whiteSpace: \"normal\",\n }}\n >\n {message}\n </div>\n )}\n </>\n );\n}\n\nexport { EXPIRED_AGENT_COLOR };\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AgentExpiryWarningIcon,\n EXPIRED_AGENT_COLOR,\n} from \"./AgentExpiryWarning\";\nimport { DeleteWalletModal } from \"./DeleteWalletModal\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { RenameWalletModal } from \"./RenameWalletModal\";\nimport { getAgentExpiryTitle } from \"./agentWallet\";\nimport {\n Bot,\n Copy,\n Eye,\n KeyRound,\n LayoutDashboard,\n Pencil,\n RefreshCw,\n SpinKeyframes,\n Star,\n Trash2,\n TrendingUp,\n User,\n Wallet,\n X,\n Zap,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n colorWithAlpha,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n pickContrastColor,\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n resolvePrincipalColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\ntype SettingsTab = \"ui\" | \"trading\" | \"wallets\";\n\nexport interface SlippageOption {\n label: string;\n value: number;\n}\n\nconst DEFAULT_SLIPPAGE_OPTIONS: SlippageOption[] = [\n { label: \"0.5%\", value: 0.005 },\n { label: \"1%\", value: 0.01 },\n { label: \"2%\", value: 0.02 },\n { label: \"5%\", value: 0.05 },\n { label: \"10%\", value: 0.1 },\n];\n\nexport interface UserProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /**\n * Fired after the SDK successfully deletes a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletDeleted?: (walletId: number) => void;\n /**\n * Fired after the SDK successfully renames a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /**\n * If provided, each wallet row in the Wallets tab gets a \"View portfolio\"\n * button that fires this callback. The host is expected to open its own\n * portfolio UI in response.\n */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /** Called when the user clicks an agent wallet renew action. Host should connect the owner wallet and call `renewAgentWallet`. */\n onRenewAgentWallet?: (wallet: HyperliquidWallet) => void;\n /** Optional toast callback. SDK fires success on rename/delete; errors stay inline in sub-modals. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for switches, action text, and wallet icon surfaces. */\n principalColors?: PrincipalColorOverrides;\n}\n\nconst backdropStyle = modalBackdropStyle(100);\nconst wrapperStyle = modalWrapperStyle(101);\nconst panelStyle = modalPanelStyle(true);\nconst headerStyle = modalHeaderStyle;\n\nconst profileSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nconst settingsSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n};\n\nconst tabRowStyle: CSSProperties = {\n display: \"flex\",\n gap: 6,\n marginBottom: 20,\n};\n\nconst tabButtonLayoutStyle: CSSProperties = {\n flex: 1,\n padding: \"6px 0\",\n borderRadius: 4,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n cursor: \"pointer\",\n transition: \"background-color 150ms, color 150ms, box-shadow 150ms\",\n};\n\nconst statBoxStyle: CSSProperties = {\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n borderRadius: 8,\n padding: 12,\n border: `1px solid ${profileColors.border}`,\n};\n\nconst slippageBtnBaseClass =\n \"flex-1 rounded border px-2 py-1 font-mono font-medium text-base transition-colors\";\nconst slippageBtnSelectedClass =\n \"bg-surface-btn-active text-content border-surface-bd-active\";\nconst slippageBtnIdleClass =\n \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\";\n\nconst walletRowStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n borderRadius: 8,\n background: profileColors.surfaceBtn,\n border: `1px solid ${profileColors.surfaceBd}`,\n transition: \"background-color 150ms, border-color 150ms\",\n};\n\ntype WalletTypeMeta = {\n label: string;\n color: string;\n background: string;\n border: string;\n icon: ReactNode;\n};\n\nfunction getWalletTypeMeta(wallet: HyperliquidWallet): WalletTypeMeta {\n if (wallet.isAgent) {\n return {\n label: \"Agent wallet\",\n color: \"rgb(var(--blue-500))\",\n background: \"rgb(var(--blue-500) / 0.16)\",\n border: \"rgb(var(--blue-500) / 0.34)\",\n icon: <Bot size={10} />,\n };\n }\n\n if (wallet.isReadOnly) {\n return {\n label: \"Read-only wallet\",\n color: \"rgb(var(--purple-400))\",\n background: \"rgb(var(--purple-400) / 0.16)\",\n border: \"rgb(var(--purple-400) / 0.34)\",\n icon: <Eye size={10} />,\n };\n }\n\n return {\n label: \"Private-key wallet\",\n color: \"rgb(var(--green-400))\",\n background: \"rgb(var(--green-400) / 0.16)\",\n border: \"rgb(var(--green-400) / 0.34)\",\n icon: <KeyRound size={10} />,\n };\n}\n\nfunction ToggleSwitch({\n checked,\n onChange,\n accentColor,\n}: {\n checked: boolean;\n onChange: () => void;\n accentColor: string;\n}) {\n return (\n <button\n onClick={onChange}\n role=\"switch\"\n aria-checked={checked}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n height: 20,\n width: 36,\n alignItems: \"center\",\n borderRadius: 9999,\n border: \"none\",\n background: checked\n ? colorWithAlpha(accentColor, 0.85)\n : \"rgb(var(--btn-bevel) / 0.08)\",\n cursor: \"pointer\",\n padding: 0,\n transition: \"background 150ms\",\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n height: 12,\n width: 12,\n borderRadius: \"50%\",\n background: checked\n ? pickContrastColor(accentColor)\n : profileColors.text,\n transform: checked ? \"translateX(20px)\" : \"translateX(4px)\",\n transition: \"transform 150ms, background 150ms\",\n }}\n />\n </button>\n );\n}\n\nfunction RaisedButton({\n selected = false,\n onClick,\n children,\n style,\n}: {\n selected?: boolean;\n onClick: () => void;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={selected ? \"btn-raised-active\" : \"btn-raised\"}\n style={{ ...tabButtonLayoutStyle, ...style }}\n >\n {children}\n </button>\n );\n}\n\nfunction SlippageButton({\n selected,\n onClick,\n children,\n}: {\n selected: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`${slippageBtnBaseClass} ${\n selected ? slippageBtnSelectedClass : slippageBtnIdleClass\n }`}\n >\n {children}\n </button>\n );\n}\n\nexport function UserProfileModal({\n isOpen,\n onClose,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions = DEFAULT_SLIPPAGE_OPTIONS,\n onWalletDeleted,\n onWalletRenamed,\n onShowPortfolio,\n onRenewAgentWallet,\n onNotify,\n accentColor,\n principalColors,\n}: UserProfileModalProps): ReactNode {\n const {\n user,\n wallets: userWallets,\n deleteWallet,\n renameWallet,\n authMethod,\n } = useHypurrConnectInternal();\n\n const [settingsTab, setSettingsTab] = useState<SettingsTab>(\"ui\");\n const [walletToDelete, setWalletToDelete] =\n useState<HyperliquidWallet | null>(null);\n const [walletToRename, setWalletToRename] =\n useState<HyperliquidWallet | null>(null);\n\n const profilePic = user?.photoUrl || \"\";\n const displayName = user?.displayName || \"\";\n const hfunScore = user?.hfunScore ?? null;\n const reputationScore = user?.reputationScore ?? null;\n const telegramId = user?.telegramId;\n const wallets = userWallets ?? [];\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const handleDeleteWallet = useCallback(\n async (walletId: number) => {\n await deleteWallet(walletId);\n onWalletDeleted?.(walletId);\n },\n [deleteWallet, onWalletDeleted],\n );\n\n const handleRenameWallet = useCallback(\n async (walletId: number, name: string) => {\n await renameWallet(walletId, name);\n onWalletRenamed?.(walletId, name);\n },\n [renameWallet, onWalletRenamed],\n );\n\n const handleCopyAddress = useCallback(() => {\n if (!displayName) return;\n navigator.clipboard.writeText(displayName);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n }, [displayName, onNotify]);\n\n return (\n <div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <AnimatePresence>\n {isOpen && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n <div style={wrapperStyle} onClick={onClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div style={headerStyle}>\n <h3 style={titleStyle}>Profile & Settings</h3>\n <button\n onClick={onClose}\n style={makeCloseBtnStyle()}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n {/* Profile Section */}\n <div style={profileSectionStyle}>\n {authMethod === \"eoa\" && !profilePic ? (\n <div\n style={{\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n }}\n >\n <p\n style={{\n margin: \"0 0 6px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayName}\n </p>\n <button\n onClick={handleCopyAddress}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: \"pointer\",\n flexShrink: 0,\n display: \"flex\",\n }}\n aria-label=\"Copy address\"\n >\n <Copy size={13} />\n </button>\n </div>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n }}\n >\n {profilePic ? (\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n }}\n />\n ) : (\n <div\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n background: profileColors.surfaceBd,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n }}\n >\n {displayName?.charAt(0)}\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </h4>\n {telegramId && (\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n ID: {telegramId}\n </p>\n )}\n </div>\n </div>\n )}\n\n {user && (\n <div\n style={{\n marginTop: 16,\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 10,\n }}\n >\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"rgb(var(--amber-400))\",\n marginBottom: 6,\n }}\n >\n <Star\n size={13}\n color=\"rgb(var(--amber-400))\"\n fill=\"rgb(var(--amber-400))\"\n />\n <span style={upperLabelStyle}>Hfun Score</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {hfunScore !== null ? hfunScore.toFixed(0) : \"--\"}\n </p>\n </div>\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: profileColors.muted,\n marginBottom: 6,\n }}\n >\n <User size={13} />\n <span style={upperLabelStyle}>Reputation</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {reputationScore !== null\n ? reputationScore.toFixed(0)\n : \"--\"}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Settings Section */}\n <div style={settingsSectionStyle}>\n <div style={tabRowStyle}>\n <RaisedButton\n selected={settingsTab === \"ui\"}\n onClick={() => setSettingsTab(\"ui\")}\n >\n <Zap size={13} /> UI\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"trading\"}\n onClick={() => setSettingsTab(\"trading\")}\n >\n <TrendingUp size={13} /> Trading\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"wallets\"}\n onClick={() => setSettingsTab(\"wallets\")}\n >\n <Wallet size={13} /> Wallets\n </RaisedButton>\n </div>\n\n {settingsTab === \"ui\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 0\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <Zap size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Animations\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Enable chart and UI animations\n </p>\n </div>\n </div>\n <ToggleSwitch\n checked={animationsEnabled}\n onChange={onToggleAnimations}\n accentColor={colors.accent}\n />\n </div>\n </div>\n )}\n\n {settingsTab === \"trading\" && (\n <div style={{ padding: \"8px 0\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n marginBottom: 12,\n }}\n >\n <TrendingUp size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Default Slippage\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Max price deviation for market orders\n </p>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: 6 }}>\n {slippageOptions.map((option) => (\n <SlippageButton\n key={option.value}\n onClick={() => onSlippageChange(option.value)}\n selected={defaultSlippage === option.value}\n >\n {option.label}\n </SlippageButton>\n ))}\n </div>\n </div>\n )}\n\n {settingsTab === \"wallets\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n {wallets.length === 0 ? (\n <div\n style={{\n textAlign: \"center\",\n padding: \"32px 0\",\n }}\n >\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n background: \"rgb(var(--btn-bevel) / 0.04)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"0 auto 12px\",\n }}\n >\n <Wallet size={18} color={profileColors.muted} />\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n No wallets yet\n </p>\n </div>\n ) : (\n <div\n style={{\n maxHeight: 208,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {wallets.map((wallet) => (\n <WalletRow\n key={wallet.id}\n wallet={wallet}\n colors={colors}\n onRename={() => setWalletToRename(wallet)}\n onDelete={() => setWalletToDelete(wallet)}\n onRenewAgentWallet={\n wallet.isAgent && onRenewAgentWallet\n ? () => onRenewAgentWallet(wallet)\n : undefined\n }\n onShowPortfolio={\n onShowPortfolio\n ? () => onShowPortfolio(wallet)\n : undefined\n }\n />\n ))}\n </div>\n )}\n <p\n style={{\n margin: \"4px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n textAlign: \"center\",\n }}\n >\n {wallets.length} wallet\n {wallets.length !== 1 ? \"s\" : \"\"} linked\n </p>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={{ padding: \"0 24px 24px\" }}>\n <button\n onClick={onClose}\n className=\"btn-raised\"\n style={{\n width: \"100%\",\n padding: \"6px 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n borderRadius: 8,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n\n <DeleteWalletModal\n isOpen={!!walletToDelete}\n onClose={() => setWalletToDelete(null)}\n wallet={walletToDelete}\n onConfirm={handleDeleteWallet}\n onNotify={onNotify}\n />\n <RenameWalletModal\n isOpen={!!walletToRename}\n onClose={() => setWalletToRename(null)}\n wallet={walletToRename}\n onConfirm={handleRenameWallet}\n onNotify={onNotify}\n accentColor={colors.accent}\n />\n </div>\n );\n}\n\nfunction WalletRow({\n wallet,\n colors,\n onRename,\n onDelete,\n onRenewAgentWallet,\n onShowPortfolio,\n}: {\n wallet: HyperliquidWallet;\n colors: PrincipalColors;\n onRename: () => void;\n onDelete: () => void;\n onRenewAgentWallet?: () => void;\n onShowPortfolio?: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const agentExpiryTitle = getAgentExpiryTitle(wallet);\n const isAgentExpired = !!agentExpiryTitle;\n const typeMeta = getWalletTypeMeta(wallet);\n return (\n <div\n style={{\n ...walletRowStyle,\n background: isAgentExpired\n ? hovered\n ? \"rgba(245,158,11,0.12)\"\n : \"rgba(245,158,11,0.07)\"\n : hovered\n ? profileColors.surfaceBtnHover\n : profileColors.surfaceBtn,\n borderColor: isAgentExpired\n ? \"rgba(245,158,11,0.34)\"\n : hovered\n ? profileColors.surfaceBdHover\n : profileColors.surfaceBd,\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <div\n style={{\n position: \"relative\",\n width: 32,\n height: 32,\n borderRadius: 6,\n background: isAgentExpired\n ? \"rgba(245,158,11,0.12)\"\n : colors.accentBackground,\n border: `1px solid ${\n isAgentExpired ? \"rgba(245,158,11,0.34)\" : colors.accentBorder\n }`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 600,\n color: isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accentText,\n }}\n >\n {(wallet.name || \"W\")[0].toUpperCase()}\n </span>\n <span\n role=\"img\"\n aria-label={typeMeta.label}\n title={typeMeta.label}\n style={{\n position: \"absolute\",\n right: -5,\n bottom: -5,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: typeMeta.color,\n background: typeMeta.background,\n border: `1px solid ${typeMeta.border}`,\n boxShadow: \"0 1px 4px rgb(var(--btn-bevel) / 0.18)\",\n }}\n >\n {typeMeta.icon}\n </span>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n minWidth: 0,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: isAgentExpired ? EXPIRED_AGENT_COLOR : profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {wallet.name || \"Unnamed\"}\n </p>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: isAgentExpired\n ? \"rgba(245,158,11,0.76)\"\n : profileColors.muted,\n fontFamily: fontFamily.mono,\n }}\n >\n {wallet.ethereumAddress?.slice(0, 6)}...\n {wallet.ethereumAddress?.slice(-4)}\n </p>\n </div>\n {agentExpiryTitle && (\n <AgentExpiryWarningIcon\n message={agentExpiryTitle}\n onClick={onRenewAgentWallet}\n />\n )}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n opacity: hovered ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n {wallet.isAgent && onRenewAgentWallet && (\n <IconBtn\n color={isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accent}\n hoverBackgroundColor={\n isAgentExpired\n ? \"rgba(245,158,11,0.12)\"\n : colors.accentHoverBackground\n }\n title=\"Renew agent wallet\"\n ariaLabel={`Renew agent wallet for ${wallet.name || \"wallet\"}`}\n onClick={onRenewAgentWallet}\n >\n <RefreshCw size={13} />\n </IconBtn>\n )}\n {onShowPortfolio && (\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"View portfolio\"\n ariaLabel={`View portfolio for ${wallet.name || \"wallet\"}`}\n onClick={onShowPortfolio}\n >\n <LayoutDashboard size={13} />\n </IconBtn>\n )}\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"Rename wallet\"\n ariaLabel={`Rename ${wallet.name || \"wallet\"}`}\n onClick={onRename}\n >\n <Pencil size={13} />\n </IconBtn>\n <IconBtn\n color=\"#ef4444\"\n hoverBackgroundColor=\"rgba(239,68,68,0.1)\"\n title=\"Delete wallet\"\n ariaLabel={`Delete ${wallet.name || \"wallet\"}`}\n onClick={onDelete}\n >\n <Trash2 size={13} />\n </IconBtn>\n </div>\n </div>\n );\n}\n\nfunction IconBtn({\n children,\n color,\n hoverBackgroundColor,\n title,\n ariaLabel,\n onClick,\n}: {\n children: ReactNode;\n color: string;\n hoverBackgroundColor?: string;\n title: string;\n ariaLabel: string;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n title={title}\n aria-label={ariaLabel}\n style={{\n padding: 6,\n borderRadius: 4,\n background: hovered\n ? (hoverBackgroundColor ?? \"transparent\")\n : \"transparent\",\n border: \"none\",\n color: hovered ? color : profileColors.muted,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms, background 120ms\",\n }}\n >\n {children}\n </button>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n SpinKeyframes,\n Trash2,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n dangerOutlineButtonStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface DeleteWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number) => Promise<void>;\n /** Optional toast callback. Fires `{type:\"success\"}` on delete; errors are shown inline. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n}\n\nconst DANGER_BG = \"rgba(248,113,113,0.07)\";\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgb(var(--line))\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst warningBoxStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 14,\n background: DANGER_BG,\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: \"1px solid rgb(var(--line))\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (disabled: boolean): CSSProperties => ({\n width: \"100%\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst deleteButtonStyle = (\n enabled: boolean,\n hovered: boolean,\n): CSSProperties => ({\n ...dangerOutlineButtonStyle(enabled, hovered),\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n transition: \"background-color 150ms, color 150ms, border-color 150ms\",\n});\n\nexport function DeleteWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: DeleteWalletModalProps): ReactNode {\n const [confirmName, setConfirmName] = useState(\"\");\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [deleteHovered, setDeleteHovered] = useState(false);\n\n const walletName = wallet?.name || \"Unnamed Wallet\";\n const displayAddress = wallet?.ethereumAddress;\n const isNameMatch = confirmName === walletName;\n const canDelete = isNameMatch && !isDeleting;\n\n const handleClose = useCallback(() => {\n if (isDeleting) return;\n setConfirmName(\"\");\n setError(null);\n onClose();\n }, [isDeleting, onClose]);\n\n const handleDelete = useCallback(async () => {\n if (!wallet || !isNameMatch) return;\n setError(null);\n setIsDeleting(true);\n try {\n await onConfirm(wallet.id);\n setConfirmName(\"\");\n onNotify?.({ type: \"success\", message: \"Wallet deleted successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to delete wallet\");\n } finally {\n setIsDeleting(false);\n }\n }, [wallet, isNameMatch, onConfirm, onClose, onNotify]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle} onClick={handleClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Delete Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isDeleting}\n style={makeCloseBtnStyle(isDeleting)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={warningBoxStyle}>\n <AlertTriangle\n size={15}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n fontWeight: 500,\n }}\n >\n This action cannot be undone\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: \"rgba(248,113,113,0.7)\",\n }}\n >\n The private key will be permanently deleted. Any remaining\n funds will be inaccessible.\n </p>\n </div>\n </div>\n\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet to delete\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {walletName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>\n Type{\" \"}\n <span\n style={{\n color: profileColors.text,\n fontWeight: 500,\n }}\n >\n &quot;{walletName}&quot;\n </span>{\" \"}\n to confirm\n </label>\n <input\n type=\"text\"\n value={confirmName}\n onChange={(e) => setConfirmName(e.target.value)}\n placeholder={walletName}\n disabled={isDeleting}\n className=\"input text-content placeholder-content-faint\"\n style={inputStyle(isDeleting)}\n />\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleDelete}\n disabled={!canDelete}\n onMouseEnter={() => setDeleteHovered(true)}\n onMouseLeave={() => setDeleteHovered(false)}\n style={deleteButtonStyle(canDelete, deleteHovered)}\n >\n {isDeleting ? (\n <>\n <Loader2 size={14} /> Deleting...\n </>\n ) : (\n <>\n <Trash2 size={14} /> Delete Wallet\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Theme tokens consumed by inline `style={{}}` props. Values resolve to\n * `rgb(var(--token) / alpha)` strings so the active theme (set by the host\n * via `:root` / `.light` in `src/tailwind.css`) flows through on every paint\n * without any JS-side reactivity.\n */\nexport const profileColors = {\n // Accent stays a literal hex — host may override via the accentColor prop\n // and helpers below expect a parseable color.\n accent: \"#a855f7\",\n\n panel: \"rgb(var(--surface-modal) / 0.8)\",\n panelSolid: \"rgb(var(--surface-modal))\",\n backdrop: \"rgb(var(--overlay) / 0.7)\",\n border: \"rgb(var(--line))\",\n\n surfaceBtn: \"rgb(var(--surface-btn))\",\n surfaceBtnHover: \"rgb(var(--surface-btn-hover))\",\n surfaceBtnActive: \"rgb(var(--surface-btn-active))\",\n surfaceBd: \"rgb(var(--surface-bd))\",\n surfaceBdHover: \"rgb(var(--surface-bd-hover))\",\n surfaceBdActive: \"rgb(var(--surface-bd-active))\",\n\n text: \"rgb(var(--content))\",\n muted: \"rgb(var(--content-muted))\",\n subdued: \"rgb(var(--content-subtle))\",\n disabled: \"rgb(var(--content-disabled))\",\n\n danger: \"rgb(var(--trade-down))\",\n // Keep the punchier red literal for hover backgrounds where we want a\n // specific warm tint regardless of theme.\n dangerStrong: \"#ef4444\",\n purple: \"rgb(var(--purple-400))\",\n yellow: \"rgb(var(--amber-400))\",\n};\n\nexport const fontFamily = {\n sans: \"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif\",\n mono: \"Google Sans Code, Roboto Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n};\n\nexport interface PrincipalColors {\n accent: string;\n accentText: string;\n accentBackground: string;\n accentBorder: string;\n accentHoverBackground: string;\n}\n\nexport type PrincipalColorOverrides = Partial<PrincipalColors>;\n\nconst parseSrgb = (color: string): [number, number, number] | null => {\n const value = color.trim();\n const shortHex = /^#([0-9a-f]{3})$/i.exec(value);\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((c) => parseInt(c + c, 16)) as [\n number,\n number,\n number,\n ];\n return [r, g, b];\n }\n const longHex = /^#([0-9a-f]{6})$/i.exec(value);\n if (longHex) {\n const v = longHex[1];\n return [\n parseInt(v.slice(0, 2), 16),\n parseInt(v.slice(2, 4), 16),\n parseInt(v.slice(4, 6), 16),\n ];\n }\n const rgb =\n /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i.exec(\n value,\n );\n if (rgb) {\n return [parseInt(rgb[1], 10), parseInt(rgb[2], 10), parseInt(rgb[3], 10)];\n }\n return null;\n};\n\n/**\n * WCAG-style relative luminance in [0, 1]. Returns `null` for color formats\n * the parser doesn't understand (named colors, hsl, color-mix, …).\n */\nexport const relativeLuminance = (color: string): number | null => {\n const rgb = parseSrgb(color);\n if (!rgb) return null;\n const [r, g, b] = rgb.map((c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n }) as [number, number, number];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/**\n * Picks a readable foreground for `background`. Falls back to `lightFg` when\n * the background can't be parsed.\n */\nexport const pickContrastColor = (\n background: string,\n lightFg: string = \"#ffffff\",\n darkFg: string = \"#0a0a0a\",\n): string => {\n const lum = relativeLuminance(background);\n if (lum === null) return lightFg;\n return lum > 0.5 ? darkFg : lightFg;\n};\n\nexport const colorWithAlpha = (color: string, alpha: number): string => {\n const hex = color.trim();\n const shortHex = /^#([0-9a-f]{3})$/i.exec(hex);\n const longHex = /^#([0-9a-f]{6})$/i.exec(hex);\n\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((value) => value + value);\n return `rgba(${parseInt(r, 16)},${parseInt(g, 16)},${parseInt(b, 16)},${alpha})`;\n }\n\n if (longHex) {\n const value = longHex[1];\n return `rgba(${parseInt(value.slice(0, 2), 16)},${parseInt(\n value.slice(2, 4),\n 16,\n )},${parseInt(value.slice(4, 6), 16)},${alpha})`;\n }\n\n return `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`;\n};\n\nexport const resolvePrincipalColors = (\n accentColor?: string,\n overrides: PrincipalColorOverrides = {},\n): PrincipalColors => {\n const hasCustomAccent = !!accentColor || !!overrides.accent;\n const accent = overrides.accent ?? accentColor ?? profileColors.accent;\n const accentText =\n overrides.accentText ?? (hasCustomAccent ? accent : profileColors.purple);\n\n return {\n accent,\n accentText,\n accentBackground: overrides.accentBackground ?? colorWithAlpha(accent, 0.1),\n accentBorder: overrides.accentBorder ?? colorWithAlpha(accent, 0.25),\n accentHoverBackground:\n overrides.accentHoverBackground ?? colorWithAlpha(accent, 0.1),\n };\n};\n\nexport const modalBackdropStyle = (zIndex: number): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n background: profileColors.backdrop,\n backdropFilter: \"blur(4px)\",\n WebkitBackdropFilter: \"blur(4px)\",\n});\n\nexport const modalWrapperStyle = (\n zIndex: number,\n padding = 0,\n): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding,\n});\n\nexport const modalPanelStyle = (solid = false): CSSProperties => ({\n position: \"relative\",\n width: \"100%\",\n maxWidth: 448,\n background: solid ? profileColors.panelSolid : profileColors.panel,\n backdropFilter: solid ? undefined : \"blur(10px)\",\n WebkitBackdropFilter: solid ? undefined : \"blur(10px)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n boxShadow: \"var(--shadow-modal)\",\n overflow: \"hidden\",\n fontFamily: fontFamily.sans,\n});\n\nexport const modalHeaderStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"24px 24px 20px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nexport const titleStyle: CSSProperties = {\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n};\n\nexport const closeBtnStyle = (disabled = false): CSSProperties => ({\n position: \"absolute\",\n right: 24,\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n padding: 0,\n display: \"flex\",\n opacity: disabled ? 0.4 : 1,\n transition: \"color 150ms\",\n});\n\nexport const upperLabelStyle: CSSProperties = {\n fontSize: 11,\n lineHeight: \"1rem\",\n fontWeight: 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.1em\",\n};\n\n/**\n * Raised button surface, computed inline. Uses `--btn-bevel` for the top\n * sheen so dark theme keeps the white-bevel look while light theme picks up\n * a dark bevel (host sets `--btn-bevel: 15 23 42` under `.light`).\n */\nexport const raisedButtonStyle = (\n state: \"default\" | \"hover\" | \"active\" | \"disabled\" = \"default\",\n): CSSProperties => {\n if (state === \"active\") {\n return {\n backgroundColor: profileColors.surfaceBtnActive,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.05), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.18), inset 0 -1px 0 rgba(0,0,0,0.45), inset 0 0 0 1px rgb(var(--surface-bd-active)), 0 1px 2px rgba(0,0,0,0.5)\",\n color: profileColors.text,\n border: \"none\",\n };\n }\n\n if (state === \"disabled\") {\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.02), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.05), inset 0 -1px 0 rgba(0,0,0,0.25), inset 0 0 0 1px rgb(var(--surface-bd) / 0.6)\",\n color: profileColors.subdued,\n border: \"none\",\n cursor: \"not-allowed\",\n };\n }\n\n if (state === \"hover\") {\n return {\n backgroundColor: profileColors.surfaceBtnHover,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.04), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.14), inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 0 0 1px rgb(var(--surface-bd-hover))\",\n color: \"rgb(var(--content-tertiary))\",\n border: \"none\",\n };\n }\n\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.03), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.10), inset 0 -1px 0 rgba(0,0,0,0.35), inset 0 0 0 1px rgb(var(--surface-bd))\",\n color: profileColors.muted,\n border: \"none\",\n };\n};\n\nexport const dangerOutlineButtonStyle = (\n enabled: boolean,\n hovered = false,\n): CSSProperties => ({\n background: enabled && hovered ? \"rgba(248,113,113,0.1)\" : \"transparent\",\n border: `1px solid ${\n enabled ? profileColors.danger : \"rgb(var(--line-strong))\"\n }`,\n color: enabled ? profileColors.danger : profileColors.disabled,\n cursor: enabled ? \"pointer\" : \"not-allowed\",\n});\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useEffect,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n Pencil,\n SpinKeyframes,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface RenameWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number, name: string) => Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Kept for compatibility. Profile modal actions now use the shared app raised button style. */\n accentColor?: string;\n}\n\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\nconst WALLET_NAME_REGEX = /^[a-zA-Z0-9/]+$/;\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgb(var(--line))\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: \"1px solid rgb(var(--line))\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (disabled: boolean): CSSProperties => ({\n width: \"100%\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst saveButtonStyle: CSSProperties = {\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n};\n\nexport function RenameWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: RenameWalletModalProps): ReactNode {\n const [name, setName] = useState(\"\");\n const [isRenaming, setIsRenaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const currentName = wallet?.name || \"Unnamed\";\n const displayAddress = wallet?.ethereumAddress;\n const trimmedName = name.trim();\n const isNameChanged = trimmedName !== currentName;\n const isNameValid = WALLET_NAME_REGEX.test(trimmedName);\n const canSubmit = isNameValid && isNameChanged && !isRenaming;\n\n useEffect(() => {\n if (!wallet) return;\n setName(wallet.name || \"\");\n setError(null);\n }, [wallet]);\n\n const handleClose = useCallback(() => {\n if (isRenaming) return;\n setError(null);\n onClose();\n }, [isRenaming, onClose]);\n\n const handleRename = useCallback(async () => {\n if (!wallet || !isNameValid || !isNameChanged) return;\n setError(null);\n setIsRenaming(true);\n try {\n await onConfirm(wallet.id, trimmedName);\n onNotify?.({ type: \"success\", message: \"Wallet renamed successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to rename wallet\");\n } finally {\n setIsRenaming(false);\n }\n }, [\n wallet,\n isNameValid,\n isNameChanged,\n onConfirm,\n trimmedName,\n onClose,\n onNotify,\n ]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle} onClick={handleClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Rename Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isRenaming}\n style={makeCloseBtnStyle(isRenaming)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {currentName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>Wallet name</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleRename();\n if (e.key === \"Escape\") handleClose();\n }}\n disabled={isRenaming}\n placeholder=\"Wallet name\"\n className={`input text-content placeholder-content-faint ${\n error ? \"input-error\" : \"\"\n }`}\n style={inputStyle(isRenaming)}\n />\n <p\n style={{\n margin: \"8px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n }}\n >\n Use letters, numbers, and / only.\n </p>\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleRename}\n disabled={!canSubmit}\n className={canSubmit ? \"btn-raised\" : \"btn-raised-disabled\"}\n style={saveButtonStyle}\n >\n {isRenaming ? (\n <>\n <Loader2 size={14} /> Saving...\n </>\n ) : (\n <>\n <Pencil size={14} /> Save Name\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { ExchangeClient } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport type {\n HyperliquidScaleCreateRequest,\n HyperliquidTwapCreateRequest,\n HyperliquidTwapModifyRequest,\n} from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type {\n HyperliquidWalletScaleSession,\n HyperliquidWalletTwapSession,\n} from \"hypurr-grpc/ts/hypurr/tools\";\nimport type {\n TelegramChatWalletPack,\n TelegramUserAddressBookEntry,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\n// ─── Config ──────────────────────────────────────────────────────\n\nexport interface HypurrConnectConfig {\n /** Auth hub client identifier. Sent as `client_id` during Telegram login. */\n clientId: string;\n /** gRPC-web base URL. Defaults to https://grpc.hypurr.fun. */\n grpcUrl?: string;\n /** Media base URL for user-uploaded assets. Defaults to https://media.hypurr.fun. */\n mediaUrl?: string;\n grpcTimeout?: number;\n isTestnet?: boolean;\n /** Polling interval in ms for TWAP/Scale session updates. Default 5000. Set 0 to disable. */\n sessionPollInterval?: number;\n telegram?: {\n /** Auth hub login URL. Defaults to https://auth.hypurr.fun/login. */\n authHubUrl?: string;\n /** Optional callback URL. Defaults to the current page without auth query params. */\n returnTo?: string | (() => string);\n /** Requested hub scopes. Defaults to the scopes required by this SDK. */\n scope?: string | string[];\n /** @deprecated Telegram login is handled by the auth hub; this option is ignored. */\n useWidget?: boolean;\n };\n}\n\n// ─── Telegram login ──────────────────────────────────────────────\n\n/** @deprecated Telegram login is handled by the auth hub; raw Telegram data is no longer used by the provider. */\nexport interface TelegramLoginData {\n id: number;\n first_name: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: number;\n hash: string;\n}\n\n// ─── Auth ────────────────────────────────────────────────────────\n\nexport type AuthMethod = \"telegram\" | \"eoa\" | null;\n\nexport interface HypurrUser {\n address: string;\n walletId: number;\n displayName: string;\n photoUrl?: string;\n authMethod: AuthMethod;\n telegramId?: string;\n hfunScore?: number;\n reputationScore?: number;\n /** Saved address-book entries (Telegram users only). */\n addressBook?: TelegramUserAddressBookEntry[];\n}\n\n// ─── Agent (EOA flow) ────────────────────────────────────────────\n\nexport interface StoredAgent {\n privateKey: `0x${string}`;\n address: `0x${string}`;\n approvedAt: number;\n /** Epoch ms from the `extraAgents` response; agent is invalid after this time. */\n validUntil: number;\n}\n\nexport type SignTypedDataFn = (params: {\n domain: Record<string, unknown>;\n types: Record<string, { name: string; type: string }[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}) => Promise<`0x${string}`>;\n\nexport type Hex = `0x${string}`;\n\nexport interface EvmTransactionRequest {\n from?: Hex;\n to?: Hex;\n gas?: Hex;\n gasPrice?: Hex;\n value?: Hex;\n data?: Hex;\n nonce?: Hex;\n chainId?: Hex;\n maxFeePerGas?: Hex;\n maxPriorityFeePerGas?: Hex;\n type?: Hex;\n accessList?: unknown;\n [key: string]: unknown;\n}\n\nexport type EvmRequestFn = (args: {\n method: string;\n params?: unknown[];\n}) => Promise<unknown>;\n\nexport type SignEvmTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<Hex>;\n\nexport type EoaSignTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<unknown>;\n\n/** Wallet signer provided at EOA connect time for user-signed actions. */\nexport interface EoaSigner {\n signTypedData: SignTypedDataFn;\n /** Optional raw EVM transaction signer. Used by `signEvmTransaction()` in EOA mode. */\n signTransaction?: EoaSignTransactionFn;\n /** Optional EIP-1193 provider request function. Used as a fallback for `eth_signTransaction`. */\n request?: EvmRequestFn;\n chainId: number;\n}\n\nexport interface EoaSignerOptions {\n signTransaction?: EoaSignTransactionFn;\n request?: EvmRequestFn;\n}\n\nexport interface RenewAgentWalletParams {\n walletId: number;\n /** Connected owner wallet address that will sign the approveAgent transaction. */\n ownerAddress: Hex;\n signTypedDataAsync: SignTypedDataFn;\n chainId: number;\n /** Approval length used when `agentName` is omitted. Defaults to 1 day. */\n approvalDurationMs?: number;\n /** Hyperliquid agent name to approve. Defaults to the Telegram agent-wallet valid_until name. */\n agentName?: string;\n}\n\n/**\n * Create an {@link EoaSigner} from any EIP-712 signing function.\n *\n * Accepts either a direct function or a `{ current }` ref object so the\n * signer always calls through to the latest function (avoids stale closures\n * with React hooks like wagmi's `useSignTypedData`).\n *\n * @example wagmi v2 — ref pattern (recommended)\n * ```ts\n * const { signTypedDataAsync } = useSignTypedData();\n * const chainId = useChainId();\n * const signerRef = useRef(signTypedDataAsync);\n * signerRef.current = signTypedDataAsync; // stays fresh every render\n *\n * // call once — the ref keeps it up to date\n * connectEoa(address, createEoaSigner(signerRef, chainId));\n * ```\n *\n * @example direct function (e.g. from viem WalletClient)\n * ```ts\n * connectEoa(address, createEoaSigner(client.signTypedData, chainId));\n * ```\n */\nexport function createEoaSigner(\n signTypedDataAsync:\n | ((args: Record<string, unknown>) => Promise<`0x${string}`>)\n | { current: (args: Record<string, unknown>) => Promise<`0x${string}`> },\n chainId: number,\n options: EoaSignerOptions = {},\n): EoaSigner {\n const resolve =\n typeof signTypedDataAsync === \"function\"\n ? signTypedDataAsync\n : (args: Record<string, unknown>) => signTypedDataAsync.current(args);\n return {\n signTypedData: (params) => resolve(params),\n signTransaction: options.signTransaction,\n request: options.request,\n chainId,\n };\n}\n\n// ─── TWAP / Scale param types ────────────────────────────────────\n// Omit authData & walletId — auto-filled from context using the selected wallet.\n\nexport type TwapCreateParams = Omit<\n HyperliquidTwapCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type TwapModifyParams = Omit<\n HyperliquidTwapModifyRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type ScaleCreateParams = Omit<\n HyperliquidScaleCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\n// ─── Context state ───────────────────────────────────────────────\n\nexport interface HypurrConnectState {\n // Auth\n user: HypurrUser | null;\n isLoggedIn: boolean;\n isLoading: boolean;\n error: string | null;\n authMethod: AuthMethod;\n\n // SDK ExchangeClient — handles both L1 (agent-signed) and user-signed actions.\n // Telegram: backed by GrpcExchangeTransport (HyperliquidCoreAction)\n // EOA: uses a dual wallet — agent key for L1 actions, master wallet for\n // user-signed actions (transfers, withdrawals, etc.) when a signer is provided.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exchange: ExchangeClient<any> | null;\n\n // Multi-wallet (Telegram only — EOA has a single wallet)\n wallets: HyperliquidWallet[];\n selectedWalletId: number;\n selectWallet: (walletId: number) => void;\n\n // Wallet management (Telegram only)\n createWallet: (name: string) => Promise<HyperliquidWallet>;\n deleteWallet: (walletId: number) => Promise<void>;\n renameWallet: (walletId: number, name: string) => Promise<void>;\n renewAgentWallet: (params: RenewAgentWalletParams) => Promise<void>;\n refreshWallets: () => void;\n\n // Wallet packs & labels (Telegram only)\n packs: TelegramChatWalletPack[];\n createWalletPack: (name: string) => Promise<number>;\n addPackLabel: (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n modifyPackLabel: (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }) => Promise<void>;\n removePackLabel: (params: {\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n\n // TWAP sessions (Telegram only)\n createTwap: (\n params: TwapCreateParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n modifyTwap: (\n params: TwapModifyParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n cancelTwap: (sessionId: number) => Promise<void>;\n\n // Scale sessions (Telegram only)\n createScale: (\n params: ScaleCreateParams,\n ) => Promise<HyperliquidWalletScaleSession>;\n cancelScale: (sessionId: number) => Promise<void>;\n\n // Login modal\n loginModalOpen: boolean;\n openLoginModal: () => void;\n closeLoginModal: () => void;\n\n // Auth actions\n connectEoa: (address: `0x${string}`, signer?: EoaSigner) => void;\n signEvmTransaction: SignEvmTransactionFn;\n approveAgent: (\n signTypedDataAsync: SignTypedDataFn,\n chainId: number,\n ) => Promise<void>;\n logout: () => void;\n\n // EOA agent management\n agent: StoredAgent | null;\n agentReady: boolean;\n clearAgent: () => void;\n\n // Low-level access\n /** Deprecated: JWT auth leaves authData empty; use `telegramRpcOptions` for low-level calls. */\n authDataMap: Record<string, string>;\n authToken: string | null;\n telegramRpcOptions?: RpcOptions;\n telegramClient: TelegramClient;\n staticClient: StaticClient;\n}\n"],"mappings":"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","names":["user","isTestnet","useCallback","jsx","jsx","jsxs","jsx","jsxs","useCallback","AnimatePresence","motion","useCallback","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","AnimatePresence","motion","AnimatePresence","motion","useCallback","useMemo","useState","Fragment","jsx","jsxs","formatAddress","useState","useMemo","useCallback","AnimatePresence","motion","ApprovalDurationPicker","AnimatePresence","motion","Fragment","useCallback","useMemo","useState","useCallback","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useCallback","AnimatePresence","motion","useCallback","useState","AnimatePresence","motion","useCallback","useState","modalWrapperStyle","Fragment","jsx","jsxs","backdropStyle","modalWrapperStyle","useState","useCallback","AnimatePresence","motion","AnimatePresence","motion","useCallback","useEffect","useState","Fragment","jsx","jsxs","DANGER_BORDER","WALLET_NAME_REGEX","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","bodyStyle","infoBoxStyle","labelStyle","inputStyle","footerStyle","useState","useEffect","useCallback","AnimatePresence","motion","Fragment","jsx","jsxs","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","useState","useCallback","AnimatePresence","motion","Fragment","jsx","jsxs","DEFAULT_BACKGROUND_COLOR","useState","useCallback","useMemo","WalletRow","AnimatePresence","motion"]}
1
+ {"version":3,"sources":["#style-inject:#style-inject","../src/styles.css","../src/HypurrConnectProvider.tsx","../src/privateKeySigner.ts","../src/agent.ts","../src/grpc.ts","../src/GrpcExchangeTransport.ts","../src/agentWallet.ts","../src/LoginModal.tsx","../src/useIsMobile.ts","../src/icons/MetaMaskColorIcon.tsx","../src/icons/TelegramColorIcon.tsx","../src/AddWalletModal.tsx","../src/icons/lucide.tsx","../src/RenewAgentModal.tsx","../src/WalletSelectorDropdown.tsx","../src/AgentExpiryWarning.tsx","../src/UserProfileModal.tsx","../src/DeleteWalletModal.tsx","../src/profileStyles.ts","../src/RenameWalletModal.tsx","../src/types.ts"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@import \\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Google+Sans+Code:wght@400;500;600;700&display=swap\\\";\\n.hypurr-connect .btn-raised {\\n background-color: rgb(var(--btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.03),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.1),\\n inset 0 -1px 0 rgba(0, 0, 0, .35),\\n inset 0 0 0 1px rgb(var(--btn-ring));\\n color: rgb(var(--btn-fg));\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.hypurr-connect .btn-raised:hover:not(:disabled) {\\n background-color: rgb(var(--surface-btn-hover));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.04),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.14),\\n inset 0 -1px 0 rgba(0, 0, 0, .4),\\n inset 0 0 0 1px rgb(var(--surface-bd-hover));\\n color: rgb(var(--content-tertiary));\\n}\\n.hypurr-connect .btn-raised-active {\\n background-color: rgb(var(--surface-btn-active));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.05),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.18),\\n inset 0 -1px 0 rgba(0, 0, 0, .45),\\n inset 0 0 0 1px rgb(var(--surface-bd-active)),\\n 0 1px 2px rgba(0, 0, 0, .5);\\n color: rgb(var(--content));\\n}\\n.hypurr-connect .btn-raised-accent,\\n.hypurr-connect .btn-raised-active {\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.hypurr-connect .btn-raised-accent {\\n background-color: rgb(var(--accent-btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.03),\\n transparent);\\n box-shadow: inset 0 1px 0 rgb(var(--btn-bevel)/.1), inset 0 -1px 0 rgb(var(--accent-btn-inset)/.75);\\n color: rgb(var(--accent-btn-fg));\\n}\\n.hypurr-connect .btn-raised-accent:hover:not(:disabled) {\\n background-color: rgb(var(--accent-btn-bg-hover));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.04),\\n transparent);\\n box-shadow: inset 0 1px 0 rgb(var(--btn-bevel)/.14), inset 0 -1px 0 rgb(var(--accent-btn-inset)/.8);\\n color: rgb(var(--accent-btn-fg-hover));\\n}\\n.hypurr-connect .btn-raised-disabled {\\n background-color: rgb(var(--btn-bg));\\n background-image:\\n linear-gradient(\\n to bottom,\\n rgb(var(--btn-bevel)/.02),\\n transparent);\\n box-shadow:\\n inset 0 1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 -1px 0 rgba(0, 0, 0, .25),\\n inset 0 0 0 1px rgb(var(--btn-ring)/.6);\\n color: rgb(var(--content-faint));\\n cursor: not-allowed;\\n transition:\\n background-color .15s,\\n color .15s,\\n background-image .15s,\\n box-shadow .15s;\\n}\\n.light .hypurr-connect .btn-raised {\\n background-image:\\n linear-gradient(\\n to bottom,\\n #fff,\\n rgb(var(--surface-btn)));\\n box-shadow:\\n 0 1px 2px rgba(15, 23, 42, .08),\\n 0 1px 1px rgba(15, 23, 42, .04),\\n inset 0 0 0 1px rgb(var(--surface-bd));\\n}\\n.light .hypurr-connect .btn-raised:hover:not(:disabled) {\\n background-image:\\n linear-gradient(\\n to bottom,\\n #fff,\\n rgb(var(--surface-btn-hover)));\\n box-shadow:\\n 0 2px 6px rgba(15, 23, 42, .12),\\n 0 1px 2px rgba(15, 23, 42, .06),\\n inset 0 0 0 1px rgb(var(--surface-bd-hover));\\n}\\n.light .hypurr-connect .btn-raised-active {\\n background-image: none;\\n background-color: rgb(var(--surface-btn-active));\\n box-shadow: inset 0 1px 2px rgba(15, 23, 42, .12), inset 0 0 0 1px rgb(var(--surface-bd-active));\\n}\\n.light .hypurr-connect .btn-raised-disabled {\\n background-image: none;\\n box-shadow: inset 0 0 0 1px rgb(var(--surface-bd));\\n}\\n.light .hypurr-connect .btn-raised-accent {\\n box-shadow: 0 1px 2px rgba(124, 58, 237, .18), inset 0 0 0 1px rgba(124, 58, 237, .22);\\n}\\n.light .hypurr-connect .btn-raised-accent:hover:not(:disabled) {\\n box-shadow: 0 2px 6px rgba(124, 58, 237, .24), inset 0 0 0 1px rgba(124, 58, 237, .28);\\n}\\n.hypurr-connect .input {\\n background-color: rgb(var(--input-bg));\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .5),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 0 0 1px rgb(var(--input-ring));\\n color: rgb(var(--content));\\n transition: box-shadow .15s, background-color .15s;\\n}\\n.hypurr-connect .input::-moz-placeholder {\\n color: rgb(var(--content-faint));\\n opacity: 1;\\n}\\n.hypurr-connect .input::placeholder {\\n color: rgb(var(--content-faint));\\n opacity: 1;\\n}\\n.hypurr-connect .input:focus,\\n.hypurr-connect .input:focus-within {\\n background-color: rgb(var(--input-bg-focus));\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .45),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.06),\\n inset 0 0 0 1px rgb(var(--input-ring-focus));\\n}\\n.hypurr-connect .input-error,\\n.hypurr-connect .input-error:focus,\\n.hypurr-connect .input-error:focus-within {\\n box-shadow:\\n inset 0 2px 4px rgba(0, 0, 0, .5),\\n inset 0 -1px 0 rgb(var(--btn-bevel)/.05),\\n inset 0 0 0 1px hsla(0, 91%, 71%, .7);\\n}\\n.light .hypurr-connect .input {\\n box-shadow: inset 0 2px 3px rgba(15, 23, 42, .08), inset 0 0 0 1px rgb(var(--input-ring));\\n}\\n.light .hypurr-connect .input:focus,\\n.light .hypurr-connect .input:focus-within {\\n box-shadow: inset 0 2px 4px rgba(15, 23, 42, .1), inset 0 0 0 1px rgb(var(--input-ring-focus));\\n}\\n.light .hypurr-connect .input-error,\\n.light .hypurr-connect .input-error:focus,\\n.light .hypurr-connect .input-error:focus-within {\\n box-shadow: inset 0 2px 3px rgba(15, 23, 42, .08), inset 0 0 0 1px rgba(220, 38, 38, .7);\\n}\\n.hypurr-connect .\\\\!visible {\\n visibility: visible !important;\\n}\\n.hypurr-connect .visible {\\n visibility: visible;\\n}\\n.hypurr-connect .fixed {\\n position: fixed;\\n}\\n.hypurr-connect .absolute {\\n position: absolute;\\n}\\n.hypurr-connect .relative {\\n position: relative;\\n}\\n.hypurr-connect .inset-0 {\\n inset: 0;\\n}\\n.hypurr-connect .right-2 {\\n right: .5rem;\\n}\\n.hypurr-connect .right-6 {\\n right: 1.5rem;\\n}\\n.hypurr-connect .top-1\\\\/2 {\\n top: 50%;\\n}\\n.hypurr-connect .z-\\\\[100\\\\] {\\n z-index: 100;\\n}\\n.hypurr-connect .z-\\\\[101\\\\] {\\n z-index: 101;\\n}\\n.hypurr-connect .z-\\\\[110\\\\] {\\n z-index: 110;\\n}\\n.hypurr-connect .z-\\\\[111\\\\] {\\n z-index: 111;\\n}\\n.hypurr-connect .mb-1\\\\.5 {\\n margin-bottom: .375rem;\\n}\\n.hypurr-connect .mb-2 {\\n margin-bottom: .5rem;\\n}\\n.hypurr-connect .mt-0\\\\.5 {\\n margin-top: .125rem;\\n}\\n.hypurr-connect .mt-1 {\\n margin-top: .25rem;\\n}\\n.hypurr-connect .mt-1\\\\.5 {\\n margin-top: .375rem;\\n}\\n.hypurr-connect .block {\\n display: block;\\n}\\n.hypurr-connect .inline-block {\\n display: inline-block;\\n}\\n.hypurr-connect .inline {\\n display: inline;\\n}\\n.hypurr-connect .flex {\\n display: flex;\\n}\\n.hypurr-connect .inline-flex {\\n display: inline-flex;\\n}\\n.hypurr-connect .grid {\\n display: grid;\\n}\\n.hypurr-connect .contents {\\n display: contents;\\n}\\n.hypurr-connect .hidden {\\n display: none;\\n}\\n.hypurr-connect .h-8 {\\n height: 2rem;\\n}\\n.hypurr-connect .w-8 {\\n width: 2rem;\\n}\\n.hypurr-connect .w-full {\\n width: 100%;\\n}\\n.hypurr-connect .min-w-0 {\\n min-width: 0;\\n}\\n.hypurr-connect .max-w-md {\\n max-width: 28rem;\\n}\\n.hypurr-connect .flex-1 {\\n flex: 1 1 0%;\\n}\\n.hypurr-connect .flex-shrink-0 {\\n flex-shrink: 0;\\n}\\n.hypurr-connect .-translate-y-1\\\\/2 {\\n --tw-translate-y:-50%;\\n}\\n.hypurr-connect .-translate-y-1\\\\/2,\\n.hypurr-connect .transform {\\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\\n}\\n.hypurr-connect .grid-cols-4 {\\n grid-template-columns: repeat(4, minmax(0, 1fr));\\n}\\n.hypurr-connect .items-start {\\n align-items: flex-start;\\n}\\n.hypurr-connect .items-center {\\n align-items: center;\\n}\\n.hypurr-connect .justify-center {\\n justify-content: center;\\n}\\n.hypurr-connect .justify-between {\\n justify-content: space-between;\\n}\\n.hypurr-connect .gap-1\\\\.5 {\\n gap: .375rem;\\n}\\n.hypurr-connect .gap-2 {\\n gap: .5rem;\\n}\\n.hypurr-connect .gap-3 {\\n gap: .75rem;\\n}\\n.hypurr-connect :is(.space-y-2 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(.5rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(.5rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect :is(.space-y-3 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(.75rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(.75rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect :is(.space-y-4 > :not([hidden]) ~ :not([hidden])) {\\n --tw-space-y-reverse:0;\\n margin-top: calc(1rem*(1 - var(--tw-space-y-reverse)));\\n margin-bottom: calc(1rem*var(--tw-space-y-reverse));\\n}\\n.hypurr-connect .overflow-hidden {\\n overflow: hidden;\\n}\\n.hypurr-connect .truncate {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.hypurr-connect .break-all {\\n word-break: break-all;\\n}\\n.hypurr-connect .rounded {\\n border-radius: .25rem;\\n}\\n.hypurr-connect .rounded-lg {\\n border-radius: .5rem;\\n}\\n.hypurr-connect .rounded-md {\\n border-radius: .375rem;\\n}\\n.hypurr-connect .border {\\n border-width: 1px;\\n}\\n.hypurr-connect .border-b {\\n border-bottom-width: 1px;\\n}\\n.hypurr-connect .border-amber-500\\\\/25 {\\n border-color: rgb(var(--amber-500)/.25);\\n}\\n.hypurr-connect .border-line {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--line)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-line-strong {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--line-strong)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-surface-bd {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-surface-bd-active {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd-active)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .border-trade-down\\\\/20 {\\n border-color: rgb(var(--trade-down)/.2);\\n}\\n.hypurr-connect .bg-amber-500\\\\/\\\\[0\\\\.08\\\\] {\\n background-color: rgb(var(--amber-500)/.08);\\n}\\n.hypurr-connect .bg-overlay\\\\/70 {\\n background-color: rgb(var(--overlay)/.7);\\n}\\n.hypurr-connect .bg-surface-btn {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-btn-active {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-active)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-btn-hover {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-hover)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-surface-modal {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-modal)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .bg-trade-down\\\\/\\\\[0\\\\.08\\\\] {\\n background-color: rgb(var(--trade-down)/.08);\\n}\\n.hypurr-connect .p-1\\\\.5 {\\n padding: .375rem;\\n}\\n.hypurr-connect .p-3 {\\n padding: .75rem;\\n}\\n.hypurr-connect .p-4 {\\n padding: 1rem;\\n}\\n.hypurr-connect .px-2 {\\n padding-left: .5rem;\\n padding-right: .5rem;\\n}\\n.hypurr-connect .px-3 {\\n padding-left: .75rem;\\n padding-right: .75rem;\\n}\\n.hypurr-connect .px-6 {\\n padding-left: 1.5rem;\\n padding-right: 1.5rem;\\n}\\n.hypurr-connect .py-1 {\\n padding-top: .25rem;\\n padding-bottom: .25rem;\\n}\\n.hypurr-connect .py-1\\\\.5 {\\n padding-top: .375rem;\\n padding-bottom: .375rem;\\n}\\n.hypurr-connect .py-2 {\\n padding-top: .5rem;\\n padding-bottom: .5rem;\\n}\\n.hypurr-connect .py-2\\\\.5 {\\n padding-top: .625rem;\\n padding-bottom: .625rem;\\n}\\n.hypurr-connect .py-5 {\\n padding-top: 1.25rem;\\n}\\n.hypurr-connect .pb-5,\\n.hypurr-connect .py-5 {\\n padding-bottom: 1.25rem;\\n}\\n.hypurr-connect .pb-6 {\\n padding-bottom: 1.5rem;\\n}\\n.hypurr-connect .pr-11 {\\n padding-right: 2.75rem;\\n}\\n.hypurr-connect .pt-5 {\\n padding-top: 1.25rem;\\n}\\n.hypurr-connect .pt-6 {\\n padding-top: 1.5rem;\\n}\\n.hypurr-connect .font-mono {\\n font-family:\\n Google Sans Code,\\n Roboto Mono,\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n monospace;\\n}\\n.hypurr-connect .font-sans {\\n font-family:\\n Inter,\\n ui-sans-serif,\\n system-ui,\\n -apple-system,\\n BlinkMacSystemFont,\\n Segoe UI,\\n Roboto,\\n Helvetica Neue,\\n Arial,\\n sans-serif;\\n}\\n.hypurr-connect .text-base {\\n font-size: 12.5px;\\n line-height: 1rem;\\n}\\n.hypurr-connect .text-lg {\\n font-size: 14px;\\n line-height: 1.25rem;\\n}\\n.hypurr-connect .font-medium {\\n font-weight: 500;\\n}\\n.hypurr-connect .uppercase {\\n text-transform: uppercase;\\n}\\n.hypurr-connect .tabular-nums {\\n --tw-numeric-spacing:tabular-nums;\\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\\n}\\n.hypurr-connect .tracking-\\\\[0\\\\.1em\\\\] {\\n letter-spacing: .1em;\\n}\\n.hypurr-connect .text-amber-200 {\\n --tw-text-opacity:1;\\n color: rgb(var(--amber-200)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-amber-400 {\\n --tw-text-opacity:1;\\n color: rgb(var(--amber-400)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content {\\n --tw-text-opacity:1;\\n color: rgb(var(--content)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-faint {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-muted {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-muted)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-content-subtle {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-subtle)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-trade-down {\\n --tw-text-opacity:1;\\n color: rgb(var(--trade-down)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .text-trade-up {\\n --tw-text-opacity:1;\\n color: rgb(var(--trade-up)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .placeholder-content-faint::-moz-placeholder {\\n --tw-placeholder-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-placeholder-opacity,1));\\n}\\n.hypurr-connect .placeholder-content-faint::placeholder {\\n --tw-placeholder-opacity:1;\\n color: rgb(var(--content-faint)/var(--tw-placeholder-opacity,1));\\n}\\n.hypurr-connect .shadow-modal {\\n --tw-shadow:var(--shadow-modal);\\n --tw-shadow-colored:var(--shadow-modal);\\n box-shadow:\\n var(--tw-ring-offset-shadow,0 0 #0000),\\n var(--tw-ring-shadow,0 0 #0000),\\n var(--tw-shadow);\\n}\\n.hypurr-connect .outline {\\n outline-style: solid;\\n}\\n.hypurr-connect .blur {\\n --tw-blur:blur(8px);\\n}\\n.hypurr-connect .blur,\\n.hypurr-connect .drop-shadow {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.hypurr-connect .drop-shadow {\\n --tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06));\\n}\\n.hypurr-connect .filter {\\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\\n}\\n.hypurr-connect .backdrop-blur-sm {\\n --tw-backdrop-blur:blur(4px);\\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\\n}\\n.hypurr-connect .transition {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n -webkit-backdrop-filter;\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n backdrop-filter;\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke,\\n opacity,\\n box-shadow,\\n transform,\\n filter,\\n backdrop-filter,\\n -webkit-backdrop-filter;\\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\\n transition-duration: .15s;\\n}\\n.hypurr-connect .transition-colors {\\n transition-property:\\n color,\\n background-color,\\n border-color,\\n text-decoration-color,\\n fill,\\n stroke;\\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\\n transition-duration: .15s;\\n}\\n.hypurr-connect {\\n -webkit-font-smoothing: auto;\\n -moz-osx-font-smoothing: auto;\\n}\\n:root {\\n --surface-btn:13 18 25;\\n --surface-btn-hover:21 23 26;\\n --surface-btn-active:30 33 36;\\n --surface-bd:38 42 48;\\n --surface-bd-hover:68 69 72;\\n --surface-bd-active:75 77 80;\\n --surface-modal:14 18 24;\\n --surface-dropdown:17 24 32;\\n --surface-base:11 14 17;\\n --surface-deep:9 11 14;\\n --surface-raised:17 24 39;\\n --surface-elevated:31 41 55;\\n --surface-inset:55 65 81;\\n --surface-inverse:255 255 255;\\n --content:243 244 246;\\n --content-secondary:229 231 235;\\n --content-tertiary:209 213 219;\\n --content-muted:170 177 193;\\n --content-subtle:125 133 151;\\n --content-faint:107 114 128;\\n --content-disabled:55 65 81;\\n --line:31 41 55;\\n --line-strong:55 65 81;\\n --line-subtle:17 24 39;\\n --line-inverse:255 255 255;\\n --overlay:0 0 0;\\n --accent:168 85 247;\\n --trade-up:52 211 153;\\n --trade-down:248 113 113;\\n --purple-400:216 180 254;\\n --purple-500:185 125 241;\\n --blue-500:90 153 255;\\n --green-400:83 203 127;\\n --amber-200:253 230 138;\\n --amber-400:251 191 36;\\n --amber-500:245 158 11;\\n --btn-bg:13 18 25;\\n --btn-fg:170 177 193;\\n --btn-ring:38 42 48;\\n --btn-bevel:255 255 255;\\n --accent-btn-bg:37 28 57;\\n --accent-btn-bg-hover:52 35 80;\\n --accent-btn-fg:216 180 254;\\n --accent-btn-fg-hover:233 213 255;\\n --accent-btn-inset:15 5 35;\\n --input-bg:18 23 31;\\n --input-bg-focus:26 33 44;\\n --input-ring:45 53 64;\\n --input-ring-focus:59 69 82;\\n --shadow-modal:0 25px 50px -12px rgba(0,0,0,.6);\\n --shadow-dropdown:0 8px 40px rgba(0,0,0,.85);\\n}\\n.light {\\n --surface-btn:244 246 249;\\n --surface-btn-hover:236 239 243;\\n --surface-btn-active:226 230 236;\\n --surface-bd:214 220 228;\\n --surface-bd-hover:194 201 211;\\n --surface-bd-active:168 176 191;\\n --surface-modal:255 255 255;\\n --surface-dropdown:255 255 255;\\n --surface-base:245 244 249;\\n --surface-deep:233 236 242;\\n --surface-raised:255 255 255;\\n --surface-elevated:228 231 237;\\n --surface-inset:225 229 235;\\n --surface-inverse:17 24 39;\\n --content:17 24 39;\\n --content-secondary:31 41 55;\\n --content-tertiary:55 65 81;\\n --content-muted:91 101 115;\\n --content-subtle:107 114 128;\\n --content-faint:148 163 184;\\n --content-disabled:179 185 196;\\n --line:222 226 234;\\n --line-strong:205 211 220;\\n --line-subtle:238 240 243;\\n --line-inverse:17 24 39;\\n --overlay:0 0 0;\\n --accent:147 51 234;\\n --trade-up:5 150 105;\\n --trade-down:220 38 38;\\n --purple-400:124 58 237;\\n --purple-500:109 40 217;\\n --blue-500:37 99 235;\\n --green-400:22 163 74;\\n --amber-200:161 98 7;\\n --amber-400:180 83 9;\\n --amber-500:180 83 9;\\n --btn-bg:255 255 255;\\n --btn-fg:71 85 105;\\n --btn-ring:217 221 228;\\n --btn-bevel:15 23 42;\\n --accent-btn-bg:243 232 255;\\n --accent-btn-bg-hover:233 213 255;\\n --accent-btn-fg:109 40 217;\\n --accent-btn-fg-hover:88 28 135;\\n --accent-btn-inset:147 51 234;\\n --input-bg:238 240 246;\\n --input-bg-focus:230 232 240;\\n --input-ring:200 206 218;\\n --input-ring-focus:168 175 192;\\n --shadow-modal:0 16px 40px -12px rgba(15,23,42,.24),0 4px 12px -4px rgba(15,23,42,.12);\\n --shadow-dropdown:0 12px 28px -8px rgba(15,23,42,.2),0 2px 8px -2px rgba(15,23,42,.1);\\n}\\n.hypurr-connect .hover\\\\:border-surface-bd-hover:hover {\\n --tw-border-opacity:1;\\n border-color: rgb(var(--surface-bd-hover)/var(--tw-border-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:bg-surface-btn-hover:hover {\\n --tw-bg-opacity:1;\\n background-color: rgb(var(--surface-btn-hover)/var(--tw-bg-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:text-content:hover {\\n --tw-text-opacity:1;\\n color: rgb(var(--content)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .hover\\\\:text-content-tertiary:hover {\\n --tw-text-opacity:1;\\n color: rgb(var(--content-tertiary)/var(--tw-text-opacity,1));\\n}\\n.hypurr-connect .focus\\\\:outline-none:focus {\\n outline: 2px solid transparent;\\n outline-offset: 2px;\\n}\\n.hypurr-connect .disabled\\\\:cursor-not-allowed:disabled {\\n cursor: not-allowed;\\n}\\n.hypurr-connect .disabled\\\\:opacity-40:disabled {\\n opacity: .4;\\n}\\n.hypurr-connect .disabled\\\\:opacity-50:disabled {\\n opacity: .5;\\n}\\n\")","import {\n ExchangeClient,\n HttpTransport,\n type IRequestTransport,\n} from \"@hfunlabs/hyperliquid\";\nimport {\n signUserSignedAction,\n type AbstractViemLocalAccount,\n} from \"@hfunlabs/hyperliquid/signing\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramUserResponse } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type {\n TelegramUser as HypurrTelegramUser,\n TelegramChatWalletPack,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n AGENT_NAME,\n clearAgent as clearStoredAgent,\n fetchAgentByAddress,\n fetchActiveAgent,\n generateAgentKey,\n isAgentValid,\n isDeadAgentError,\n loadAgent,\n saveAgent,\n} from \"./agent\";\nimport { createStaticClient, createTelegramClient } from \"./grpc\";\nimport { GrpcExchangeTransport } from \"./GrpcExchangeTransport\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\nimport { createTelegramAgentApprovalName } from \"./agentWallet\";\nimport type {\n AuthMethod,\n EoaSigner,\n EvmTransactionRequest,\n Hex,\n HypurrConnectConfig,\n HypurrConnectState,\n HypurrUser,\n RenewAgentWalletParams,\n SignTypedDataFn,\n StoredAgent,\n} from \"./types\";\n\n/** @internal context value — extends the public type with fields used only by library internals */\ninterface InternalConnectState extends HypurrConnectState {\n loginTelegram: () => void;\n /** Connected EOA owner address (EOA auth only); null otherwise. */\n eoaAddress: `0x${string}` | null;\n}\n\nconst TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-jwt\";\nconst LEGACY_TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-user\";\nconst TELEGRAM_AUTH_STATE_KEY = \"hypurr-connect-auth-state\";\nconst TELEGRAM_AUTH_CODE_VERIFIER_PREFIX = \"hypurr-connect-auth-code-verifier:\";\nconst TELEGRAM_AUTH_REDIRECT_URI_PREFIX =\n \"hypurr-connect-auth-redirect-uri:\";\nconst TELEGRAM_AUTH_MESSAGE = \"hypurr-connect:telegram-auth\";\nconst DEFAULT_AUTH_HUB_URL = \"https://auth.hypurr.fun/login\";\nconst DEFAULT_MEDIA_URL = \"https://media.hypurr.fun\";\nconst USER_SIGNED_DOMAIN_NAME = \"HyperliquidSignTransaction\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\nconst APPROVE_AGENT_PRIMARY_TYPE = \"HyperliquidTransaction:ApproveAgent\";\nconst APPROVE_AGENT_TYPES = {\n [APPROVE_AGENT_PRIMARY_TYPE]: [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n};\nconst EIP712_DOMAIN_TYPES = [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n];\nconst IGNORED_EXTERNAL_SIGNATURE =\n \"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b\" as const;\nconst DEFAULT_TELEGRAM_SCOPES = [\n \"telegram:user:read\",\n \"telegram:wallet:read\",\n \"telegram:wallet:write\",\n \"telegram:trade:read\",\n \"telegram:trade:write\",\n \"telegram:cabal:read\",\n \"telegram:cabal:write\",\n \"telegram:agent:write\",\n \"telegram:support:read\",\n \"telegram:support:write\",\n];\n\nfunction createExternalSigningWallet(address: Hex): AbstractViemLocalAccount {\n return {\n address,\n signTypedData(params) {\n void params;\n return Promise.resolve(IGNORED_EXTERNAL_SIGNATURE);\n },\n };\n}\n\nfunction isInvalidTelegramAuthError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n msg,\n );\n}\n\nfunction normalizeMediaUrl(mediaUrl?: string): string {\n return (mediaUrl?.trim() || DEFAULT_MEDIA_URL).replace(/\\/+$/, \"\");\n}\n\nfunction isAddress(value?: string | null): value is Hex {\n return !!value && /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\nfunction createApproveAgentAction(params: {\n agentAddress: Hex;\n agentName: string;\n chainId: number;\n isTestnet: boolean;\n}) {\n const nonce = Date.now();\n return {\n action: {\n type: \"approveAgent\" as const,\n signatureChainId: `0x${params.chainId.toString(16)}` as Hex,\n hyperliquidChain: (params.isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: params.agentAddress.toLowerCase() as Hex,\n agentName: params.agentName,\n nonce,\n },\n nonce,\n };\n}\n\ntype ApproveAgentAction = ReturnType<typeof createApproveAgentAction>[\"action\"];\n\nasync function signApproveAgentAction(params: {\n signTypedDataAsync: SignTypedDataFn;\n agentAddress: Hex;\n agentName: string;\n chainId: number;\n isTestnet: boolean;\n}): Promise<{\n action: ApproveAgentAction;\n signatureHex: Hex;\n}> {\n const { action } = createApproveAgentAction(params);\n const signatureHex = await params.signTypedDataAsync({\n domain: {\n name: USER_SIGNED_DOMAIN_NAME,\n version: \"1\",\n chainId: params.chainId,\n verifyingContract: ZERO_ADDRESS,\n },\n types: {\n EIP712Domain: EIP712_DOMAIN_TYPES,\n ...APPROVE_AGENT_TYPES,\n },\n primaryType: APPROVE_AGENT_PRIMARY_TYPE,\n message: {\n hyperliquidChain: action.hyperliquidChain,\n agentAddress: action.agentAddress,\n agentName: action.agentName,\n nonce: action.nonce,\n },\n });\n\n return {\n action,\n signatureHex,\n };\n}\n\nfunction getRawSignedTransaction(result: unknown): Hex | null {\n if (typeof result === \"string\" && result.startsWith(\"0x\")) {\n return result as Hex;\n }\n if (!result || typeof result !== \"object\") return null;\n\n const record = result as Record<string, unknown>;\n const candidates = [\n record.raw,\n record.rawTransaction,\n record.signedTransaction,\n record.serializedTransaction,\n record.result,\n ];\n const raw = candidates.find(\n (value): value is string =>\n typeof value === \"string\" && value.startsWith(\"0x\"),\n );\n return raw ? (raw as Hex) : null;\n}\n\nfunction decodeJsonBytes(bytes: Uint8Array): unknown {\n const text = new TextDecoder().decode(bytes);\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction encodeJsonBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(value));\n}\n\nfunction withExpectedFrom(\n transaction: EvmTransactionRequest,\n address: Hex,\n): EvmTransactionRequest {\n if (\n transaction.from &&\n transaction.from.toLowerCase() !== address.toLowerCase()\n ) {\n throw new Error(\n \"[HypurrConnect] EVM transaction `from` does not match the connected wallet.\",\n );\n }\n return transaction.from ? transaction : { ...transaction, from: address };\n}\n\nfunction currentRedirectUri(): string {\n const url = new URL(window.location.href);\n for (const param of [\n \"code\",\n \"error\",\n \"error_description\",\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n url.searchParams.delete(param);\n }\n return url.toString();\n}\n\nfunction cleanAuthCallbackUrl(): void {\n const cleanUrl = new URL(window.location.href);\n for (const param of [\n \"code\",\n \"error\",\n \"error_description\",\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n cleanUrl.searchParams.delete(param);\n }\n window.history.replaceState({}, document.title, cleanUrl.toString());\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let value = \"\";\n for (const byte of bytes) {\n value += String.fromCharCode(byte);\n }\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction randomState(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\nfunction randomCodeVerifier(): string {\n const bytes = new Uint8Array(64);\n crypto.getRandomValues(bytes);\n return base64UrlEncode(bytes);\n}\n\nasync function createCodeChallenge(codeVerifier: string): Promise<string> {\n if (!crypto.subtle) {\n throw new Error(\n \"[HypurrConnect] Web Crypto API is required for Telegram auth.\",\n );\n }\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(codeVerifier),\n );\n return base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction normalizeScopes(scope?: string | string[]): string {\n if (Array.isArray(scope)) return scope.join(\" \");\n return scope?.trim() || DEFAULT_TELEGRAM_SCOPES.join(\" \");\n}\n\nfunction normalizeClientId(clientId: unknown): string {\n const normalized = typeof clientId === \"string\" ? clientId.trim() : \"\";\n if (!normalized) {\n throw new Error(\"[HypurrConnect] config.clientId is required.\");\n }\n return normalized;\n}\n\nfunction codeVerifierStorageKey(state: string): string {\n return `${TELEGRAM_AUTH_CODE_VERIFIER_PREFIX}${state}`;\n}\n\nfunction redirectUriStorageKey(state: string): string {\n return `${TELEGRAM_AUTH_REDIRECT_URI_PREFIX}${state}`;\n}\n\nfunction storeTelegramAuthSession(\n state: string,\n codeVerifier: string,\n redirectUri: string,\n): void {\n const previousState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n if (previousState) {\n sessionStorage.removeItem(codeVerifierStorageKey(previousState));\n sessionStorage.removeItem(redirectUriStorageKey(previousState));\n }\n sessionStorage.setItem(TELEGRAM_AUTH_STATE_KEY, state);\n sessionStorage.setItem(codeVerifierStorageKey(state), codeVerifier);\n sessionStorage.setItem(redirectUriStorageKey(state), redirectUri);\n}\n\nfunction clearTelegramAuthSession(state: string): void {\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(codeVerifierStorageKey(state));\n sessionStorage.removeItem(redirectUriStorageKey(state));\n}\n\nfunction takeTelegramAuthSession(state: string): {\n codeVerifier: string | null;\n redirectUri: string | null;\n} | null {\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || state !== expectedState) {\n if (expectedState) {\n sessionStorage.removeItem(codeVerifierStorageKey(expectedState));\n sessionStorage.removeItem(redirectUriStorageKey(expectedState));\n }\n return null;\n }\n\n const codeVerifierKey = codeVerifierStorageKey(state);\n const redirectUriKey = redirectUriStorageKey(state);\n const codeVerifier = sessionStorage.getItem(codeVerifierKey);\n const redirectUri = sessionStorage.getItem(redirectUriKey);\n sessionStorage.removeItem(codeVerifierKey);\n sessionStorage.removeItem(redirectUriKey);\n return { codeVerifier, redirectUri };\n}\n\nfunction fallbackAuthTokenUrl(authHubUrl?: string): string {\n const url = new URL(authHubUrl || DEFAULT_AUTH_HUB_URL);\n url.pathname = \"/oauth/token\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction authMetadataUrls(authHubUrl?: string): string[] {\n const authUrl = new URL(authHubUrl || DEFAULT_AUTH_HUB_URL);\n const urls = [\n new URL(\"/.well-known/oauth-authorization-server\", authUrl).toString(),\n new URL(\"/.well-known/openid-configuration\", authUrl).toString(),\n ];\n\n const authPath = authUrl.pathname.replace(/\\/+$/, \"\");\n const basePath = authPath.replace(/\\/[^/]*$/, \"\");\n if (basePath) {\n urls.push(\n new URL(\n `/.well-known/oauth-authorization-server${basePath}`,\n authUrl,\n ).toString(),\n );\n }\n\n return Array.from(new Set(urls));\n}\n\nasync function tokenUrlFromMetadata(\n authHubUrl?: string,\n): Promise<string | undefined> {\n for (const metadataUrl of authMetadataUrls(authHubUrl)) {\n try {\n const response = await fetch(metadataUrl, {\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) continue;\n const metadata = (await response.json()) as { token_endpoint?: unknown };\n const tokenEndpoint = metadata.token_endpoint;\n if (typeof tokenEndpoint === \"string\" && tokenEndpoint.trim()) {\n return tokenEndpoint.trim();\n }\n } catch {\n // Metadata discovery is best effort; fall back to the conventional route.\n }\n }\n\n return undefined;\n}\n\nasync function resolveAuthTokenUrl(authHubUrl?: string): Promise<string> {\n return (\n (await tokenUrlFromMetadata(authHubUrl)) || fallbackAuthTokenUrl(authHubUrl)\n );\n}\n\nfunction getTokenFromExchangeResponse(data: unknown): string | null {\n if (typeof data === \"string\") {\n const token = data.trim();\n return token || null;\n }\n if (typeof data !== \"object\" || data === null) return null;\n\n const response = data as {\n access_token?: unknown;\n jwt?: unknown;\n token?: unknown;\n };\n for (const token of [response.token, response.access_token, response.jwt]) {\n if (typeof token === \"string\" && token.trim()) return token.trim();\n }\n return null;\n}\n\nasync function exchangeTelegramAuthCode({\n authHubUrl,\n clientId,\n code,\n codeVerifier,\n redirectUri,\n}: {\n authHubUrl?: string;\n clientId: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n}): Promise<string> {\n const body = new URLSearchParams({\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n grant_type: \"authorization_code\",\n redirect_uri: redirectUri,\n });\n\n const response = await fetch(await resolveAuthTokenUrl(authHubUrl), {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n },\n body,\n });\n const responseText = await response.text();\n\n if (!response.ok) {\n const detail = responseText.trim();\n throw new Error(\n detail\n ? `[HypurrConnect] Auth code exchange failed: ${detail}`\n : `[HypurrConnect] Auth code exchange failed with HTTP ${response.status}.`,\n );\n }\n\n let responseData: unknown = responseText;\n if (responseText) {\n try {\n responseData = JSON.parse(responseText) as unknown;\n } catch {\n responseData = responseText;\n }\n }\n\n const token = getTokenFromExchangeResponse(responseData);\n if (!token) {\n throw new Error(\"[HypurrConnect] Auth code exchange did not return a JWT.\");\n }\n return token;\n}\n\ntype TelegramAuthCallback = {\n type?: typeof TELEGRAM_AUTH_MESSAGE;\n state: string;\n token?: string;\n code?: string;\n error?: string;\n};\n\nfunction isTelegramAuthMessage(data: unknown): data is {\n type: typeof TELEGRAM_AUTH_MESSAGE;\n state: string;\n token?: string;\n code?: string;\n error?: string;\n} {\n if (typeof data !== \"object\" || data === null) return false;\n if (!(\"type\" in data) || !(\"state\" in data)) return false;\n const message = data as {\n type: unknown;\n state: unknown;\n token?: unknown;\n code?: unknown;\n error?: unknown;\n };\n const hasToken = typeof message.token === \"string\";\n const hasCode = typeof message.code === \"string\";\n const hasError = typeof message.error === \"string\";\n return (\n message.type === TELEGRAM_AUTH_MESSAGE &&\n typeof message.state === \"string\" &&\n (hasToken || hasCode || hasError)\n );\n}\n\nconst HypurrConnectContext = createContext<InternalConnectState | null>(null);\n\nexport function useHypurrConnect(): HypurrConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnect must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\n/** @internal — gives library components access to fields not on the public API */\nexport function useHypurrConnectInternal(): InternalConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnectInternal must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\nexport function HypurrConnectProvider({\n config,\n children,\n}: {\n config: HypurrConnectConfig;\n children: ReactNode;\n}) {\n const tgClient = useMemo(() => createTelegramClient(config), [config]);\n const staticClient = useMemo(() => createStaticClient(config), [config]);\n\n // ── Telegram auth state ──────────────────────────────────────\n const [tgAuthToken, setTgAuthToken] = useState<string | null>(() => {\n try {\n return localStorage.getItem(TELEGRAM_STORAGE_KEY);\n } catch {\n return null;\n }\n });\n const [tgUser, setTgUser] = useState<HypurrTelegramUser | null>(null);\n const [tgLoading, setTgLoading] = useState(false);\n const [tgError, setTgError] = useState<string | null>(null);\n\n const authDataMap = useMemo(() => ({}), []);\n const telegramRpcOptions = useMemo<RpcOptions | undefined>(\n () =>\n tgAuthToken\n ? { meta: { authorization: `Bearer ${tgAuthToken}` } }\n : undefined,\n [tgAuthToken],\n );\n\n const [tgUserTick, setTgUserTick] = useState(0);\n\n // Auto-disconnect when the server rejects telegram auth data.\n const onInvalidAuthRef = useRef<(() => void) | null>(null);\n onInvalidAuthRef.current = () => {\n console.warn(\n \"[HypurrConnect] Invalid Telegram auth token — disconnecting.\",\n );\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n };\n\n const acceptTelegramToken = useCallback((token: string) => {\n setTgAuthToken(token);\n setTgError(null);\n localStorage.setItem(TELEGRAM_STORAGE_KEY, token);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n const handleTelegramAuthCallback = useCallback(\n (callback: TelegramAuthCallback) => {\n const authSession = takeTelegramAuthSession(callback.state);\n if (!authSession) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n if (callback.error) {\n setTgError(callback.error);\n return;\n }\n\n if (callback.code) {\n if (!authSession.codeVerifier) {\n setTgError(\"Missing auth code verifier.\");\n return;\n }\n\n setTgLoading(true);\n setTgError(null);\n void exchangeTelegramAuthCode({\n authHubUrl: config.telegram?.authHubUrl,\n clientId: normalizeClientId(config.clientId),\n code: callback.code,\n codeVerifier: authSession.codeVerifier,\n redirectUri: authSession.redirectUri || currentRedirectUri(),\n })\n .then(acceptTelegramToken)\n .catch((err) =>\n setTgError(err instanceof Error ? err.message : String(err)),\n )\n .finally(() => setTgLoading(false));\n return;\n }\n\n if (callback.token) {\n acceptTelegramToken(callback.token);\n return;\n }\n\n setTgError(\"Invalid auth callback.\");\n },\n [\n acceptTelegramToken,\n config.clientId,\n config.telegram?.authHubUrl,\n ],\n );\n\n // Eagerly fetch the modal fonts on mount. They're declared via @import in the\n // injected stylesheet but browsers only fetch a webfont when visible text\n // first uses it — that lazy fetch makes scores/labels flash the system\n // fallback and render inconsistently across views. Loading them up front\n // keeps the bold mono numbers consistent.\n useEffect(() => {\n if (typeof document === \"undefined\" || !document.fonts) return;\n for (const face of [\n \"500 1em 'Google Sans Code'\",\n \"700 1em 'Google Sans Code'\",\n \"600 1em Inter\",\n \"700 1em Inter\",\n ]) {\n void document.fonts.load(face).catch(() => {});\n }\n }, []);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\");\n const code = params.get(\"code\");\n const error =\n params.get(\"error_description\") || params.get(\"error\") || undefined;\n if (!token && !code && !error) {\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n return;\n }\n\n const callbackState = params.get(\"state\") ?? \"\";\n const callback = {\n code: code || undefined,\n error,\n state: callbackState,\n token: token || undefined,\n type: TELEGRAM_AUTH_MESSAGE,\n } satisfies TelegramAuthCallback;\n\n if (window.opener && window.opener !== window) {\n window.opener.postMessage(callback, window.location.origin);\n window.close();\n return;\n }\n\n cleanAuthCallbackUrl();\n handleTelegramAuthCallback(callback);\n }, [handleTelegramAuthCallback]);\n\n useEffect(() => {\n function onMessage(event: MessageEvent) {\n if (event.origin !== window.location.origin) return;\n if (!isTelegramAuthMessage(event.data)) return;\n\n handleTelegramAuthCallback(event.data);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [handleTelegramAuthCallback]);\n\n useEffect(() => {\n if (!tgAuthToken || !telegramRpcOptions) return;\n let cancelled = false;\n setTgLoading(true);\n setTgError(null);\n\n (async () => {\n try {\n const [{ response: userResp }, { response: walletsResp }] =\n await Promise.all([\n tgClient.telegramUser({ authData: {} }, telegramRpcOptions),\n tgClient.telegramUserWallets({ authData: {} }, telegramRpcOptions),\n ]);\n if (cancelled) return;\n const user = (userResp as TelegramUserResponse).user ?? null;\n if (user) {\n // TelegramUser.wallets lacks twap/scale sessions; replace with\n // the full wallets from TelegramUserWallets which populates them.\n user.wallets = walletsResp.wallets;\n }\n setTgUser(user);\n } catch (err) {\n if (cancelled) return;\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n console.error(\"[HypurrConnect] gRPC TelegramUser failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n } finally {\n if (!cancelled) setTgLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [tgAuthToken, telegramRpcOptions, tgClient, tgUserTick]);\n\n // ── EOA auth state ───────────────────────────────────────────\n const [eoaAddress, setEoaAddress] = useState<`0x${string}` | null>(null);\n const [agent, setAgent] = useState<StoredAgent | null>(null);\n const [eoaLoading, setEoaLoading] = useState(false);\n const [eoaError, setEoaError] = useState<string | null>(null);\n const eoaSignerRef = useRef<EoaSigner | null>(null);\n\n // ── Derived auth ─────────────────────────────────────────────\n const authMethod: AuthMethod = tgAuthToken\n ? \"telegram\"\n : eoaAddress\n ? \"eoa\"\n : null;\n\n // ── Multi-wallet state (Telegram) ─────────────────────────────\n const [wallets, setWallets] = useState<HyperliquidWallet[]>([]);\n const [selectedWalletId, setSelectedWalletId] = useState<number>(0);\n const [packs, setPacks] = useState<TelegramChatWalletPack[]>([]);\n\n const refreshWallets = useCallback(() => setTgUserTick((t) => t + 1), []);\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !tgUser) {\n setWallets([]);\n setSelectedWalletId(0);\n setPacks([]);\n return;\n }\n\n const userWallets = tgUser.wallets ?? [];\n setWallets(userWallets);\n setPacks(tgUser.packs ?? []);\n\n const defaultId = tgUser.walletId || userWallets[0]?.id || 0;\n setSelectedWalletId((prev) => {\n if (prev && userWallets.some((w) => w.id === prev)) return prev;\n return defaultId;\n });\n }, [authMethod, tgUser]);\n\n const selectedWallet = useMemo(\n () => wallets.find((w) => w.id === selectedWalletId) ?? wallets[0] ?? null,\n [wallets, selectedWalletId],\n );\n\n const selectWallet = useCallback(\n (walletId: number) => {\n if (wallets.some((w) => w.id === walletId)) {\n setSelectedWalletId(walletId);\n }\n },\n [wallets],\n );\n\n // ── Session poller (TWAP + Scale for selected wallet) ──────\n const pollInterval = config.sessionPollInterval ?? 5_000;\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !selectedWalletId || !pollInterval) return;\n\n let cancelled = false;\n\n const poll = async () => {\n try {\n const [{ response: twapResp }, { response: scaleResp }] =\n await Promise.all([\n tgClient.hyperliquidWalletTwapSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n tgClient.hyperliquidWalletScaleSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n ]);\n if (cancelled) return;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: twapResp.sessions,\n scaleSessions: scaleResp.sessions,\n }\n : w,\n ),\n );\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n // Silently ignore poll errors — next tick will retry.\n }\n };\n\n // Fire immediately on mount / wallet switch, then on interval.\n poll();\n const id = setInterval(poll, pollInterval);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [\n authMethod,\n selectedWalletId,\n pollInterval,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const user = useMemo<HypurrUser | null>(() => {\n if (tgAuthToken && authMethod === \"telegram\" && selectedWallet && tgUser) {\n const mediaUrl = normalizeMediaUrl(config.mediaUrl);\n return {\n address: selectedWallet.ethereumAddress,\n walletId: selectedWallet.id,\n displayName: tgUser.telegramUsername\n ? `@${tgUser.telegramUsername}`\n : `Telegram ${tgUser.telegramId}`,\n photoUrl: (() => {\n // `pictureFileId` is read at runtime; the schema may not type it.\n const fileId = (tgUser as unknown as { pictureFileId?: string })\n .pictureFileId;\n return fileId ? `${mediaUrl}/${fileId}` : undefined;\n })(),\n authMethod: \"telegram\",\n telegramId: String(tgUser.telegramId),\n hfunScore: tgUser?.reputation?.hfunScore,\n reputationScore: tgUser?.reputation?.reputationScore,\n addressBook: tgUser.addressBook,\n };\n }\n if (eoaAddress && authMethod === \"eoa\") {\n return {\n address: eoaAddress,\n walletId: 0,\n displayName: `${eoaAddress.slice(0, 6)}...${eoaAddress.slice(-4)}`,\n authMethod: \"eoa\",\n };\n }\n return null;\n }, [\n tgAuthToken,\n selectedWallet,\n eoaAddress,\n authMethod,\n tgUser,\n config.mediaUrl,\n ]);\n\n // ── Exchange client ──────────────────────────────────────────\n // Telegram: dummy local wallet → GrpcExchangeTransport → HyperliquidCoreAction (server signs)\n // EOA: dual wallet — agent key for L1 actions, master signer for user-signed\n // actions (transfers, withdrawals, etc.). The dual wallet inspects the\n // EIP-712 domain name to decide which key signs each request.\n // When a signer is available but no agent exists yet, the dual wallet\n // auto-provisions an agent on the first L1 action (triggers one extra\n // wallet popup for the approveAgent user-signed action).\n\n const onDeadAgentRef = useRef<((address: `0x${string}`) => void) | null>(\n null,\n );\n onDeadAgentRef.current = (addr: `0x${string}`) => {\n clearStoredAgent(addr);\n setAgent(null);\n setEoaError(\"Agent expired or was deregistered. Please reconnect.\");\n };\n\n // Mutable slot for the agent signer — the dual wallet reads this so it can\n // pick up a newly provisioned agent without waiting for a React re-render.\n const agentSignerRef = useRef<PrivateKeySigner | null>(\n agent ? new PrivateKeySigner(agent.privateKey) : null,\n );\n useEffect(() => {\n agentSignerRef.current = agent\n ? new PrivateKeySigner(agent.privateKey)\n : null;\n }, [agent]);\n\n // Lock to prevent concurrent auto-provisioning attempts\n const provisioningRef = useRef<Promise<PrivateKeySigner> | null>(null);\n\n const agentReady =\n authMethod === \"telegram\" || (authMethod === \"eoa\" && !!agent);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const exchange = useMemo<ExchangeClient<any> | null>(() => {\n if (authMethod === \"telegram\" && user?.address) {\n const transport = new GrpcExchangeTransport({\n isTestnet: config.isTestnet ?? false,\n telegramClient: tgClient,\n rpcOptions: telegramRpcOptions,\n walletId: user.walletId,\n onAuthError: () => onInvalidAuthRef.current?.(),\n });\n return new ExchangeClient({\n transport,\n wallet: createExternalSigningWallet(user.address as Hex),\n });\n }\n\n if (authMethod === \"eoa\" && eoaAddress) {\n const hasSigner = !!eoaSignerRef.current;\n\n if (!agent && !hasSigner) {\n const noAgentTransport: IRequestTransport = {\n isTestnet: config.isTestnet ?? false,\n request(): Promise<never> {\n throw new Error(\n \"[HypurrConnect] No agent key approved and no wallet signer available. \" +\n \"Either call approveAgent(signTypedDataAsync) or pass a signer to \" +\n \"connectEoa(address, { signTypedData, chainId }).\",\n );\n },\n };\n return new ExchangeClient({\n transport: noAgentTransport,\n wallet: createExternalSigningWallet(eoaAddress),\n });\n }\n\n const isTestnet = config.isTestnet ?? false;\n const inner = new HttpTransport({ isTestnet });\n const deadAgentAddr = eoaAddress;\n const guardedTransport: IRequestTransport = {\n isTestnet: inner.isTestnet,\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n try {\n return await inner.request<T>(endpoint, payload, signal);\n } catch (err) {\n if (endpoint === \"exchange\" && isDeadAgentError(err)) {\n onDeadAgentRef.current?.(deadAgentAddr);\n }\n throw err;\n }\n },\n };\n\n const signerRef = eoaSignerRef;\n const agentRef = agentSignerRef;\n const provRef = provisioningRef;\n const ownerAddress = eoaAddress;\n\n /**\n * Auto-provision an agent key when one doesn't exist yet.\n *\n * Bypasses the SDK's `executeUserSignedAction` (and its per-address\n * semaphore) to avoid deadlocking when called from inside\n * `dualWallet.signTypedData`, which is already inside the SDK's\n * `executeL1Action` lock for the same address.\n */\n const ensureAgent = async (): Promise<PrivateKeySigner> => {\n const existing = agentRef.current;\n if (existing) return existing;\n\n if (provRef.current) return provRef.current;\n\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available to auto-provision agent. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n\n provRef.current = (async () => {\n try {\n const { privateKey, address: agentAddress } =\n await generateAgentKey();\n\n const chainIdHex =\n `0x${signer.chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signer.signTypedData(params);\n },\n getAddresses: async () => [ownerAddress] as `0x${string}`[],\n getChainId: async () => signer.chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api-ui.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(ownerAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(ownerAddress, stored);\n\n const newSigner = new PrivateKeySigner(privateKey);\n agentRef.current = newSigner;\n setAgent(stored);\n\n return newSigner;\n } finally {\n provRef.current = null;\n }\n })();\n\n return provRef.current;\n };\n\n // Dual wallet: routes signing based on the EIP-712 domain.\n // \"Exchange\" domain → L1 action → agent key signs (auto-provisions if needed).\n // \"HyperliquidSignTransaction\" domain → user-signed → master wallet (popup).\n const dualWallet: AbstractViemLocalAccount = {\n address: ownerAddress,\n async signTypedData(params): Promise<`0x${string}`> {\n if (params.domain.name === \"HyperliquidSignTransaction\") {\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available for user-signed actions. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n return signer.signTypedData(\n params as Parameters<typeof signer.signTypedData>[0],\n );\n }\n\n const agentSigner = await ensureAgent();\n return agentSigner.signTypedData(params);\n },\n };\n\n return new ExchangeClient({\n transport: guardedTransport,\n wallet: dualWallet,\n signatureChainId: () => {\n const id = signerRef.current?.chainId ?? 42161;\n return `0x${id.toString(16)}` as `0x${string}`;\n },\n });\n }\n\n return null;\n }, [\n authMethod,\n user,\n agent,\n eoaAddress,\n config.isTestnet,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const handleClearAgent = useCallback(() => {\n if (eoaAddress) {\n clearStoredAgent(eoaAddress);\n setAgent(null);\n }\n }, [eoaAddress]);\n\n const signEvmTransaction = useCallback(\n async (transaction: EvmTransactionRequest): Promise<Hex> => {\n if (authMethod === \"eoa\") {\n if (!eoaAddress) {\n throw new Error(\"[HypurrConnect] No EOA wallet connected.\");\n }\n\n const signer = eoaSignerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No EOA signer available. Pass a signer to connectEoa(address, signer).\",\n );\n }\n\n const tx = withExpectedFrom(transaction, eoaAddress);\n const result = signer.signTransaction\n ? await signer.signTransaction(tx)\n : signer.request\n ? await signer.request({\n method: \"eth_signTransaction\",\n params: [tx],\n })\n : null;\n const rawTransaction = getRawSignedTransaction(result);\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] EOA signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n }\n\n if (authMethod === \"telegram\") {\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n if (!selectedWallet) {\n throw new Error(\"[HypurrConnect] No Telegram wallet selected.\");\n }\n if (\n selectedWallet.id <= 0 ||\n selectedWallet.isReadOnly ||\n selectedWallet.isAgent\n ) {\n throw new Error(\n \"[HypurrConnect] Select a Telegram private-key wallet to sign EVM transactions.\",\n );\n }\n if (!isAddress(selectedWallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Selected Telegram wallet does not have a valid EVM address.\",\n );\n }\n\n const tx = withExpectedFrom(\n transaction,\n selectedWallet.ethereumAddress,\n );\n try {\n const signResponse = await tgClient.eVMSignTransaction(\n {\n authData: {},\n walletId: selectedWallet.id,\n params: encodeJsonBytes(tx),\n },\n telegramRpcOptions,\n );\n const rawTransaction = getRawSignedTransaction(\n decodeJsonBytes(signResponse.response.result),\n );\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] Telegram signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n }\n throw err;\n }\n }\n\n throw new Error(\"[HypurrConnect] No wallet connected.\");\n },\n [authMethod, eoaAddress, selectedWallet, telegramRpcOptions, tgClient],\n );\n\n // ── Wallet management (Telegram only) ───────────────────────\n const createWallet = useCallback(\n async (name: string): Promise<HyperliquidWallet> => {\n const { response } = await tgClient.hyperliquidWalletCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n if (!response.wallet)\n throw new Error(\"Wallet creation returned no wallet\");\n return response.wallet;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const deleteWallet = useCallback(\n async (walletId: number): Promise<void> => {\n await tgClient.hyperliquidWalletDelete(\n {\n authData: {},\n walletId,\n },\n telegramRpcOptions,\n );\n if (walletId === selectedWalletId) {\n const remaining = wallets.filter((w) => w.id !== walletId);\n setSelectedWalletId(remaining[0]?.id ?? 0);\n }\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, selectedWalletId, wallets, refreshWallets],\n );\n\n const renameWallet = useCallback(\n async (walletId: number, name: string): Promise<void> => {\n await tgClient.hyperliquidWalletUpdate(\n {\n authData: {},\n walletId,\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const renewAgentWallet = useCallback(\n async ({\n walletId,\n ownerAddress,\n signTypedDataAsync,\n chainId,\n approvalDurationMs,\n agentName,\n }: RenewAgentWalletParams): Promise<void> => {\n if (authMethod !== \"telegram\") {\n throw new Error(\n \"[HypurrConnect] Agent wallet renewal is only available for Telegram wallets.\",\n );\n }\n if (!isAddress(ownerAddress)) {\n throw new Error(\n \"[HypurrConnect] Connect the owner EOA wallet before renewing this agent.\",\n );\n }\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n\n const wallet = wallets.find((w) => w.id === walletId);\n if (!wallet) {\n throw new Error(\"[HypurrConnect] Agent wallet not found.\");\n }\n if (!wallet.isAgent) {\n throw new Error(\n \"[HypurrConnect] Selected wallet is not an agent wallet.\",\n );\n }\n if (!isAddress(wallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Agent wallet does not have a valid owner EVM address.\",\n );\n }\n if (ownerAddress.toLowerCase() !== wallet.ethereumAddress.toLowerCase()) {\n throw new Error(\n \"[HypurrConnect] Connect the owner EOA for this agent wallet before renewing.\",\n );\n }\n\n const agentAddress = wallet.agentEthereumAddress?.value;\n if (!isAddress(agentAddress)) {\n throw new Error(\n \"[HypurrConnect] Agent wallet does not have a valid agent EVM address.\",\n );\n }\n\n const isTestnet = config.isTestnet ?? false;\n const approvalAgentName =\n agentName ?? createTelegramAgentApprovalName(approvalDurationMs);\n setTgError(null);\n\n try {\n const { action, signatureHex } = await signApproveAgentAction({\n signTypedDataAsync,\n agentAddress,\n agentName: approvalAgentName,\n chainId,\n isTestnet,\n });\n\n await tgClient.hyperliquidAgentWalletRenew(\n {\n authData: {},\n address: { value: wallet.ethereumAddress },\n signature: {\n agentAddress: action.agentAddress,\n agentName: action.agentName,\n nonce: action.nonce,\n chainId,\n signature: signatureHex,\n },\n },\n telegramRpcOptions,\n );\n\n const remote = await fetchAgentByAddress(\n ownerAddress,\n agentAddress,\n isTestnet,\n );\n if (remote && remote.validUntil <= Date.now()) {\n throw new Error(\n \"[HypurrConnect] Agent renewal was submitted, but the agent is still expired.\",\n );\n }\n\n refreshWallets();\n } catch (err) {\n console.error(\"[HypurrConnect] Agent wallet renewal failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n throw err;\n }\n },\n [\n authMethod,\n config.isTestnet,\n refreshWallets,\n telegramRpcOptions,\n tgClient,\n wallets,\n ],\n );\n\n const createWalletPack = useCallback(\n async (name: string): Promise<number> => {\n const { response } = await tgClient.telegramChatWalletPackCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n return response.packId;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const addPackLabel = useCallback(\n async (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelAdd(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const modifyPackLabel = useCallback(\n async (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelModify(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const removePackLabel = useCallback(\n async (params: { walletLabel: string; packId: number }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelRemove(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n // ── TWAP session management (Telegram only) ─────────────────\n const createTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"TWAP creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, twapSessions: [...w.twapSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const modifyTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapModify>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapModify(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session) throw new Error(\"TWAP modify returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.map((s) =>\n s.id === session.id ? session : s,\n ),\n }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelTwap = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidTwapCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n twapSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.filter((s) => s.id !== sessionId),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Scale session management (Telegram only) ───────────────\n const createScale = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidScaleCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidScaleCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"Scale creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, scaleSessions: [...w.scaleSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelScale = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidScaleCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n scaleSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n scaleSessions: w.scaleSessions.filter(\n (s) => s.id !== sessionId,\n ),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Login modal state ────────────────────────────────────────\n const [loginModalOpen, setLoginModalOpen] = useState(false);\n const openLoginModal = useCallback(() => setLoginModalOpen(true), []);\n const closeLoginModal = useCallback(() => setLoginModalOpen(false), []);\n\n // ── Auth actions ─────────────────────────────────────────────\n const loginTelegram = useCallback(() => {\n const state = randomState();\n const codeVerifier = randomCodeVerifier();\n\n const configuredRedirectUri = config.telegram?.redirectUri;\n const redirectUri =\n typeof configuredRedirectUri === \"function\"\n ? configuredRedirectUri()\n : configuredRedirectUri || currentRedirectUri();\n storeTelegramAuthSession(state, codeVerifier, redirectUri);\n\n const width = 520;\n const height = 720;\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\n const popup = window.open(\n \"about:blank\",\n \"hypurr_telegram_auth\",\n [\n `width=${width}`,\n `height=${height}`,\n `left=${Math.round(left)}`,\n `top=${Math.round(top)}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n ].join(\",\"),\n );\n\n void (async () => {\n try {\n const authUrl = new URL(\n config.telegram?.authHubUrl || DEFAULT_AUTH_HUB_URL,\n );\n authUrl.searchParams.set(\n \"client_id\",\n normalizeClientId(config.clientId),\n );\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"return_to\", redirectUri);\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\n \"scope\",\n normalizeScopes(config.telegram?.scope),\n );\n authUrl.searchParams.set(\n \"code_challenge\",\n await createCodeChallenge(codeVerifier),\n );\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n if (popup) {\n popup.location.assign(authUrl.toString());\n popup.focus();\n return;\n }\n\n window.location.assign(authUrl.toString());\n } catch (err) {\n clearTelegramAuthSession(state);\n if (popup && !popup.closed) popup.close();\n setTgError(err instanceof Error ? err.message : String(err));\n }\n })();\n }, [\n config.clientId,\n config.telegram?.authHubUrl,\n config.telegram?.redirectUri,\n config.telegram?.scope,\n ]);\n\n const connectEoa = useCallback(\n (address: `0x${string}`, signer?: EoaSigner) => {\n eoaSignerRef.current = signer ?? null;\n setEoaAddress(address);\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n setEoaError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n\n const existing = loadAgent(address);\n if (existing && existing.validUntil > Date.now()) {\n setAgent(existing);\n } else {\n if (existing) clearStoredAgent(address);\n setAgent(null);\n }\n },\n [],\n );\n\n const approveAgentFn = useCallback(\n async (signTypedDataAsync: SignTypedDataFn, chainId: number) => {\n if (!eoaAddress) {\n throw new Error(\n \"[HypurrConnect] Cannot approve agent: no EOA wallet connected. Call connectEoa(address) first.\",\n );\n }\n\n const currentSigner = eoaSignerRef.current;\n eoaSignerRef.current = {\n signTypedData: signTypedDataAsync,\n signTransaction: currentSigner?.signTransaction,\n request: currentSigner?.request,\n chainId,\n };\n\n setEoaLoading(true);\n setEoaError(null);\n try {\n const existing = loadAgent(eoaAddress);\n if (existing) {\n const isTestnet = config.isTestnet ?? false;\n const valid = await isAgentValid(existing, eoaAddress, isTestnet);\n if (valid) {\n setAgent(existing);\n return;\n }\n clearStoredAgent(eoaAddress);\n }\n\n const { privateKey, address: agentAddress } = await generateAgentKey();\n const isTestnet = config.isTestnet ?? false;\n\n const chainIdHex = `0x${chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signTypedDataAsync(params);\n },\n getAddresses: async () => [eoaAddress] as `0x${string}`[],\n getChainId: async () => chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(eoaAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(eoaAddress, stored);\n setAgent(stored);\n } catch (err) {\n console.error(\"[HypurrConnect] EOA agent approval failed:\", err);\n setEoaError(err instanceof Error ? err.message : String(err));\n setAgent(null);\n } finally {\n setEoaLoading(false);\n }\n },\n [eoaAddress, config.isTestnet],\n );\n\n const logout = useCallback(() => {\n setTgUser(null);\n setTgError(null);\n setTgAuthToken(null);\n setEoaAddress(null);\n setAgent(null);\n setEoaError(null);\n eoaSignerRef.current = null;\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n // ── Context value ────────────────────────────────────────────\n const value = useMemo<InternalConnectState>(\n () => ({\n user,\n isLoggedIn: !!user,\n isLoading: tgLoading || eoaLoading,\n error: tgError ?? eoaError,\n authMethod,\n exchange,\n\n wallets,\n selectedWalletId,\n selectWallet,\n\n createWallet,\n deleteWallet,\n renameWallet,\n renewAgentWallet,\n refreshWallets,\n\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n\n createTwap,\n modifyTwap,\n cancelTwap,\n\n createScale,\n cancelScale,\n\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgent: approveAgentFn,\n logout,\n\n agent,\n agentReady,\n clearAgent: handleClearAgent,\n eoaAddress,\n\n authDataMap,\n authToken: tgAuthToken,\n telegramRpcOptions,\n telegramClient: tgClient,\n staticClient,\n }),\n [\n user,\n tgLoading,\n eoaLoading,\n tgError,\n eoaError,\n authMethod,\n exchange,\n wallets,\n selectedWalletId,\n selectWallet,\n createWallet,\n deleteWallet,\n renameWallet,\n renewAgentWallet,\n refreshWallets,\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n createTwap,\n modifyTwap,\n cancelTwap,\n createScale,\n cancelScale,\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgentFn,\n logout,\n agent,\n agentReady,\n handleClearAgent,\n eoaAddress,\n authDataMap,\n tgAuthToken,\n telegramRpcOptions,\n tgClient,\n staticClient,\n ],\n );\n\n return (\n <HypurrConnectContext.Provider value={value}>\n {children}\n </HypurrConnectContext.Provider>\n );\n}\n","import type { AbstractViemLocalAccount } from \"@hfunlabs/hyperliquid/signing\";\nimport { privateKeyToAccount, type PrivateKeyAccount } from \"viem/accounts\";\nimport type { Hex } from \"./types\";\n\ntype SignTypedDataParams = Parameters<\n AbstractViemLocalAccount[\"signTypedData\"]\n>[0];\n\n/**\n * Compatibility wrapper for SDK versions that removed PrivateKeySigner.\n *\n * It exposes the viem local-account shape accepted by the Hyperliquid SDK.\n */\nexport class PrivateKeySigner implements AbstractViemLocalAccount {\n #account: PrivateKeyAccount;\n readonly address: Hex;\n\n constructor(privateKey: string) {\n this.#account = privateKeyToAccount(normalizePrivateKey(privateKey));\n this.address = this.#account.address;\n }\n\n signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return this.#account.signTypedData(\n params as Parameters<PrivateKeyAccount[\"signTypedData\"]>[0],\n );\n }\n}\n\nfunction normalizePrivateKey(privateKey: string): Hex {\n return (privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`) as Hex;\n}\n","import type { StoredAgent } from \"./types\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\n\nexport const AGENT_NAME = \"hypurr-connect\";\n\nconst AGENT_STORAGE_PREFIX = \"hypurr-connect-agent\";\n\nfunction storageKey(masterAddress: string): string {\n return `${AGENT_STORAGE_PREFIX}:${masterAddress.toLowerCase()}`;\n}\n\nexport function loadAgent(masterAddress: string): StoredAgent | null {\n try {\n const raw = localStorage.getItem(storageKey(masterAddress));\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nexport function saveAgent(masterAddress: string, agent: StoredAgent): void {\n localStorage.setItem(storageKey(masterAddress), JSON.stringify(agent));\n}\n\nexport function clearAgent(masterAddress: string): void {\n localStorage.removeItem(storageKey(masterAddress));\n}\n\n/** A locally-stored agent alongside the master address it was approved for. */\nexport interface LocalApprovedAgent extends StoredAgent {\n masterAddress: string;\n}\n\n/**\n * Enumerate every agent approved and stored locally on this device by scanning\n * localStorage for the agent storage prefix. Newest approvals first.\n */\nexport function loadAllAgents(): LocalApprovedAgent[] {\n const agents: LocalApprovedAgent[] = [];\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (!key || !key.startsWith(`${AGENT_STORAGE_PREFIX}:`)) continue;\n const raw = localStorage.getItem(key);\n if (!raw) continue;\n try {\n const agent = JSON.parse(raw) as StoredAgent;\n agents.push({\n ...agent,\n masterAddress: key.slice(key.indexOf(\":\") + 1),\n });\n } catch {\n // Skip malformed entries.\n }\n }\n } catch {\n return [];\n }\n return agents.sort((a, b) => b.approvedAt - a.approvedAt);\n}\n\n/**\n * Generate a random 32-byte private key and derive its address using the\n * local PrivateKeySigner compatibility wrapper.\n */\nexport async function generateAgentKey(): Promise<{\n privateKey: `0x${string}`;\n address: `0x${string}`;\n}> {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const privateKey = `0x${hex}` as `0x${string}`;\n\n const signer = new PrivateKeySigner(privateKey);\n return { privateKey, address: signer.address };\n}\n\ninterface ExtraAgent {\n address: string;\n name: string;\n validUntil: number;\n}\n\nfunction isNamedAgent(agent: ExtraAgent): boolean {\n return agent.name.replace(/ valid_until \\d+$/, \"\") === AGENT_NAME;\n}\n\nasync function fetchExtraAgents(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent[]> {\n const url = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/info\"\n : \"https://api.hyperliquid.xyz/info\";\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type: \"extraAgents\", user: userAddress }),\n });\n\n if (!res.ok) return [];\n\n const agents: unknown = await res.json();\n if (!Array.isArray(agents)) return [];\n\n // The extraAgents API already returns validUntil in epoch ms.\n return agents as ExtraAgent[];\n}\n\n/**\n * Query the Hyperliquid info API for the named agents registered to a user.\n * Returns the matching entry for AGENT_NAME if it exists and is still valid.\n */\nexport async function fetchActiveAgent(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const nowMs = Date.now();\n const agents = await fetchExtraAgents(userAddress, isTestnet);\n const match = agents.find((a) => isNamedAgent(a) && a.validUntil > nowMs);\n if (!match) return null;\n return match;\n}\n\nexport async function fetchAgentByAddress(\n userAddress: string,\n agentAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const agents = await fetchExtraAgents(userAddress, isTestnet);\n return (\n agents.find(\n (agent) => agent.address.toLowerCase() === agentAddress.toLowerCase(),\n ) ?? null\n );\n}\n\n/**\n * Checks whether a stored agent is still valid: the address must appear in the\n * on-chain `extraAgents` list and not be expired.\n */\nexport async function isAgentValid(\n stored: StoredAgent,\n userAddress: string,\n isTestnet: boolean,\n): Promise<boolean> {\n if (stored.validUntil <= Date.now()) return false;\n\n const remote = await fetchActiveAgent(userAddress, isTestnet);\n if (!remote) return false;\n\n return (\n remote.address.toLowerCase() === stored.address.toLowerCase() &&\n remote.validUntil > Date.now()\n );\n}\n\nconst DEAD_AGENT_PATTERNS = [\n /agent address .+ is not valid/i,\n /unknown signer/i,\n /not authorized/i,\n /not an agent/i,\n];\n\n/**\n * Returns true if the error indicates the agent has been pruned, expired,\n * or is otherwise no longer registered on-chain.\n */\nexport function isDeadAgentError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return DEAD_AGENT_PATTERNS.some((p) => p.test(msg));\n}\n","import { GrpcWebFetchTransport } from \"@protobuf-ts/grpcweb-transport\";\nimport { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type { HypurrConnectConfig } from \"./types\";\n\nconst DEFAULT_GRPC_URL = \"https://grpc.hypurr.fun\";\n\nfunction resolveGrpcUrl(config: HypurrConnectConfig): string {\n return config.grpcUrl?.trim() || DEFAULT_GRPC_URL;\n}\n\nfunction createTransport(config: HypurrConnectConfig) {\n return new GrpcWebFetchTransport({\n baseUrl: resolveGrpcUrl(config),\n timeout: config.grpcTimeout ?? 15_000,\n });\n}\n\nexport function createTelegramClient(\n config: HypurrConnectConfig,\n): TelegramClient {\n return new TelegramClient(createTransport(config));\n}\n\nexport function createStaticClient(config: HypurrConnectConfig): StaticClient {\n return new StaticClient(createTransport(config));\n}\n","import type { IRequestTransport } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\n\nexport interface GrpcExchangeTransportConfig {\n isTestnet?: boolean;\n telegramClient: TelegramClient;\n rpcOptions?: RpcOptions;\n walletId: number;\n onAuthError?: () => void;\n}\n\ninterface ExchangePayload {\n action: { type: string; [key: string]: unknown };\n nonce: number;\n signature?: { r: string; s: string; v: number };\n vaultAddress?: string | null;\n}\n\n/**\n * Routes exchange requests through the Hypurr gRPC backend (HyperliquidCoreAction)\n * for server-side signing. The backend handles signature generation.\n *\n * The SDK-generated nonce is forwarded; the action payload is JSON-encoded as bytes.\n * Info/explorer requests are proxied directly to the Hyperliquid HTTP API.\n */\nexport class GrpcExchangeTransport implements IRequestTransport {\n isTestnet: boolean;\n private telegramClient: TelegramClient;\n private rpcOptions?: RpcOptions;\n private walletId: number;\n private infoUrl: string;\n private onAuthError?: () => void;\n\n constructor(config: GrpcExchangeTransportConfig) {\n this.isTestnet = config.isTestnet ?? false;\n this.telegramClient = config.telegramClient;\n this.rpcOptions = config.rpcOptions;\n this.walletId = config.walletId;\n this.onAuthError = config.onAuthError;\n this.infoUrl = this.isTestnet\n ? \"https://api.hyperliquid-testnet.xyz\"\n : \"https://api.hyperliquid.xyz\";\n }\n\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n if (endpoint === \"exchange\") {\n return this.exchangeViaGrpc<T>(payload as ExchangePayload, signal);\n }\n return this.directRequest<T>(endpoint, payload, signal);\n }\n\n private async exchangeViaGrpc<T>(\n payload: ExchangePayload,\n signal?: AbortSignal,\n ): Promise<T> {\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const actionBytes = new TextEncoder().encode(\n JSON.stringify(payload.action),\n );\n\n console.debug(\"[GrpcExchangeTransport] sending action:\", payload.action);\n\n let response;\n try {\n ({ response } = await this.telegramClient.hyperliquidCoreAction(\n {\n authData: {},\n walletId: this.walletId,\n action: actionBytes,\n nonce: payload.nonce || Date.now(),\n },\n this.rpcOptions,\n ));\n } catch (err) {\n if (\n this.onAuthError &&\n err instanceof Error &&\n /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n err.message,\n )\n ) {\n this.onAuthError();\n }\n throw err;\n }\n\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const { status, result, error } = response;\n\n console.debug(\n \"[GrpcExchangeTransport] gRPC status:\",\n status,\n \"error:\",\n error,\n );\n\n if (error) {\n throw new Error(`GrpcExchangeTransport: ${error}`);\n }\n\n // The backend's `result` contains the raw Hyperliquid API JSON response.\n // The SDK's assertSuccessResponse expects the same shape as the HTTP API,\n // e.g. { status: \"ok\", response: { type: \"order\", data: { statuses: [...] } } }\n if (result && result.length > 0) {\n const parsed = JSON.parse(new TextDecoder().decode(result));\n console.debug(\"[GrpcExchangeTransport] parsed result:\", parsed);\n return parsed as T;\n }\n\n // Fallback: return a minimal success shape if no result bytes\n return { status: \"ok\", response: status } as T;\n }\n\n private async directRequest<T>(\n endpoint: string,\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const res = await fetch(`${this.infoUrl}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n }\n\n return (await res.json()) as T;\n }\n}\n","import type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\nconst MS_PER_SECOND = 1_000;\nconst NS_PER_MS = 1_000_000;\nconst MS_PER_DAY = 24 * 60 * 60 * 1_000;\nconst TELEGRAM_AGENT_APPROVAL_NAME = \"xyz\";\n\nexport interface AgentApprovalDurationOption {\n label: string;\n durationMs: number;\n}\n\nexport const DEFAULT_AGENT_APPROVAL_DURATION_MS = MS_PER_DAY;\n\nexport const AGENT_APPROVAL_DURATION_OPTIONS: AgentApprovalDurationOption[] = [\n { label: \"1 day\", durationMs: MS_PER_DAY },\n { label: \"7 days\", durationMs: 7 * MS_PER_DAY },\n { label: \"30 days\", durationMs: 30 * MS_PER_DAY },\n { label: \"90 days\", durationMs: 90 * MS_PER_DAY },\n];\n\ntype TimestampLike =\n | {\n seconds?: number | string | bigint;\n nanos?: number | string | bigint;\n }\n | string\n | number\n | Date;\n\nfunction toFiniteNumber(value: number | string | bigint | undefined): number {\n if (value === undefined) return 0;\n const numeric = typeof value === \"bigint\" ? Number(value) : Number(value);\n return Number.isFinite(numeric) ? numeric : 0;\n}\n\nexport function normalizeAgentApprovalDurationMs(durationMs?: number): number {\n return typeof durationMs === \"number\" &&\n Number.isFinite(durationMs) &&\n durationMs > 0\n ? durationMs\n : DEFAULT_AGENT_APPROVAL_DURATION_MS;\n}\n\nexport function createTelegramAgentApprovalName(durationMs?: number): string {\n const expiresAt = Date.now() + normalizeAgentApprovalDurationMs(durationMs);\n return `${TELEGRAM_AGENT_APPROVAL_NAME} valid_until ${expiresAt}`;\n}\n\ntype WalletWithAgentExpiry = Pick<HyperliquidWallet, \"isAgent\"> & {\n agentExpiresAt?: unknown;\n};\n\nexport function agentExpiresAtMs(wallet: WalletWithAgentExpiry): number | null {\n if (!wallet.isAgent || !wallet.agentExpiresAt) return null;\n\n const timestamp = wallet.agentExpiresAt as TimestampLike;\n if (timestamp instanceof Date) return timestamp.getTime();\n if (typeof timestamp === \"number\") return timestamp;\n if (typeof timestamp === \"string\") {\n const parsed = Date.parse(timestamp);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n const seconds = toFiniteNumber(timestamp.seconds);\n const nanos = toFiniteNumber(timestamp.nanos);\n const ms = seconds * MS_PER_SECOND + Math.floor(nanos / NS_PER_MS);\n return Number.isFinite(ms) && ms > 0 ? ms : null;\n}\n\nexport function formatAgentExpiry(expiresAtMs: number): string {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(new Date(expiresAtMs));\n}\n\nexport function getAgentExpiryTitle(\n wallet: WalletWithAgentExpiry,\n): string | null {\n const expiresAtMs = agentExpiresAtMs(wallet);\n if (!expiresAtMs || expiresAtMs > Date.now()) return null;\n\n const expiresAt = formatAgentExpiry(expiresAtMs);\n return `Agent approval expired ${expiresAt}. Connect the owner wallet to renew this agent.`;\n}\n","import {\n AnimatePresence,\n motion,\n useAnimationControls,\n type PanInfo,\n} from \"framer-motion\";\nimport { useCallback, type CSSProperties, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { useIsMobile } from \"./useIsMobile\";\nimport { MetaMaskColorIcon } from \"./icons/MetaMaskColorIcon\";\nimport { TelegramColorIcon } from \"./icons/TelegramColorIcon\";\n\nexport interface LoginModalProps {\n onConnectWallet: () => void;\n walletIcon?: ReactNode;\n /** CSS color used as the modal/drawer background. Defaults to `rgba(20,20,20,0.95)`. */\n backgroundColor?: string;\n}\n\nconst DEFAULT_BACKGROUND_COLOR = \"rgba(20,20,20,0.95)\";\n\nconst btnStyle: CSSProperties = {\n display: \"flex\",\n height: 53,\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n overflow: \"hidden\",\n borderRadius: 4,\n background: \"rgba(255,255,255,0.1)\",\n padding: \"4px 24px\",\n fontSize: 14,\n fontWeight: 500,\n letterSpacing: \"-0.03em\",\n color: \"#fff\",\n cursor: \"pointer\",\n border: \"none\",\n transition: \"background 150ms\",\n};\n\nconst btnHoverBg = { background: \"rgba(255,255,255,0.15)\" };\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 100,\n background: \"rgba(0,0,0,0.6)\",\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n};\n\nconst modalWrapperStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 101,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n};\n\nconst modalBoxStyle: CSSProperties = {\n display: \"flex\",\n width: 400,\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n overflow: \"hidden\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.1)\",\n padding: 24,\n};\n\nconst headingStyle: CSSProperties = {\n fontSize: 20,\n fontWeight: 500,\n letterSpacing: \"-0.03em\",\n color: \"#fff\",\n margin: 0,\n};\n\nconst dividerStyle: CSSProperties = {\n height: 1,\n width: \"100%\",\n background: \"rgba(255,255,255,0.05)\",\n};\n\nconst iconSize: CSSProperties = { width: 26, height: 26 };\n\nfunction HoverButton({\n onClick,\n children,\n}: {\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <motion.button\n type=\"button\"\n onClick={onClick}\n style={btnStyle}\n whileHover={btnHoverBg}\n >\n {children}\n </motion.button>\n );\n}\n\nexport function LoginModal({\n onConnectWallet,\n walletIcon,\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n}: LoginModalProps) {\n const { loginTelegram, loginModalOpen, closeLoginModal } =\n useHypurrConnectInternal();\n\n const handleTelegramAuth = useCallback(() => {\n closeLoginModal();\n loginTelegram();\n }, [loginTelegram, closeLoginModal]);\n\n const isMobile = useIsMobile();\n\n const modalContent = (\n <>\n <div\n style={{\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n <HoverButton onClick={handleTelegramAuth}>\n <TelegramColorIcon style={iconSize} />\n Telegram\n </HoverButton>\n </div>\n\n <div style={dividerStyle} />\n\n <HoverButton\n onClick={() => {\n closeLoginModal();\n onConnectWallet();\n }}\n >\n {walletIcon ?? <MetaMaskColorIcon style={iconSize} />}\n Wallet\n </HoverButton>\n </>\n );\n\n return (\n <AnimatePresence>\n {loginModalOpen &&\n (isMobile ? (\n <MobileDrawer\n key=\"drawer\"\n onClose={closeLoginModal}\n backgroundColor={backgroundColor}\n >\n {modalContent}\n </MobileDrawer>\n ) : (\n <>\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={closeLoginModal}\n />\n <motion.div\n key=\"modal-wrapper\"\n style={modalWrapperStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.05 }}\n onClick={closeLoginModal}\n >\n <motion.div\n style={{ ...modalBoxStyle, background: backgroundColor }}\n initial={{ scale: 0.96, opacity: 0, y: 8 }}\n animate={{ scale: 1, opacity: 1, y: 0 }}\n exit={{ scale: 0.96, opacity: 0, y: 8 }}\n transition={{ duration: 0.12 }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 style={headingStyle}>Connect</h2>\n {modalContent}\n </motion.div>\n </motion.div>\n </>\n ))}\n </AnimatePresence>\n );\n}\n\nconst drawerSheetStyle: CSSProperties = {\n position: \"fixed\",\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 101,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderLeft: \"1px solid rgba(255,255,255,0.1)\",\n borderRight: \"1px solid rgba(255,255,255,0.1)\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n padding: \"12px 24px max(24px, env(safe-area-inset-bottom))\",\n};\n\nconst drawerBgStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n right: 0,\n top: 0,\n bottom: \"-100vh\",\n zIndex: -1,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n};\n\nconst grabHandleAreaStyle: CSSProperties = {\n width: \"100%\",\n cursor: \"grab\",\n paddingBottom: 4,\n};\n\nconst grabHandleStyle: CSSProperties = {\n margin: \"0 auto\",\n height: 4,\n width: 100,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.05)\",\n};\n\nfunction MobileDrawer({\n children,\n onClose,\n backgroundColor,\n}: {\n children: ReactNode;\n onClose: () => void;\n backgroundColor: string;\n}) {\n const controls = useAnimationControls();\n\n const handleDragEnd = useCallback(\n (_: unknown, info: PanInfo) => {\n if (info.offset.y > 100 || info.velocity.y > 500) {\n onClose();\n } else {\n controls.start({ y: 0 });\n }\n },\n [onClose, controls],\n );\n\n return (\n <>\n <motion.div\n key=\"drawer-backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n\n <motion.div\n key=\"drawer-sheet\"\n style={{ ...drawerSheetStyle, background: backgroundColor }}\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ type: \"tween\", duration: 0.3, ease: [0.32, 0.72, 0, 1] }}\n drag=\"y\"\n dragConstraints={{ top: 0, bottom: 0 }}\n dragElastic={{ top: 0, bottom: 0.4 }}\n onDragEnd={handleDragEnd}\n >\n <div style={{ ...drawerBgStyle, background: backgroundColor }} />\n\n <div style={grabHandleAreaStyle}>\n <div style={grabHandleStyle} />\n </div>\n\n <p style={headingStyle}>Connect</p>\n\n {children}\n </motion.div>\n </>\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nconst MOBILE_BREAKPOINT = 640;\n\nconst mobileQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`)\n : null;\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener(\"change\", cb);\n return () => mobileQuery?.removeEventListener(\"change\", cb);\n}\n\nfunction getSnapshotMobile() {\n return mobileQuery?.matches ?? false;\n}\n\n/** Tracks whether the viewport is at or below the mobile breakpoint (640px). */\nexport function useIsMobile() {\n return useSyncExternalStore(subscribeMobile, getSnapshotMobile, () => false);\n}\n","import type { CSSProperties } from \"react\";\n\nexport function MetaMaskColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_2567_1088)\">\n <path\n d=\"M19.8188 19.418L15.9421 18.2871L13.0186 19.9994L10.9788 19.9985L8.05356 18.2871L4.17862 19.418L3 15.5193L4.17875 11.1924L3 7.5341L4.17875 3L10.2336 6.54437H13.7639L19.8188 3L20.9976 7.5341L19.8188 11.1924L20.9976 15.5193L19.8188 19.418Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M4.17969 3L10.2347 6.54685L9.99394 8.98101L4.17969 3ZM8.05476 15.5209L10.7189 17.5093L8.05476 18.2869V15.5209ZM10.5059 12.2335L9.99394 8.98275L6.71642 11.1934L6.71464 11.1925V11.1941L6.72479 13.4695L8.05387 12.2336L10.5059 12.2335ZM19.819 3L13.7641 6.54685L14.004 8.98101L19.819 3ZM15.9441 15.5209L13.2798 17.5093L15.9441 18.2869V15.5209ZM17.2833 11.194V11.1924L17.2825 11.1932L14.0049 8.98275L13.4929 12.2335H15.944L17.2739 13.4693L17.2833 11.194Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M8.05369 18.2867L4.17875 19.4177L3 15.5207H8.05369V18.2867ZM10.5049 12.2324L11.245 16.9321L10.2191 14.319L6.72296 13.4691L8.0528 12.2325L10.5049 12.2324ZM15.9438 18.2867L19.8188 19.4177L20.9976 15.5206H15.9438C15.9438 15.5207 15.9438 18.2867 15.9438 18.2867ZM13.4927 12.2324L12.7526 16.9321L13.7783 14.319L17.2748 13.4691L15.944 12.2325L13.4927 12.2324Z\"\n fill=\"#E34807\"\n />\n <path\n d=\"M3 15.5194L4.17875 11.1924H6.71358L6.72283 13.4686L10.2194 14.3185L11.2451 16.9315L10.7178 17.5069L8.05369 15.5185H3V15.5194ZM20.9976 15.5194L19.8188 11.1924H17.2839L17.2746 13.4686L13.7783 14.3185L12.7524 16.9315L13.2796 17.5069L15.9439 15.5185H20.9976V15.5194ZM13.7639 6.54443H10.2336L9.99389 8.97859L11.2453 16.9289H12.7526L14.0047 8.97859L13.7639 6.54443Z\"\n fill=\"#FF8D5D\"\n />\n <path\n d=\"M4.17875 3L3 7.5341L4.17875 11.1924H6.71358L9.99287 8.98114L4.17875 3ZM9.77231 13.1766H8.62399L7.9988 13.7771L10.2202 14.3166L9.77231 13.1757V13.1766ZM19.8188 3L20.9976 7.5341L19.8188 11.1924H17.2839L14.0047 8.98114L19.8188 3ZM14.2269 13.1766H15.3769L16.0021 13.7778L13.7782 14.3184L14.2269 13.1757V13.1766ZM13.0178 18.4484L13.2798 17.5086L12.7524 16.9332H11.244L10.7168 17.5086L10.9787 18.4484\"\n fill=\"#661800\"\n />\n <path\n d=\"M13.0173 18.4482V20.0001H10.9785V18.4482H13.0173Z\"\n fill=\"#C0C4CD\"\n />\n <path\n d=\"M8.05469 18.2854L10.9807 19.9994V18.4475L10.7187 17.5078L8.05469 18.2854ZM15.944 18.2854L13.0179 19.9994V18.4475L13.2799 17.5078L15.944 18.2854Z\"\n fill=\"#E7EBF6\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2567_1088\">\n <rect\n width=\"18\"\n height=\"17\"\n fill=\"white\"\n transform=\"translate(3 3)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function TelegramColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z\"\n fill=\"url(#paint0_linear_2571_1084)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.07426 11.905C9.69794 10.7619 11.4475 10.0083 12.3229 9.64417C14.8222 8.60458 15.3416 8.424 15.6801 8.41803C15.7546 8.41672 15.921 8.43517 16.0289 8.52267C16.1199 8.59655 16.145 8.69635 16.1569 8.7664C16.1689 8.83645 16.1839 8.99602 16.172 9.1207C16.0366 10.5438 15.4505 13.9973 15.1523 15.5912C15.0262 16.2657 14.7778 16.4918 14.5373 16.514C14.0146 16.562 13.6178 16.1686 13.1115 15.8367C12.3194 15.3175 11.8719 14.9943 11.103 14.4876C10.2145 13.902 10.7905 13.5802 11.2969 13.0542C11.4294 12.9166 13.7322 10.822 13.7768 10.632C13.7824 10.6082 13.7875 10.5196 13.7349 10.4729C13.6823 10.4261 13.6046 10.4421 13.5486 10.4548C13.4691 10.4728 12.2037 11.3092 9.75232 12.964C9.39313 13.2106 9.06779 13.3308 8.7763 13.3245C8.45496 13.3176 7.83681 13.1428 7.37729 12.9934C6.81366 12.8102 6.3657 12.7134 6.40471 12.4022C6.42503 12.2401 6.64821 12.0744 7.07426 11.905Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_2571_1084\"\n x1=\"903\"\n y1=\"3\"\n x2=\"903\"\n y2=\"1789.65\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#2AABEE\" />\n <stop offset=\"1\" stopColor=\"#229ED9\" />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport { useCallback, useState, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport {\n AGENT_APPROVAL_DURATION_OPTIONS,\n DEFAULT_AGENT_APPROVAL_DURATION_MS,\n createTelegramAgentApprovalName,\n type AgentApprovalDurationOption,\n} from \"./agentWallet\";\nimport {\n AlertTriangle,\n Check,\n Eye,\n EyeOff,\n KeyRound,\n Loader2,\n Plus,\n SpinKeyframes,\n Wallet,\n X,\n} from \"./icons/lucide\";\nimport type { Hex, SignTypedDataFn } from \"./types\";\n\nexport interface AddWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n ownerAddress?: string | null;\n isWalletConnected?: boolean;\n chainId?: number;\n signTypedDataAsync?: SignTypedDataFn;\n onConnectWallet?: () => void;\n onDisconnectWallet?: () => void;\n onWalletAdded?: (wallet?: HyperliquidWallet) => void | Promise<void>;\n onAddReadOnlyWallet?: (address: string) => void | Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n hyperliquidChain?: \"Mainnet\" | \"Testnet\" | string;\n /** Expiration choices for owner-approved agent wallets. Defaults to 1/7/30/90 days. */\n agentApprovalDurationOptions?: AgentApprovalDurationOption[];\n /** Initial owner approval duration. Defaults to 1 day. */\n defaultAgentApprovalDurationMs?: number;\n}\n\ntype TabKey = \"generate\" | \"import\" | \"api\" | \"readonly\";\n\nconst WALLET_NAME_REGEX = /^[a-zA-Z0-9/]*$/;\nconst PRIVATE_KEY_REGEX = /^(0x)?[a-fA-F0-9]{64}$/;\nconst BASE_TAB_KEYS: TabKey[] = [\"generate\", \"import\", \"api\"];\n\nfunction createAuthSignatureRequest(\n chainId: number,\n hyperliquidChain: string,\n agentAddress: string,\n approvalDurationMs: number,\n) {\n const nonce = Date.now();\n\n return {\n domain: {\n name: \"HyperliquidSignTransaction\",\n version: \"1\",\n chainId,\n verifyingContract: \"0x0000000000000000000000000000000000000000\" as const,\n },\n types: {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n },\n primaryType: \"HyperliquidTransaction:ApproveAgent\",\n message: {\n hyperliquidChain,\n agentAddress: agentAddress.toLowerCase() as Hex,\n agentName: createTelegramAgentApprovalName(approvalDurationMs),\n nonce,\n },\n };\n}\n\nconst tabClass = (selected: boolean) =>\n `flex-1 py-1.5 rounded text-base font-medium flex items-center justify-center gap-1.5 ${\n selected ? \"btn-raised-active\" : \"btn-raised\"\n }`;\n\nconst inputClass = (hasError?: boolean) =>\n `input ${\n hasError ? \"input-error\" : \"\"\n } w-full rounded-lg px-3 py-2.5 text-content placeholder-content-faint focus:outline-none font-mono text-base`;\n\nconst formatAddress = (address: string) =>\n `${address.slice(0, 6)}...${address.slice(-4)}`;\n\nexport function AddWalletModal({\n isOpen,\n onClose,\n ownerAddress,\n isWalletConnected,\n chainId,\n signTypedDataAsync,\n onConnectWallet,\n onDisconnectWallet,\n onWalletAdded,\n onAddReadOnlyWallet,\n onNotify,\n hyperliquidChain = \"Mainnet\",\n agentApprovalDurationOptions,\n defaultAgentApprovalDurationMs = DEFAULT_AGENT_APPROVAL_DURATION_MS,\n}: AddWalletModalProps): ReactNode {\n const tabKeys = onAddReadOnlyWallet\n ? [...BASE_TAB_KEYS, \"readonly\" as const]\n : BASE_TAB_KEYS;\n\n const [activeTab, setActiveTab] = useState<TabKey>(\"generate\");\n const [isLoading, setIsLoading] = useState(false);\n const [walletName, setWalletName] = useState(\"\");\n const [newWalletName, setNewWalletName] = useState(\"\");\n const [importWalletName, setImportWalletName] = useState(\"\");\n const [importPrivateKey, setImportPrivateKey] = useState(\"\");\n const [showImportPrivateKey, setShowImportPrivateKey] = useState(false);\n const [readOnlyAddress, setReadOnlyAddress] = useState(\"\");\n const [agentApprovalDurationMs, setAgentApprovalDurationMs] = useState(\n defaultAgentApprovalDurationMs,\n );\n const [error, setError] = useState<string | null>(null);\n\n const {\n authMethod,\n createWallet,\n isLoading: userLoading,\n refreshWallets,\n telegramClient,\n telegramRpcOptions,\n } = useHypurrConnectInternal();\n\n const isValidWalletName =\n walletName.length > 0 && WALLET_NAME_REGEX.test(walletName);\n const isValidNewWalletName =\n newWalletName.length > 0 && WALLET_NAME_REGEX.test(newWalletName);\n const isValidImportWalletName =\n importWalletName.length > 0 && WALLET_NAME_REGEX.test(importWalletName);\n const trimmedImportPrivateKey = importPrivateKey.trim();\n const isValidImportPrivateKey = PRIVATE_KEY_REGEX.test(\n trimmedImportPrivateKey,\n );\n const isProcessing = isLoading || userLoading;\n const durationOptions =\n agentApprovalDurationOptions && agentApprovalDurationOptions.length > 0\n ? agentApprovalDurationOptions\n : AGENT_APPROVAL_DURATION_OPTIONS;\n\n const handleClose = useCallback(() => {\n if (isProcessing) return;\n setError(null);\n setImportPrivateKey(\"\");\n setShowImportPrivateKey(false);\n onClose();\n }, [isProcessing, onClose]);\n\n const assertTelegramReady = useCallback(() => {\n if (authMethod !== \"telegram\" || !telegramRpcOptions) {\n throw new Error(\"Telegram login is required to add wallets\");\n }\n }, [authMethod, telegramRpcOptions]);\n\n const completeWalletAdded = useCallback(\n async (wallet?: HyperliquidWallet) => {\n refreshWallets();\n await onWalletAdded?.(wallet);\n },\n [onWalletAdded, refreshWallets],\n );\n\n const handleCreateWallet = useCallback(async () => {\n if (!isValidNewWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const wallet = await createWallet(newWalletName);\n await completeWalletAdded(wallet);\n onNotify?.({ type: \"success\", message: \"Wallet created successfully\" });\n setNewWalletName(\"\");\n handleClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to create wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n completeWalletAdded,\n createWallet,\n handleClose,\n isValidNewWalletName,\n newWalletName,\n onNotify,\n ]);\n\n const handleImportWallet = useCallback(async () => {\n if (!isValidImportWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n if (!isValidImportPrivateKey) {\n setError(\"Please enter a valid 64-character hex private key\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const response = await telegramClient.hyperliquidWalletImport(\n {\n authData: {},\n name: importWalletName,\n privateKey: trimmedImportPrivateKey,\n },\n telegramRpcOptions,\n );\n await completeWalletAdded(response.response.wallet);\n onNotify?.({ type: \"success\", message: \"Wallet imported successfully\" });\n setImportWalletName(\"\");\n setImportPrivateKey(\"\");\n handleClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to import wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n completeWalletAdded,\n handleClose,\n importWalletName,\n isValidImportPrivateKey,\n isValidImportWalletName,\n onNotify,\n telegramClient,\n telegramRpcOptions,\n trimmedImportPrivateKey,\n ]);\n\n const handleSignAndAdd = useCallback(async () => {\n if (!ownerAddress) {\n onConnectWallet?.();\n return;\n }\n if (!signTypedDataAsync || !chainId) {\n setError(\"Wallet signing is not ready yet\");\n return;\n }\n if (!isValidWalletName) {\n setError(\"Wallet name may only contain letters, numbers, and /\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n assertTelegramReady();\n const res = await telegramClient.hyperliquidAgentSignatureCreate(\n { authData: {}, address: ownerAddress },\n telegramRpcOptions,\n );\n const agentAddress = res.response.agent;\n const request = createAuthSignatureRequest(\n chainId,\n hyperliquidChain,\n agentAddress,\n agentApprovalDurationMs,\n );\n const signature = await signTypedDataAsync(request);\n\n await telegramClient.hyperliquidAgentWalletCreate(\n {\n authData: {},\n name: walletName,\n signature: {\n agentAddress: request.message.agentAddress,\n agentName: request.message.agentName,\n nonce: request.message.nonce,\n chainId,\n signature,\n },\n },\n telegramRpcOptions,\n );\n\n await completeWalletAdded();\n onNotify?.({ type: \"success\", message: \"Wallet added successfully\" });\n onDisconnectWallet?.();\n setWalletName(\"\");\n handleClose();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to add wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [\n assertTelegramReady,\n agentApprovalDurationMs,\n chainId,\n completeWalletAdded,\n handleClose,\n hyperliquidChain,\n isValidWalletName,\n onConnectWallet,\n onDisconnectWallet,\n onNotify,\n ownerAddress,\n signTypedDataAsync,\n telegramClient,\n telegramRpcOptions,\n walletName,\n ]);\n\n const handleAddReadOnly = useCallback(async () => {\n const trimmed = readOnlyAddress.trim();\n if (!trimmed) {\n setError(\"Please enter a wallet address\");\n return;\n }\n if (!/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {\n setError(\"Invalid Ethereum address format\");\n return;\n }\n setError(null);\n setIsLoading(true);\n try {\n await onAddReadOnlyWallet?.(trimmed);\n onNotify?.({ type: \"success\", message: \"Read-only wallet added\" });\n setReadOnlyAddress(\"\");\n handleClose();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : \"Failed to add wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsLoading(false);\n }\n }, [handleClose, onAddReadOnlyWallet, onNotify, readOnlyAddress]);\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <SpinKeyframes />\n <motion.div\n className=\"fixed inset-0 z-[100] bg-overlay/70 backdrop-blur-sm\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div\n className=\"fixed inset-0 z-[101] flex items-center justify-center p-4\"\n onClick={handleClose}\n >\n <motion.div\n className=\"relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6\">\n <h3 className=\"text-lg font-medium text-content\">Add Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isProcessing}\n className=\"absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"flex gap-1.5 px-6 pt-5\">\n {tabKeys.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => {\n setError(null);\n setActiveTab(tab);\n }}\n className={tabClass(activeTab === tab)}\n >\n {tab === \"generate\" ? (\n <>\n <Plus size={13} /> New\n </>\n ) : tab === \"import\" ? (\n <>\n <KeyRound size={13} /> Import\n </>\n ) : tab === \"api\" ? (\n <>\n <Wallet size={13} /> Link\n </>\n ) : (\n <>\n <Eye size={13} /> Watch\n </>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"px-6 pb-6 pt-5\">\n {activeTab === \"generate\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Create a new Hyperliquid wallet.\n </p>\n <WalletNameInput\n value={newWalletName}\n setValue={setNewWalletName}\n isValid={isValidNewWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyNewWallet\"\n />\n <button\n onClick={handleCreateWallet}\n disabled={isProcessing || !isValidNewWalletName}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && isValidNewWalletName\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Creating...\n </>\n ) : (\n <>\n <Plus size={14} /> Create Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"import\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Import a Hyperliquid wallet with its private key.\n </p>\n <WalletNameInput\n value={importWalletName}\n setValue={setImportWalletName}\n isValid={isValidImportWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyImportedWallet\"\n />\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Private Key\n </label>\n <div className=\"relative\">\n <input\n type={showImportPrivateKey ? \"text\" : \"password\"}\n value={importPrivateKey}\n onChange={(event) => {\n setImportPrivateKey(event.target.value);\n setError(null);\n }}\n placeholder=\"0x...\"\n spellCheck={false}\n autoComplete=\"off\"\n className={`${inputClass(\n !!importPrivateKey && !isValidImportPrivateKey,\n )} pr-11`}\n />\n <button\n type=\"button\"\n onClick={() =>\n setShowImportPrivateKey((visible) => !visible)\n }\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-content-subtle transition-colors hover:text-content-tertiary\"\n aria-label={\n showImportPrivateKey\n ? \"Hide private key\"\n : \"Show private key\"\n }\n >\n {showImportPrivateKey ? (\n <EyeOff size={15} />\n ) : (\n <Eye size={15} />\n )}\n </button>\n </div>\n </div>\n <button\n onClick={handleImportWallet}\n disabled={\n isProcessing ||\n !isValidImportWalletName ||\n !isValidImportPrivateKey\n }\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing &&\n isValidImportWalletName &&\n isValidImportPrivateKey\n ? \"btn-raised-accent\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Importing...\n </>\n ) : (\n <>\n <KeyRound size={14} /> Import Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"api\" && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n Connect your wallet and sign to link it for trading.\n </p>\n {!isWalletConnected || !ownerAddress ? (\n <button\n onClick={onConnectWallet}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium\"\n >\n <Wallet size={14} /> Connect Wallet\n </button>\n ) : (\n <>\n <div className=\"flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5\">\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover\">\n <Wallet size={14} className=\"text-content-muted\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base text-content-muted\">\n Connected\n </p>\n <p className=\"font-mono text-base text-content\">\n {formatAddress(ownerAddress)}\n </p>\n </div>\n <Check\n size={16}\n className=\"flex-shrink-0 text-trade-up\"\n />\n </div>\n <WalletNameInput\n value={walletName}\n setValue={setWalletName}\n isValid={isValidWalletName}\n clearError={() => setError(null)}\n placeholder=\"MyWallet\"\n />\n <ApprovalDurationPicker\n value={agentApprovalDurationMs}\n onChange={setAgentApprovalDurationMs}\n options={durationOptions}\n disabled={isProcessing}\n />\n <button\n onClick={handleSignAndAdd}\n disabled={isProcessing || !isValidWalletName}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && isValidWalletName\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Signing...\n </>\n ) : (\n \"Sign & Add Wallet\"\n )}\n </button>\n {onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n className=\"w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary\"\n >\n Disconnect & use different wallet\n </button>\n )}\n </>\n )}\n {error && <ErrorBox message={error} />}\n </section>\n )}\n\n {activeTab === \"readonly\" && onAddReadOnlyWallet && (\n <section className=\"space-y-4\">\n <p className=\"text-base text-content-muted\">\n View positions and balances without trading access.\n </p>\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Wallet Address\n </label>\n <input\n type=\"text\"\n value={readOnlyAddress}\n onChange={(event) =>\n setReadOnlyAddress(event.target.value)\n }\n placeholder=\"0x...\"\n className={inputClass()}\n />\n </div>\n <button\n onClick={handleAddReadOnly}\n disabled={isProcessing || !readOnlyAddress.trim()}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n !isProcessing && readOnlyAddress.trim()\n ? \"btn-raised\"\n : \"btn-raised-disabled\"\n }`}\n >\n {isProcessing ? (\n <>\n <Loader2 size={14} /> Adding...\n </>\n ) : (\n <>\n <Eye size={14} /> Add Watch Wallet\n </>\n )}\n </button>\n {error && <ErrorBox message={error} />}\n </section>\n )}\n </div>\n </motion.div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nfunction WalletNameInput({\n value,\n setValue,\n isValid,\n clearError,\n placeholder,\n}: {\n value: string;\n setValue: (value: string) => void;\n isValid: boolean;\n clearError: () => void;\n placeholder: string;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Wallet Name\n </label>\n <input\n type=\"text\"\n value={value}\n onChange={(event) => {\n const nextValue = event.target.value;\n if (WALLET_NAME_REGEX.test(nextValue) || nextValue === \"\") {\n setValue(nextValue);\n clearError();\n }\n }}\n placeholder={placeholder}\n className={inputClass(!!value && !isValid)}\n />\n <p className=\"mt-1.5 text-base text-content-faint\">\n Letters, numbers, and / only\n </p>\n </div>\n );\n}\n\nfunction ApprovalDurationPicker({\n value,\n onChange,\n options,\n disabled,\n}: {\n value: number;\n onChange: (value: number) => void;\n options: AgentApprovalDurationOption[];\n disabled?: boolean;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Approval Duration\n </label>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {options.map((option) => (\n <button\n key={`${option.label}-${option.durationMs}`}\n type=\"button\"\n onClick={() => onChange(option.durationMs)}\n disabled={disabled}\n className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n value === option.durationMs\n ? \"bg-surface-btn-active text-content border-surface-bd-active\"\n : \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction ErrorBox({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <p className=\"text-base text-trade-down\">{message}</p>\n </div>\n );\n}\n","import type { CSSProperties, SVGProps } from \"react\";\n\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, \"fill\"> {\n size?: number;\n color?: string;\n fill?: string;\n style?: CSSProperties;\n}\n\nfunction svgBase({\n size = 16,\n color = \"currentColor\",\n fill = \"none\",\n ...rest\n}: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill,\n stroke: color,\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n ...rest,\n };\n}\n\nexport function Copy(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n );\n}\n\nexport function Star(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function User(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\nexport function Zap(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />\n </svg>\n );\n}\n\nexport function Wallet(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 12V8H6a2 2 0 0 1-2-2c0-1.1.9-2 2-2h12v4\" />\n <path d=\"M4 6v12c0 1.1.9 2 2 2h14v-4\" />\n <path d=\"M18 12a2 2 0 0 0-2 2c0 1.1.9 2 2 2h4v-4z\" />\n </svg>\n );\n}\n\nexport function Bot(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n );\n}\n\nexport function Eye(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function EyeOff(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M10.733 5.076a10.74 10.74 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.8 10.8 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function Check(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nexport function KeyRound(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function RefreshCw(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M3 12a9 9 0 0 1 15.18-6.49\" />\n <path d=\"M21 3v6h-6\" />\n <path d=\"M21 12a9 9 0 0 1-15.18 6.49\" />\n <path d=\"M3 21v-6h6\" />\n </svg>\n );\n}\n\nexport function TrendingUp(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\" />\n <polyline points=\"16 7 22 7 22 13\" />\n </svg>\n );\n}\n\nexport function Trash2(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Pencil(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n );\n}\n\nexport function LayoutDashboard(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nexport function AlertTriangle(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Loader2(props: IconProps) {\n const { size = 16, color = \"currentColor\", style, ...rest } = props;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: \"hypurr-spin 1s linear infinite\",\n ...style,\n }}\n {...rest}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function Crown(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\" />\n <path d=\"M5 21h14\" />\n </svg>\n );\n}\n\nexport function Folder(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\" />\n </svg>\n );\n}\n\nexport function LogOut(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function Plus(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nexport function X(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/** Inject the keyframes used by {@link Loader2}. Mount once at the top of any modal that spins. */\nexport function SpinKeyframes() {\n return (\n <style>{`@keyframes hypurr-spin { to { transform: rotate(360deg); } }`}</style>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport {\n AGENT_APPROVAL_DURATION_OPTIONS,\n DEFAULT_AGENT_APPROVAL_DURATION_MS,\n agentExpiresAtMs,\n formatAgentExpiry,\n getAgentExpiryTitle,\n type AgentApprovalDurationOption,\n} from \"./agentWallet\";\nimport {\n AlertTriangle,\n Check,\n Loader2,\n SpinKeyframes,\n Wallet,\n X,\n} from \"./icons/lucide\";\nimport type { Hex, SignTypedDataFn } from \"./types\";\n\nexport interface RenewAgentModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n ownerAddress?: string | null;\n isWalletConnected?: boolean;\n chainId?: number;\n signTypedDataAsync?: SignTypedDataFn;\n onConnectWallet?: () => void;\n onDisconnectWallet?: () => void;\n onRenewed?: (wallet: HyperliquidWallet) => void | Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Expiration choices for the renewed owner approval. Defaults to 1/7/30/90 days. */\n approvalDurationOptions?: AgentApprovalDurationOption[];\n /** Initial renewal approval duration. Defaults to 1 day. */\n defaultApprovalDurationMs?: number;\n}\n\nconst isHexAddress = (address?: string | null): address is Hex =>\n !!address && /^0x[a-fA-F0-9]{40}$/.test(address);\n\nconst formatAddress = (address?: string | null) =>\n address ? `${address.slice(0, 6)}...${address.slice(-4)}` : \"\";\n\nconst isSameAddress = (a?: string | null, b?: string | null) =>\n isHexAddress(a) && isHexAddress(b) && a.toLowerCase() === b.toLowerCase();\n\nexport function RenewAgentModal({\n isOpen,\n onClose,\n wallet,\n ownerAddress,\n isWalletConnected,\n chainId,\n signTypedDataAsync,\n onConnectWallet,\n onDisconnectWallet,\n onRenewed,\n onNotify,\n approvalDurationOptions,\n defaultApprovalDurationMs = DEFAULT_AGENT_APPROVAL_DURATION_MS,\n}: RenewAgentModalProps): ReactNode {\n const { renewAgentWallet } = useHypurrConnectInternal();\n const [isRenewing, setIsRenewing] = useState(false);\n const [approvalDurationMs, setApprovalDurationMs] = useState(\n defaultApprovalDurationMs,\n );\n const [error, setError] = useState<string | null>(null);\n\n const expiryMessage = useMemo(\n () => (wallet ? getAgentExpiryTitle(wallet) : null),\n [wallet],\n );\n const currentExpiryMs = useMemo(\n () => (wallet ? agentExpiresAtMs(wallet) : null),\n [wallet],\n );\n const durationOptions =\n approvalDurationOptions && approvalDurationOptions.length > 0\n ? approvalDurationOptions\n : AGENT_APPROVAL_DURATION_OPTIONS;\n const expectedOwnerAddress = wallet?.ethereumAddress ?? null;\n const agentAddress = wallet?.agentEthereumAddress?.value ?? null;\n const hasExpectedOwner = isHexAddress(expectedOwnerAddress);\n const hasAgentAddress = isHexAddress(agentAddress);\n const hasConnectedOwner = isWalletConnected && isHexAddress(ownerAddress);\n const ownerMatches = isSameAddress(ownerAddress, expectedOwnerAddress);\n const ownerReady = ownerMatches && !!chainId;\n const canRenew =\n !!wallet &&\n hasAgentAddress &&\n ownerReady &&\n !!signTypedDataAsync &&\n !isRenewing;\n\n const handleClose = useCallback(() => {\n if (isRenewing) return;\n setError(null);\n onClose();\n }, [isRenewing, onClose]);\n\n const handleRenew = useCallback(async () => {\n if (!wallet) return;\n if (!isHexAddress(agentAddress)) {\n setError(\"This wallet is missing its agent address.\");\n return;\n }\n if (!isHexAddress(expectedOwnerAddress)) {\n setError(\"This wallet is missing its owner address.\");\n return;\n }\n if (!isHexAddress(ownerAddress)) {\n onConnectWallet?.();\n return;\n }\n if (!isSameAddress(ownerAddress, expectedOwnerAddress)) {\n setError(\n `Connect the owner wallet ${formatAddress(expectedOwnerAddress)} to renew this agent.`,\n );\n return;\n }\n if (!chainId || !signTypedDataAsync) {\n setError(\"Wallet signing is not ready yet\");\n return;\n }\n\n setError(null);\n setIsRenewing(true);\n try {\n await renewAgentWallet({\n walletId: wallet.id,\n ownerAddress,\n signTypedDataAsync,\n chainId,\n approvalDurationMs,\n });\n await onRenewed?.(wallet);\n onNotify?.({ type: \"success\", message: \"Agent wallet renewed\" });\n onClose();\n } catch (e: unknown) {\n const message =\n e instanceof Error ? e.message : \"Failed to renew agent wallet\";\n setError(message);\n onNotify?.({ type: \"error\", message });\n } finally {\n setIsRenewing(false);\n }\n }, [\n agentAddress,\n approvalDurationMs,\n chainId,\n expectedOwnerAddress,\n onClose,\n onConnectWallet,\n onNotify,\n onRenewed,\n ownerAddress,\n renewAgentWallet,\n signTypedDataAsync,\n wallet,\n ]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <motion.div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <SpinKeyframes />\n <motion.div\n className=\"fixed inset-0 z-[110] bg-overlay/70 backdrop-blur-sm\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div\n className=\"fixed inset-0 z-[111] flex items-center justify-center p-4\"\n onClick={handleClose}\n >\n <motion.div\n className=\"relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6\">\n <h3 className=\"text-lg font-medium text-content\">\n Renew Agent Wallet\n </h3>\n <button\n onClick={handleClose}\n disabled={isRenewing}\n className=\"absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40\"\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"space-y-4 px-6 py-5\">\n <div className=\"flex items-start gap-2 rounded-lg border border-amber-500/25 bg-amber-500/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-amber-400\"\n />\n <p className=\"text-base text-amber-200\">\n {expiryMessage ??\n (currentExpiryMs\n ? `Current approval expires ${formatAgentExpiry(\n currentExpiryMs,\n )}. Renew to extend this agent wallet.`\n : \"Renew this agent wallet with a fresh owner approval.\")}\n </p>\n </div>\n\n <div className=\"rounded-lg border border-line bg-surface-btn p-3\">\n <p className=\"mb-1.5 text-base uppercase tracking-[0.1em] text-content-muted\">\n Agent address\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-base font-medium text-content\">\n {wallet.name || \"Unnamed Wallet\"}\n </p>\n <p className=\"font-mono text-base text-content-muted\">\n {hasAgentAddress\n ? formatAddress(agentAddress)\n : \"Missing agent address\"}\n </p>\n </div>\n <AlertTriangle\n size={16}\n className=\"flex-shrink-0 text-amber-400\"\n />\n </div>\n </div>\n\n {ownerReady ? (\n <div className=\"flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5\">\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover\">\n <Wallet size={14} className=\"text-content-muted\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base text-content-muted\">\n Owner wallet connected\n </p>\n <p className=\"font-mono text-base text-content\">\n {formatAddress(ownerAddress)}\n </p>\n </div>\n <Check size={16} className=\"flex-shrink-0 text-trade-up\" />\n </div>\n ) : hasConnectedOwner && !ownerMatches ? (\n <div className=\"space-y-3 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-base text-trade-down\">\n Wrong owner wallet connected\n </p>\n <p className=\"mt-1 font-mono text-base text-content-muted\">\n Connected {formatAddress(ownerAddress)}\n </p>\n <p className=\"font-mono text-base text-content-muted\">\n Required {formatAddress(expectedOwnerAddress)}\n </p>\n </div>\n </div>\n {onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n disabled={isRenewing}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Disconnect Wallet\n </button>\n )}\n </div>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"btn-raised flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium\"\n >\n <Wallet size={14} /> Connect Owner Wallet\n {hasExpectedOwner\n ? ` ${formatAddress(expectedOwnerAddress)}`\n : \"\"}\n </button>\n )}\n\n <ApprovalDurationPicker\n value={approvalDurationMs}\n onChange={setApprovalDurationMs}\n options={durationOptions}\n disabled={isRenewing}\n />\n\n {error && (\n <div className=\"flex items-start gap-2 rounded-lg border border-trade-down/20 bg-trade-down/[0.08] p-3\">\n <AlertTriangle\n size={14}\n className=\"mt-0.5 flex-shrink-0 text-trade-down\"\n />\n <p className=\"text-base text-trade-down\">{error}</p>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2 px-6 pb-6\">\n <button\n onClick={handleRenew}\n disabled={!canRenew}\n className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${\n canRenew ? \"btn-raised\" : \"btn-raised-disabled\"\n }`}\n >\n {isRenewing ? (\n <>\n <Loader2 size={14} /> Renewing...\n </>\n ) : (\n \"Renew Agent Wallet\"\n )}\n </button>\n {ownerReady && onDisconnectWallet && (\n <button\n onClick={onDisconnectWallet}\n disabled={isRenewing}\n className=\"w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Disconnect & use different owner\n </button>\n )}\n </div>\n </motion.div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nfunction ApprovalDurationPicker({\n value,\n onChange,\n options,\n disabled,\n}: {\n value: number;\n onChange: (value: number) => void;\n options: AgentApprovalDurationOption[];\n disabled?: boolean;\n}) {\n return (\n <div>\n <label className=\"mb-2 block text-base uppercase tracking-[0.1em] text-content-muted\">\n Approval Duration\n </label>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {options.map((option) => (\n <button\n key={`${option.label}-${option.durationMs}`}\n type=\"button\"\n onClick={() => onChange(option.durationMs)}\n disabled={disabled}\n className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n value === option.durationMs\n ? \"bg-surface-btn-active text-content border-surface-bd-active\"\n : \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n Fragment,\n useCallback,\n useMemo,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n AgentExpiryWarningIcon,\n EXPIRED_AGENT_COLOR,\n} from \"./AgentExpiryWarning\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { useIsMobile } from \"./useIsMobile\";\nimport { UserProfileModal, type SlippageOption } from \"./UserProfileModal\";\nimport { getAgentExpiryTitle } from \"./agentWallet\";\nimport {\n Copy,\n Crown,\n Folder,\n LayoutDashboard,\n LogOut,\n Plus,\n RefreshCw,\n Star,\n User,\n Wallet,\n} from \"./icons/lucide\";\nimport {\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n resolvePrincipalColors,\n} from \"./profileStyles\";\n\nexport interface WalletSelectorDropdownProps {\n isOpen: boolean;\n onClose: () => void;\n /** Called when the user clicks \"Add Wallet\". Host renders the add-wallet UI. */\n onAddWallet?: () => void;\n /** Called when the user clicks the portfolio icon on a wallet row. */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /** Called when the user clicks an agent wallet renew action. Host should connect the owner wallet and call `renewAgentWallet`. */\n onRenewAgentWallet?: (wallet: HyperliquidWallet) => void;\n /**\n * Called before the SDK's `logout()` runs. Host can do extra cleanup\n * (e.g. wagmi `disconnect()`).\n */\n onLogout?: () => void;\n /** Toast callback. Fires \"Address copied\" success on copy-address clicks. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** HFun score threshold for the VIP crown. Defaults to 10. */\n vipThreshold?: number;\n\n // ─── Profile & Settings modal (rendered internally) ────────────\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /** Fired after the SDK successfully deletes a wallet. */\n onWalletDeleted?: (walletId: number) => void;\n /** Fired after the SDK successfully renames a wallet. */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for add-wallet text, wallet icon surfaces, and the Profile & Settings modal. */\n principalColors?: PrincipalColorOverrides;\n /** CSS color used as the dropdown panel background. Defaults to `rgba(20,20,20,0.95)`. */\n backgroundColor?: string;\n /** Extra footer rows rendered between \"Profile & Settings\" and \"Logout\". */\n extraFooterItems?: ExtraFooterItem[];\n}\n\nexport interface ExtraFooterItem {\n /** Stable key for React reconciliation. */\n key: string;\n /** Leading icon (e.g. an icon from `./icons/lucide`). */\n icon: ReactNode;\n /** Row label. */\n label: string;\n /** Click handler. The dropdown is NOT auto-closed — call `onClose` yourself if desired. */\n onClick: () => void;\n /** Optional hover text color (matches the \"Logout\" red-on-hover pattern). */\n hoverColor?: string;\n}\n\nconst DEFAULT_BACKGROUND_COLOR = \"rgb(var(--surface-dropdown))\";\n\ninterface DropdownWallet {\n id: number;\n name?: string | null;\n ethereumAddress?: string;\n agentEthereumAddress?: HyperliquidWallet[\"agentEthereumAddress\"];\n isAgent?: boolean;\n isReadOnly?: boolean;\n agentExpiresAt?: HyperliquidWallet[\"agentExpiresAt\"];\n}\n\ninterface WalletListItem {\n wallet: DropdownWallet;\n label: string | null;\n}\n\ntype WalletListEntry =\n | { type: \"wallet\"; item: WalletListItem }\n | { type: \"group\"; path: string; items: WalletListItem[] };\n\nconst getWalletNameParts = (name?: string | null) =>\n (name ?? \"\")\n .split(\"/\")\n .map((part) => part.trim())\n .filter(Boolean);\n\nconst buildWalletListEntries = (\n wallets: DropdownWallet[] | undefined,\n): WalletListEntry[] => {\n const standalone: WalletListItem[] = [];\n const grouped = new Map<string, WalletListItem[]>();\n const walletParts = (wallets ?? []).map((wallet) => ({\n wallet,\n parts: getWalletNameParts(wallet.name),\n }));\n const prefixCounts = new Map<string, number>();\n\n walletParts.forEach(({ parts }) => {\n for (let index = 1; index < parts.length; index += 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n prefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n }\n });\n\n walletParts.forEach(({ wallet, parts }) => {\n const groupPath = (() => {\n for (let index = parts.length - 1; index > 0; index -= 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n if ((prefixCounts.get(prefix) ?? 0) > 1) {\n return prefix;\n }\n }\n return null;\n })();\n const groupDepth = groupPath ? groupPath.split(\"/\").length : 0;\n const item: WalletListItem = {\n wallet,\n label: parts.length > 0 ? parts.slice(groupDepth).join(\"/\") : null,\n };\n\n if (!groupPath) {\n standalone.push(item);\n return;\n }\n\n const groupItems = grouped.get(groupPath) ?? [];\n groupItems.push(item);\n grouped.set(groupPath, groupItems);\n });\n\n const entries: WalletListEntry[] = standalone.map((item) => ({\n type: \"wallet\",\n item,\n }));\n\n grouped.forEach((items, path) => {\n if (items.length === 1) {\n entries.push({\n type: \"wallet\",\n item: { ...items[0], label: `${path}/${items[0].label ?? \"\"}` },\n });\n return;\n }\n\n entries.push({\n type: \"group\",\n path,\n items: [...items].sort((a, b) =>\n (a.label ?? \"\").localeCompare(b.label ?? \"\"),\n ),\n });\n });\n\n return entries.sort((a, b) => {\n const aLabel = a.type === \"group\" ? a.path : (a.item.label ?? \"\");\n const bLabel = b.type === \"group\" ? b.path : (b.item.label ?? \"\");\n return aLabel.localeCompare(bLabel);\n });\n};\n\nconst formatCompactAddress = (addr: string | undefined) => {\n if (!addr) return \"\";\n return `${addr.slice(0, 4)}...${addr.slice(-2)}`;\n};\n\nconst rootStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"calc(100% + 4px)\",\n width: 240,\n borderRadius: 9,\n boxShadow: \"var(--shadow-dropdown)\",\n border: \"1px solid rgb(var(--line))\",\n zIndex: 50,\n transformOrigin: \"top right\",\n overflow: \"hidden\",\n};\n\n// Scoped scrollbar styling so the dropdown looks the same on every host site\n// (matches alpha-trade). Inline styles can't target ::-webkit-scrollbar, so\n// inject a scoped <style>; Firefox uses the standard props on the element.\nconst SCROLLBAR_CLASS = \"hpc-wallet-scroll\";\nconst scrollbarCss = `\n.${SCROLLBAR_CLASS}::-webkit-scrollbar { width: 6px; height: 6px; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-track { background: #0b0e11; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-thumb { background: #374151; border-radius: 3px; }\n.${SCROLLBAR_CLASS}::-webkit-scrollbar-thumb:hover { background: #4b5563; }\n`;\n\nconst sectionBorder = \"1px solid rgb(var(--line))\";\n\nconst sectionHeaderStyle: CSSProperties = {\n padding: \"8px 16px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"rgb(var(--content-muted))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n};\n\nconst footerBtnStyle: CSSProperties = {\n width: \"100%\",\n textAlign: \"left\",\n padding: \"10px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"rgb(var(--content-muted))\",\n transition: \"background 120ms, color 120ms\",\n};\n\nexport function WalletSelectorDropdown({\n isOpen,\n onClose,\n onAddWallet,\n onShowPortfolio,\n onRenewAgentWallet,\n onLogout,\n onNotify,\n vipThreshold = 10,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions,\n onWalletDeleted,\n onWalletRenamed,\n accentColor,\n principalColors,\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n extraFooterItems,\n}: WalletSelectorDropdownProps): ReactNode {\n const { user, wallets, selectedWalletId, selectWallet, logout, authMethod } =\n useHypurrConnectInternal();\n\n const [profileOpen, setProfileOpen] = useState(false);\n const openProfile = useCallback(() => {\n setProfileOpen(true);\n onClose();\n }, [onClose]);\n\n const walletListEntries = useMemo(\n () => buildWalletListEntries(Array.isArray(wallets) ? wallets : undefined),\n [wallets],\n );\n\n const handleCopyAddress = useCallback(\n (address: string | undefined) => {\n if (!address) return;\n navigator.clipboard.writeText(address);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n },\n [onNotify],\n );\n\n const handleLogout = useCallback(() => {\n onLogout?.();\n logout();\n onClose();\n }, [logout, onClose, onLogout]);\n\n const profilePic = user?.photoUrl;\n const displayName = user?.displayName ?? \"\";\n const hfunScore = user?.hfunScore ?? 0;\n const isVip = hfunScore > vipThreshold;\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const renderWalletRow = (item: WalletListItem, depth: number): ReactNode => {\n const { wallet, label } = item;\n const isSelected = wallet.id === selectedWalletId;\n const compactAddress = formatCompactAddress(wallet.ethereumAddress);\n const agentExpiryTitle = getAgentExpiryTitle({\n isAgent: !!wallet.isAgent,\n agentExpiresAt: wallet.agentExpiresAt,\n });\n return (\n <WalletRow\n key={wallet.id}\n depth={depth}\n isSelected={isSelected}\n label={label}\n compactAddress={compactAddress}\n onSelect={() => {\n selectWallet(wallet.id);\n onClose();\n }}\n onShowPortfolio={\n onShowPortfolio\n ? () => {\n onShowPortfolio(wallet as HyperliquidWallet);\n onClose();\n }\n : undefined\n }\n onCopy={() => handleCopyAddress(wallet.ethereumAddress)}\n agentExpiryTitle={agentExpiryTitle}\n onRenewAgentWallet={\n wallet.isAgent && onRenewAgentWallet\n ? () => {\n onRenewAgentWallet(wallet as HyperliquidWallet);\n onClose();\n }\n : undefined\n }\n colors={colors}\n />\n );\n };\n\n return (\n <div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n style={{ ...rootStyle, background: backgroundColor }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n <style>{scrollbarCss}</style>\n {/* Profile header */}\n <button\n onClick={openProfile}\n style={{\n width: \"100%\",\n padding: \"12px 16px\",\n borderBottom: sectionBorder,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n background: \"transparent\",\n border: \"none\",\n borderBottomColor: \"rgb(var(--btn-bevel) / 0.06)\",\n borderBottomStyle: \"solid\",\n borderBottomWidth: 1,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background =\n \"rgb(var(--btn-bevel) / 0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n {profilePic ? (\n <div\n style={{\n position: \"relative\",\n padding: isVip ? 2 : 0,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(to right, #fde047, #eab308, #ca8a04)\"\n : \"transparent\",\n }}\n >\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n display: \"block\",\n }}\n />\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n ) : authMethod === \"eoa\" ? (\n <div\n style={{\n height: 32,\n width: 32,\n borderRadius: 7,\n background: colors.accentBackground,\n border: `1px solid ${colors.accentBorder}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Wallet size={14} color={colors.accentText} />\n </div>\n ) : (\n <div\n style={{\n position: \"relative\",\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(135deg, #ca8a04, #fde047)\"\n : colors.accentBackground,\n border: `1px solid ${\n isVip ? \"rgba(255,255,255,0.08)\" : colors.accentBorder\n }`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: isVip ? profileColors.text : colors.accentText,\n fontSize: 14,\n fontWeight: 700,\n }}\n >\n {displayName.charAt(0)}\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n )}\n <div style={{ overflow: \"hidden\", flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <p\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 500,\n color: \"rgb(var(--content))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </p>\n {hfunScore > 0 && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 2,\n fontSize: 12,\n color: \"#eab308\",\n fontWeight: 500,\n background: \"rgba(234,179,8,0.1)\",\n padding: \"2px 6px\",\n borderRadius: 4,\n }}\n >\n <Star size={10} color=\"#eab308\" fill=\"#eab308\" />\n {hfunScore.toFixed(0)}\n </span>\n )}\n </div>\n </div>\n </button>\n\n {/* Wallets section */}\n <div style={{ borderBottom: sectionBorder }}>\n <div style={sectionHeaderStyle}>Wallets</div>\n <div\n className={SCROLLBAR_CLASS}\n style={{\n maxHeight: 256,\n overflowY: \"auto\",\n paddingBottom: 4,\n scrollbarWidth: \"thin\",\n scrollbarColor: \"#374151 #0b0e11\",\n }}\n >\n {walletListEntries.map((entry) => {\n if (entry.type === \"wallet\") {\n return renderWalletRow(entry.item, 0);\n }\n const isSelectedGroup = entry.items.some(\n (item) => item.wallet.id === selectedWalletId,\n );\n return (\n <Fragment key={entry.path}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px 4px\",\n fontSize: 11,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: isSelectedGroup\n ? \"rgb(var(--content-secondary))\"\n : \"rgb(var(--content-faint))\",\n }}\n >\n <Folder size={12} style={{ flexShrink: 0 }} />\n <span\n style={{\n minWidth: 0,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {entry.path}\n </span>\n <span\n style={{\n flexShrink: 0,\n fontVariantNumeric: \"tabular-nums\",\n color: \"rgb(var(--content-disabled))\",\n }}\n >\n {entry.items.length}\n </span>\n </div>\n {entry.items.map((item) => renderWalletRow(item, 1))}\n </Fragment>\n );\n })}\n </div>\n {authMethod !== \"eoa\" && onAddWallet && (\n <button\n onClick={() => {\n onAddWallet();\n onClose();\n }}\n style={{\n width: \"100%\",\n textAlign: \"left\",\n padding: \"8px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: colors.accentText,\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background =\n \"rgb(var(--btn-bevel) / 0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n <Plus size={14} />\n Add Wallet\n </button>\n )}\n </div>\n\n {/* Footer actions */}\n <div>\n <FooterBtn\n onClick={openProfile}\n icon={<User size={14} />}\n label=\"Profile & Settings\"\n />\n {extraFooterItems?.map((item) => (\n <FooterBtn\n key={item.key}\n onClick={item.onClick}\n icon={item.icon}\n label={item.label}\n hoverColor={item.hoverColor}\n />\n ))}\n <FooterBtn\n onClick={handleLogout}\n icon={<LogOut size={14} />}\n label=\"Logout\"\n hoverColor=\"#ef4444\"\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <UserProfileModal\n isOpen={profileOpen}\n onClose={() => setProfileOpen(false)}\n animationsEnabled={animationsEnabled}\n onToggleAnimations={onToggleAnimations}\n defaultSlippage={defaultSlippage}\n onSlippageChange={onSlippageChange}\n slippageOptions={slippageOptions}\n accentColor={accentColor}\n principalColors={principalColors}\n onWalletDeleted={onWalletDeleted}\n onWalletRenamed={onWalletRenamed}\n onRenewAgentWallet={onRenewAgentWallet}\n onShowPortfolio={\n onShowPortfolio\n ? (wallet) => {\n onShowPortfolio(wallet);\n setProfileOpen(false);\n }\n : undefined\n }\n onNotify={onNotify}\n />\n </div>\n );\n}\n\nfunction FooterBtn({\n onClick,\n icon,\n label,\n hoverColor = \"rgb(var(--content))\",\n}: {\n onClick: () => void;\n icon: ReactNode;\n label: string;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n style={footerBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgb(var(--btn-bevel) / 0.06)\";\n e.currentTarget.style.color = hoverColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgb(var(--content-muted))\";\n }}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nfunction WalletRow({\n depth,\n isSelected,\n label,\n compactAddress,\n onSelect,\n onShowPortfolio,\n onCopy,\n agentExpiryTitle,\n onRenewAgentWallet,\n colors,\n}: {\n depth: number;\n isSelected: boolean;\n label: string | null;\n compactAddress: string;\n onSelect: () => void;\n onShowPortfolio?: () => void;\n onCopy: () => void;\n agentExpiryTitle?: string | null;\n onRenewAgentWallet?: () => void;\n colors: PrincipalColors;\n}) {\n const isAgentExpired = !!agentExpiryTitle;\n const walletTextColor = isAgentExpired\n ? EXPIRED_AGENT_COLOR\n : \"rgb(var(--content-tertiary))\";\n const mutedTextColor = isAgentExpired\n ? \"rgba(245,158,11,0.78)\"\n : \"rgb(var(--content-faint))\";\n // Touch devices have no hover, so keep row actions visible on mobile.\n const isMobile = useIsMobile();\n return (\n <div\n style={{\n width: \"100%\",\n paddingLeft: 16 + depth * 14,\n paddingRight: 16,\n paddingTop: 6,\n paddingBottom: 6,\n fontSize: 14,\n color: walletTextColor,\n display: \"flex\",\n alignItems: \"center\",\n background: isSelected ? \"rgb(var(--btn-bevel) / 0.06)\" : \"transparent\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgb(var(--btn-bevel) / 0.06)\";\n if (isMobile) return;\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isSelected\n ? \"rgb(var(--btn-bevel) / 0.06)\"\n : \"transparent\";\n if (isMobile) return;\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"0\";\n }}\n >\n <button\n onClick={onSelect}\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n {label ? (\n <>\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n color: isAgentExpired\n ? walletTextColor\n : isSelected\n ? \"rgb(var(--content))\"\n : undefined,\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {label}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n flexShrink: 0,\n color: mutedTextColor,\n }}\n >\n ({compactAddress})\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 12,\n color: isAgentExpired\n ? walletTextColor\n : isSelected\n ? \"rgb(var(--content))\"\n : \"rgb(var(--content-muted))\",\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {compactAddress}\n </span>\n )}\n </button>\n {agentExpiryTitle && (\n <AgentExpiryWarningIcon\n message={agentExpiryTitle}\n onClick={onRenewAgentWallet}\n />\n )}\n <div\n data-row-actions\n style={{\n display: \"flex\",\n alignItems: \"center\",\n opacity: isMobile ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n {onRenewAgentWallet && (\n <RowIconBtn\n title=\"Renew agent wallet\"\n hoverColor={isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onRenewAgentWallet();\n }}\n >\n <RefreshCw size={12} />\n </RowIconBtn>\n )}\n {onShowPortfolio && (\n <RowIconBtn\n title=\"View portfolio\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onShowPortfolio();\n }}\n >\n <LayoutDashboard size={12} />\n </RowIconBtn>\n )}\n <RowIconBtn\n title=\"Copy address\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onCopy();\n }}\n >\n <Copy size={12} />\n </RowIconBtn>\n </div>\n </div>\n );\n}\n\nfunction RowIconBtn({\n children,\n title,\n onClick,\n hoverColor = profileColors.text,\n}: {\n children: ReactNode;\n title: string;\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n title={title}\n style={{\n padding: 4,\n marginLeft: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"rgb(var(--content-disabled))\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = hoverColor)}\n onMouseLeave={(e) =>\n (e.currentTarget.style.color = \"rgb(var(--content-disabled))\")\n }\n >\n {children}\n </button>\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type RefCallback,\n} from \"react\";\nimport { AlertTriangle } from \"./icons/lucide\";\n\nconst EXPIRED_AGENT_COLOR = \"#f59e0b\";\n\ninterface TooltipPosition {\n left: number;\n top: number;\n}\n\nexport function AgentExpiryWarningIcon({\n message,\n onClick,\n size = 13,\n}: {\n message: string;\n onClick?: () => void;\n size?: number;\n}) {\n const triggerRef = useRef<HTMLElement | null>(null);\n const [tooltipPosition, setTooltipPosition] =\n useState<TooltipPosition | null>(null);\n\n const setTriggerRef: RefCallback<HTMLElement> = useCallback((node) => {\n triggerRef.current = node;\n }, []);\n\n const showTooltip = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n const tooltipWidth = 260;\n const left = Math.min(\n Math.max(rect.left + rect.width / 2, tooltipWidth / 2 + 8),\n window.innerWidth - tooltipWidth / 2 - 8,\n );\n const top =\n rect.bottom + 8 < window.innerHeight - 48\n ? rect.bottom + 8\n : Math.max(8, rect.top - 44);\n\n setTooltipPosition({ left, top });\n }, []);\n\n const hideTooltip = useCallback(() => {\n setTooltipPosition(null);\n }, []);\n\n const triggerStyle: CSSProperties = {\n width: size + 5,\n height: size + 5,\n padding: 0,\n border: \"none\",\n borderRadius: 4,\n background: \"transparent\",\n color: EXPIRED_AGENT_COLOR,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n cursor: onClick ? \"pointer\" : \"help\",\n };\n\n const sharedProps = {\n ref: setTriggerRef,\n \"aria-label\": \"Agent approval expired\",\n onMouseEnter: showTooltip,\n onMouseLeave: hideTooltip,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n style: triggerStyle,\n };\n\n return (\n <>\n {onClick ? (\n <button\n type=\"button\"\n {...sharedProps}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n >\n <AlertTriangle size={size} color={EXPIRED_AGENT_COLOR} />\n </button>\n ) : (\n <span {...sharedProps}>\n <AlertTriangle size={size} color={EXPIRED_AGENT_COLOR} />\n </span>\n )}\n {tooltipPosition && (\n <div\n role=\"tooltip\"\n style={{\n position: \"fixed\",\n left: tooltipPosition.left,\n top: tooltipPosition.top,\n transform: \"translateX(-50%)\",\n zIndex: 10_000,\n width: 260,\n maxWidth: \"calc(100vw - 16px)\",\n padding: \"7px 9px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"#111827\",\n boxShadow: \"0 10px 28px rgba(0,0,0,0.45)\",\n color: \"#e5e7eb\",\n fontSize: 12,\n lineHeight: \"1rem\",\n fontWeight: 500,\n pointerEvents: \"none\",\n whiteSpace: \"normal\",\n }}\n >\n {message}\n </div>\n )}\n </>\n );\n}\n\nexport { EXPIRED_AGENT_COLOR };\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AgentExpiryWarningIcon,\n EXPIRED_AGENT_COLOR,\n} from \"./AgentExpiryWarning\";\nimport { DeleteWalletModal } from \"./DeleteWalletModal\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { RenameWalletModal } from \"./RenameWalletModal\";\nimport {\n clearAgent as clearStoredAgent,\n loadAllAgents,\n type LocalApprovedAgent,\n} from \"./agent\";\nimport { formatAgentExpiry, getAgentExpiryTitle } from \"./agentWallet\";\nimport {\n Bot,\n Copy,\n Eye,\n KeyRound,\n LayoutDashboard,\n Pencil,\n RefreshCw,\n SpinKeyframes,\n Star,\n Trash2,\n TrendingUp,\n User,\n Wallet,\n X,\n Zap,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n colorWithAlpha,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n pickContrastColor,\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n resolvePrincipalColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\ntype SettingsTab = \"ui\" | \"trading\" | \"wallets\";\n\nexport interface SlippageOption {\n label: string;\n value: number;\n}\n\nconst DEFAULT_SLIPPAGE_OPTIONS: SlippageOption[] = [\n { label: \"0.5%\", value: 0.005 },\n { label: \"1%\", value: 0.01 },\n { label: \"2%\", value: 0.02 },\n { label: \"5%\", value: 0.05 },\n { label: \"10%\", value: 0.1 },\n];\n\nexport interface UserProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /**\n * Fired after the SDK successfully deletes a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletDeleted?: (walletId: number) => void;\n /**\n * Fired after the SDK successfully renames a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /**\n * If provided, each wallet row in the Wallets tab gets a \"View portfolio\"\n * button that fires this callback. The host is expected to open its own\n * portfolio UI in response.\n */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /** Called when the user clicks an agent wallet renew action. Host should connect the owner wallet and call `renewAgentWallet`. */\n onRenewAgentWallet?: (wallet: HyperliquidWallet) => void;\n /** Optional toast callback. SDK fires success on rename/delete; errors stay inline in sub-modals. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for switches, action text, and wallet icon surfaces. */\n principalColors?: PrincipalColorOverrides;\n}\n\nconst backdropStyle = modalBackdropStyle(100);\nconst wrapperStyle = modalWrapperStyle(101);\nconst panelStyle = modalPanelStyle(true);\nconst headerStyle = modalHeaderStyle;\n\nconst profileSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nconst settingsSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n};\n\nconst tabRowStyle: CSSProperties = {\n display: \"flex\",\n gap: 6,\n marginBottom: 20,\n};\n\nconst tabButtonLayoutStyle: CSSProperties = {\n flex: 1,\n padding: \"6px 0\",\n borderRadius: 4,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n cursor: \"pointer\",\n transition: \"background-color 150ms, color 150ms, box-shadow 150ms\",\n};\n\nconst statBoxStyle: CSSProperties = {\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n borderRadius: 8,\n padding: 12,\n border: `1px solid ${profileColors.border}`,\n};\n\nconst slippageBtnBaseClass =\n \"flex-1 rounded border px-2 py-1 font-mono font-medium text-base transition-colors\";\nconst slippageBtnSelectedClass =\n \"bg-surface-btn-active text-content border-surface-bd-active\";\nconst slippageBtnIdleClass =\n \"bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary\";\n\nconst walletRowStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n borderRadius: 8,\n background: profileColors.surfaceBtn,\n border: `1px solid ${profileColors.surfaceBd}`,\n transition: \"background-color 150ms, border-color 150ms\",\n};\n\ntype WalletTypeMeta = {\n label: string;\n color: string;\n background: string;\n border: string;\n icon: ReactNode;\n};\n\nfunction getWalletTypeMeta(wallet: HyperliquidWallet): WalletTypeMeta {\n if (wallet.isAgent) {\n return {\n label: \"Agent wallet\",\n color: \"rgb(var(--blue-500))\",\n background: \"rgb(var(--blue-500) / 0.16)\",\n border: \"rgb(var(--blue-500) / 0.34)\",\n icon: <Bot size={10} />,\n };\n }\n\n if (wallet.isReadOnly) {\n return {\n label: \"Read-only wallet\",\n color: \"rgb(var(--purple-400))\",\n background: \"rgb(var(--purple-400) / 0.16)\",\n border: \"rgb(var(--purple-400) / 0.34)\",\n icon: <Eye size={10} />,\n };\n }\n\n return {\n label: \"Private-key wallet\",\n color: \"rgb(var(--green-400))\",\n background: \"rgb(var(--green-400) / 0.16)\",\n border: \"rgb(var(--green-400) / 0.34)\",\n icon: <KeyRound size={10} />,\n };\n}\n\nfunction ToggleSwitch({\n checked,\n onChange,\n accentColor,\n}: {\n checked: boolean;\n onChange: () => void;\n accentColor: string;\n}) {\n return (\n <button\n onClick={onChange}\n role=\"switch\"\n aria-checked={checked}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n height: 20,\n width: 36,\n alignItems: \"center\",\n borderRadius: 9999,\n border: \"none\",\n background: checked\n ? colorWithAlpha(accentColor, 0.85)\n : \"rgb(var(--btn-bevel) / 0.08)\",\n cursor: \"pointer\",\n padding: 0,\n transition: \"background 150ms\",\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n height: 12,\n width: 12,\n borderRadius: \"50%\",\n background: checked\n ? pickContrastColor(accentColor)\n : profileColors.text,\n transform: checked ? \"translateX(20px)\" : \"translateX(4px)\",\n transition: \"transform 150ms, background 150ms\",\n }}\n />\n </button>\n );\n}\n\nfunction RaisedButton({\n selected = false,\n onClick,\n children,\n style,\n}: {\n selected?: boolean;\n onClick: () => void;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={selected ? \"btn-raised-active\" : \"btn-raised\"}\n style={{ ...tabButtonLayoutStyle, ...style }}\n >\n {children}\n </button>\n );\n}\n\nfunction SlippageButton({\n selected,\n onClick,\n children,\n}: {\n selected: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`${slippageBtnBaseClass} ${\n selected ? slippageBtnSelectedClass : slippageBtnIdleClass\n }`}\n >\n {children}\n </button>\n );\n}\n\nexport function UserProfileModal({\n isOpen,\n onClose,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions = DEFAULT_SLIPPAGE_OPTIONS,\n onWalletDeleted,\n onWalletRenamed,\n onShowPortfolio,\n onRenewAgentWallet,\n onNotify,\n accentColor,\n principalColors,\n}: UserProfileModalProps): ReactNode {\n const {\n user,\n wallets: userWallets,\n deleteWallet,\n renameWallet,\n authMethod,\n agent,\n eoaAddress,\n clearAgent: clearContextAgent,\n } = useHypurrConnectInternal();\n\n const [settingsTab, setSettingsTab] = useState<SettingsTab>(\"ui\");\n const [walletToDelete, setWalletToDelete] =\n useState<HyperliquidWallet | null>(null);\n const [walletToRename, setWalletToRename] =\n useState<HyperliquidWallet | null>(null);\n const [storedAgents, setStoredAgents] = useState<LocalApprovedAgent[]>([]);\n\n // Local approved agents live in localStorage; refresh whenever the modal opens.\n useEffect(() => {\n if (isOpen) setStoredAgents(loadAllAgents());\n }, [isOpen]);\n\n // Merge the localStorage scan with the reactive context agent (the currently\n // connected EOA's approved agent), deduped by owner address.\n const localAgents = useMemo(() => {\n const byOwner = new Map<string, LocalApprovedAgent>();\n for (const a of storedAgents) byOwner.set(a.masterAddress.toLowerCase(), a);\n if (agent && eoaAddress && !byOwner.has(eoaAddress.toLowerCase())) {\n byOwner.set(eoaAddress.toLowerCase(), {\n ...agent,\n masterAddress: eoaAddress,\n });\n }\n return [...byOwner.values()].sort((a, b) => b.approvedAt - a.approvedAt);\n }, [storedAgents, agent, eoaAddress]);\n\n const handleRemoveLocalAgent = useCallback(\n (masterAddress: string) => {\n if (\n eoaAddress &&\n masterAddress.toLowerCase() === eoaAddress.toLowerCase()\n ) {\n clearContextAgent();\n } else {\n clearStoredAgent(masterAddress);\n }\n setStoredAgents(loadAllAgents());\n },\n [eoaAddress, clearContextAgent],\n );\n\n const profilePic = user?.photoUrl || \"\";\n const displayName = user?.displayName || \"\";\n const hfunScore = user?.hfunScore ?? null;\n const reputationScore = user?.reputationScore ?? null;\n const telegramId = user?.telegramId;\n const wallets = userWallets ?? [];\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const handleDeleteWallet = useCallback(\n async (walletId: number) => {\n await deleteWallet(walletId);\n onWalletDeleted?.(walletId);\n },\n [deleteWallet, onWalletDeleted],\n );\n\n const handleRenameWallet = useCallback(\n async (walletId: number, name: string) => {\n await renameWallet(walletId, name);\n onWalletRenamed?.(walletId, name);\n },\n [renameWallet, onWalletRenamed],\n );\n\n const handleCopyAddress = useCallback(() => {\n // Copy the full address, not the truncated display name.\n const address = user?.address || eoaAddress || displayName;\n if (!address) return;\n navigator.clipboard.writeText(address);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n }, [user?.address, eoaAddress, displayName, onNotify]);\n\n return (\n <div className=\"hypurr-connect\" style={{ display: \"contents\" }}>\n <AnimatePresence>\n {isOpen && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n <div style={wrapperStyle} onClick={onClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div style={headerStyle}>\n <h3 style={titleStyle}>Profile & Settings</h3>\n <button\n onClick={onClose}\n style={makeCloseBtnStyle()}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n {/* Profile Section */}\n <div style={profileSectionStyle}>\n {authMethod === \"eoa\" && !profilePic ? (\n <div\n style={{\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n }}\n >\n <p\n style={{\n margin: \"0 0 6px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayName}\n </p>\n <button\n onClick={handleCopyAddress}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: \"pointer\",\n flexShrink: 0,\n display: \"flex\",\n }}\n aria-label=\"Copy address\"\n >\n <Copy size={13} />\n </button>\n </div>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n }}\n >\n {profilePic ? (\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n }}\n />\n ) : (\n <div\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n background: profileColors.surfaceBd,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n }}\n >\n {displayName?.charAt(0)}\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </h4>\n {telegramId && (\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n ID: {telegramId}\n </p>\n )}\n </div>\n </div>\n )}\n\n {user && (\n <div\n style={{\n marginTop: 16,\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 10,\n }}\n >\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"rgb(var(--amber-400))\",\n marginBottom: 6,\n }}\n >\n <Star\n size={13}\n color=\"rgb(var(--amber-400))\"\n fill=\"rgb(var(--amber-400))\"\n />\n <span style={upperLabelStyle}>Hfun Score</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {hfunScore !== null ? hfunScore.toFixed(0) : \"--\"}\n </p>\n </div>\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: profileColors.muted,\n marginBottom: 6,\n }}\n >\n <User size={13} />\n <span style={upperLabelStyle}>Reputation</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {reputationScore !== null\n ? reputationScore.toFixed(0)\n : \"--\"}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Settings Section */}\n <div style={settingsSectionStyle}>\n <div style={tabRowStyle}>\n <RaisedButton\n selected={settingsTab === \"ui\"}\n onClick={() => setSettingsTab(\"ui\")}\n >\n <Zap size={13} /> UI\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"trading\"}\n onClick={() => setSettingsTab(\"trading\")}\n >\n <TrendingUp size={13} /> Trading\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"wallets\"}\n onClick={() => setSettingsTab(\"wallets\")}\n >\n <Wallet size={13} /> Wallets\n </RaisedButton>\n </div>\n\n {settingsTab === \"ui\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 0\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <Zap size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Animations\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Enable chart and UI animations\n </p>\n </div>\n </div>\n <ToggleSwitch\n checked={animationsEnabled}\n onChange={onToggleAnimations}\n accentColor={colors.accent}\n />\n </div>\n </div>\n )}\n\n {settingsTab === \"trading\" && (\n <div style={{ padding: \"8px 0\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n marginBottom: 12,\n }}\n >\n <TrendingUp size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Default Slippage\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Max price deviation for market orders\n </p>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: 6 }}>\n {slippageOptions.map((option) => (\n <SlippageButton\n key={option.value}\n onClick={() => onSlippageChange(option.value)}\n selected={defaultSlippage === option.value}\n >\n {option.label}\n </SlippageButton>\n ))}\n </div>\n </div>\n )}\n\n {settingsTab === \"wallets\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n {wallets.length === 0 ? (\n <div\n style={{\n textAlign: \"center\",\n padding: \"32px 0\",\n }}\n >\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n background: \"rgb(var(--btn-bevel) / 0.04)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"0 auto 12px\",\n }}\n >\n <Wallet size={18} color={profileColors.muted} />\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n No wallets yet\n </p>\n </div>\n ) : (\n <div\n style={{\n maxHeight: 208,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {wallets.map((wallet) => (\n <WalletRow\n key={wallet.id}\n wallet={wallet}\n colors={colors}\n onRename={() => setWalletToRename(wallet)}\n onDelete={() => setWalletToDelete(wallet)}\n onRenewAgentWallet={\n wallet.isAgent && onRenewAgentWallet\n ? () => onRenewAgentWallet(wallet)\n : undefined\n }\n onShowPortfolio={\n onShowPortfolio\n ? () => onShowPortfolio(wallet)\n : undefined\n }\n />\n ))}\n </div>\n )}\n <p\n style={{\n margin: \"4px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n textAlign: \"center\",\n }}\n >\n {wallets.length} wallet\n {wallets.length !== 1 ? \"s\" : \"\"} linked\n </p>\n\n {localAgents.length > 0 && (\n <div style={{ marginTop: 8 }}>\n <p\n style={{\n margin: \"0 0 8px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Agent wallets\n </p>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {localAgents.map((agent) => (\n <LocalAgentRow\n key={agent.masterAddress}\n agent={agent}\n onRemove={() =>\n handleRemoveLocalAgent(agent.masterAddress)\n }\n />\n ))}\n </div>\n <p\n style={{\n margin: \"8px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n textAlign: \"center\",\n }}\n >\n Approved on this device\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={{ padding: \"0 24px 24px\" }}>\n <button\n onClick={onClose}\n className=\"btn-raised\"\n style={{\n width: \"100%\",\n padding: \"6px 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n borderRadius: 8,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n\n <DeleteWalletModal\n isOpen={!!walletToDelete}\n onClose={() => setWalletToDelete(null)}\n wallet={walletToDelete}\n onConfirm={handleDeleteWallet}\n onNotify={onNotify}\n />\n <RenameWalletModal\n isOpen={!!walletToRename}\n onClose={() => setWalletToRename(null)}\n wallet={walletToRename}\n onConfirm={handleRenameWallet}\n onNotify={onNotify}\n accentColor={colors.accent}\n />\n </div>\n );\n}\n\nfunction WalletRow({\n wallet,\n colors,\n onRename,\n onDelete,\n onRenewAgentWallet,\n onShowPortfolio,\n}: {\n wallet: HyperliquidWallet;\n colors: PrincipalColors;\n onRename: () => void;\n onDelete: () => void;\n onRenewAgentWallet?: () => void;\n onShowPortfolio?: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const agentExpiryTitle = getAgentExpiryTitle(wallet);\n const isAgentExpired = !!agentExpiryTitle;\n const typeMeta = getWalletTypeMeta(wallet);\n return (\n <div\n style={{\n ...walletRowStyle,\n background: isAgentExpired\n ? hovered\n ? \"rgba(245,158,11,0.12)\"\n : \"rgba(245,158,11,0.07)\"\n : hovered\n ? profileColors.surfaceBtnHover\n : profileColors.surfaceBtn,\n borderColor: isAgentExpired\n ? \"rgba(245,158,11,0.34)\"\n : hovered\n ? profileColors.surfaceBdHover\n : profileColors.surfaceBd,\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <div\n style={{\n position: \"relative\",\n width: 32,\n height: 32,\n borderRadius: 6,\n background: isAgentExpired\n ? \"rgba(245,158,11,0.12)\"\n : colors.accentBackground,\n border: `1px solid ${\n isAgentExpired ? \"rgba(245,158,11,0.34)\" : colors.accentBorder\n }`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 600,\n color: isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accentText,\n }}\n >\n {(wallet.name || \"W\")[0].toUpperCase()}\n </span>\n <span\n role=\"img\"\n aria-label={typeMeta.label}\n title={typeMeta.label}\n style={{\n position: \"absolute\",\n right: -5,\n bottom: -5,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: typeMeta.color,\n background: typeMeta.background,\n border: `1px solid ${typeMeta.border}`,\n boxShadow: \"0 1px 4px rgb(var(--btn-bevel) / 0.18)\",\n }}\n >\n {typeMeta.icon}\n </span>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n minWidth: 0,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: isAgentExpired ? EXPIRED_AGENT_COLOR : profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {wallet.name || \"Unnamed\"}\n </p>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: isAgentExpired\n ? \"rgba(245,158,11,0.76)\"\n : profileColors.muted,\n fontFamily: fontFamily.mono,\n }}\n >\n {wallet.ethereumAddress?.slice(0, 6)}...\n {wallet.ethereumAddress?.slice(-4)}\n </p>\n </div>\n {agentExpiryTitle && (\n <AgentExpiryWarningIcon\n message={agentExpiryTitle}\n onClick={onRenewAgentWallet}\n />\n )}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n opacity: hovered ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n {wallet.isAgent && onRenewAgentWallet && (\n <IconBtn\n color={isAgentExpired ? EXPIRED_AGENT_COLOR : colors.accent}\n hoverBackgroundColor={\n isAgentExpired\n ? \"rgba(245,158,11,0.12)\"\n : colors.accentHoverBackground\n }\n title=\"Renew agent wallet\"\n ariaLabel={`Renew agent wallet for ${wallet.name || \"wallet\"}`}\n onClick={onRenewAgentWallet}\n >\n <RefreshCw size={13} />\n </IconBtn>\n )}\n {onShowPortfolio && (\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"View portfolio\"\n ariaLabel={`View portfolio for ${wallet.name || \"wallet\"}`}\n onClick={onShowPortfolio}\n >\n <LayoutDashboard size={13} />\n </IconBtn>\n )}\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"Rename wallet\"\n ariaLabel={`Rename ${wallet.name || \"wallet\"}`}\n onClick={onRename}\n >\n <Pencil size={13} />\n </IconBtn>\n <IconBtn\n color=\"#ef4444\"\n hoverBackgroundColor=\"rgba(239,68,68,0.1)\"\n title=\"Delete wallet\"\n ariaLabel={`Delete ${wallet.name || \"wallet\"}`}\n onClick={onDelete}\n >\n <Trash2 size={13} />\n </IconBtn>\n </div>\n </div>\n );\n}\n\nfunction shortAddress(address: string): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n// Older builds stored validUntil scaled ×1000 (µs). Coerce those back to ms.\nfunction normalizeExpiryMs(validUntil: number): number {\n return validUntil > 1e14 ? Math.round(validUntil / 1000) : validUntil;\n}\n\nfunction LocalAgentRow({\n agent,\n onRemove,\n}: {\n agent: LocalApprovedAgent;\n onRemove: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const expiresAtMs = normalizeExpiryMs(agent.validUntil);\n const isExpired = expiresAtMs <= Date.now();\n const agentTypeColor = \"rgb(var(--blue-500))\";\n return (\n <div\n style={{\n ...walletRowStyle,\n background: hovered\n ? profileColors.surfaceBtnHover\n : profileColors.surfaceBtn,\n borderColor: hovered\n ? profileColors.surfaceBdHover\n : profileColors.surfaceBd,\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <div\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n background: \"rgb(var(--blue-500) / 0.16)\",\n border: \"1px solid rgb(var(--blue-500) / 0.34)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n color: agentTypeColor,\n }}\n >\n <Bot size={15} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {shortAddress(agent.address)}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: isExpired ? EXPIRED_AGENT_COLOR : profileColors.muted,\n }}\n >\n {isExpired ? \"Expired\" : \"Valid until\"}{\" \"}\n {formatAgentExpiry(expiresAtMs)}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n fontFamily: fontFamily.mono,\n }}\n >\n Owner {shortAddress(agent.masterAddress)}\n </p>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexShrink: 0,\n opacity: hovered ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n <IconBtn\n color=\"#ef4444\"\n hoverBackgroundColor=\"rgba(239,68,68,0.1)\"\n title=\"Remove local agent\"\n ariaLabel={`Remove local agent for ${shortAddress(agent.masterAddress)}`}\n onClick={onRemove}\n >\n <Trash2 size={13} />\n </IconBtn>\n </div>\n </div>\n );\n}\n\nfunction IconBtn({\n children,\n color,\n hoverBackgroundColor,\n title,\n ariaLabel,\n onClick,\n}: {\n children: ReactNode;\n color: string;\n hoverBackgroundColor?: string;\n title: string;\n ariaLabel: string;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n title={title}\n aria-label={ariaLabel}\n style={{\n padding: 6,\n borderRadius: 4,\n background: hovered\n ? (hoverBackgroundColor ?? \"transparent\")\n : \"transparent\",\n border: \"none\",\n color: hovered ? color : profileColors.muted,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms, background 120ms\",\n }}\n >\n {children}\n </button>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n SpinKeyframes,\n Trash2,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n dangerOutlineButtonStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface DeleteWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number) => Promise<void>;\n /** Optional toast callback. Fires `{type:\"success\"}` on delete; errors are shown inline. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n}\n\nconst DANGER_BG = \"rgba(248,113,113,0.07)\";\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgb(var(--line))\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst warningBoxStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 14,\n background: DANGER_BG,\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: \"1px solid rgb(var(--line))\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (disabled: boolean): CSSProperties => ({\n width: \"100%\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst deleteButtonStyle = (\n enabled: boolean,\n hovered: boolean,\n): CSSProperties => ({\n ...dangerOutlineButtonStyle(enabled, hovered),\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n transition: \"background-color 150ms, color 150ms, border-color 150ms\",\n});\n\nexport function DeleteWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: DeleteWalletModalProps): ReactNode {\n const [confirmName, setConfirmName] = useState(\"\");\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [deleteHovered, setDeleteHovered] = useState(false);\n\n const walletName = wallet?.name || \"Unnamed Wallet\";\n const displayAddress = wallet?.ethereumAddress;\n const isNameMatch = confirmName === walletName;\n const canDelete = isNameMatch && !isDeleting;\n\n const handleClose = useCallback(() => {\n if (isDeleting) return;\n setConfirmName(\"\");\n setError(null);\n onClose();\n }, [isDeleting, onClose]);\n\n const handleDelete = useCallback(async () => {\n if (!wallet || !isNameMatch) return;\n setError(null);\n setIsDeleting(true);\n try {\n await onConfirm(wallet.id);\n setConfirmName(\"\");\n onNotify?.({ type: \"success\", message: \"Wallet deleted successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to delete wallet\");\n } finally {\n setIsDeleting(false);\n }\n }, [wallet, isNameMatch, onConfirm, onClose, onNotify]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle} onClick={handleClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Delete Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isDeleting}\n style={makeCloseBtnStyle(isDeleting)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={warningBoxStyle}>\n <AlertTriangle\n size={15}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n fontWeight: 500,\n }}\n >\n This action cannot be undone\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: \"rgba(248,113,113,0.7)\",\n }}\n >\n The private key will be permanently deleted. Any remaining\n funds will be inaccessible.\n </p>\n </div>\n </div>\n\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet to delete\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {walletName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>\n Type{\" \"}\n <span\n style={{\n color: profileColors.text,\n fontWeight: 500,\n }}\n >\n &quot;{walletName}&quot;\n </span>{\" \"}\n to confirm\n </label>\n <input\n type=\"text\"\n value={confirmName}\n onChange={(e) => setConfirmName(e.target.value)}\n placeholder={walletName}\n disabled={isDeleting}\n className=\"input text-content placeholder-content-faint\"\n style={inputStyle(isDeleting)}\n />\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleDelete}\n disabled={!canDelete}\n onMouseEnter={() => setDeleteHovered(true)}\n onMouseLeave={() => setDeleteHovered(false)}\n style={deleteButtonStyle(canDelete, deleteHovered)}\n >\n {isDeleting ? (\n <>\n <Loader2 size={14} /> Deleting...\n </>\n ) : (\n <>\n <Trash2 size={14} /> Delete Wallet\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { CSSProperties } from \"react\";\n\n/**\n * Theme tokens consumed by inline `style={{}}` props. Values resolve to\n * `rgb(var(--token) / alpha)` strings so the active theme (set by the host\n * via `:root` / `.light` in `src/tailwind.css`) flows through on every paint\n * without any JS-side reactivity.\n */\nexport const profileColors = {\n // Accent stays a literal hex — host may override via the accentColor prop\n // and helpers below expect a parseable color.\n accent: \"#a855f7\",\n\n panel: \"rgb(var(--surface-modal) / 0.8)\",\n panelSolid: \"rgb(var(--surface-modal))\",\n backdrop: \"rgb(var(--overlay) / 0.7)\",\n border: \"rgb(var(--line))\",\n\n surfaceBtn: \"rgb(var(--surface-btn))\",\n surfaceBtnHover: \"rgb(var(--surface-btn-hover))\",\n surfaceBtnActive: \"rgb(var(--surface-btn-active))\",\n surfaceBd: \"rgb(var(--surface-bd))\",\n surfaceBdHover: \"rgb(var(--surface-bd-hover))\",\n surfaceBdActive: \"rgb(var(--surface-bd-active))\",\n\n text: \"rgb(var(--content))\",\n muted: \"rgb(var(--content-muted))\",\n subdued: \"rgb(var(--content-subtle))\",\n disabled: \"rgb(var(--content-disabled))\",\n\n danger: \"rgb(var(--trade-down))\",\n // Keep the punchier red literal for hover backgrounds where we want a\n // specific warm tint regardless of theme.\n dangerStrong: \"#ef4444\",\n purple: \"rgb(var(--purple-400))\",\n yellow: \"rgb(var(--amber-400))\",\n};\n\nexport const fontFamily = {\n sans: \"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif\",\n mono: \"Google Sans Code, Roboto Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n};\n\nexport interface PrincipalColors {\n accent: string;\n accentText: string;\n accentBackground: string;\n accentBorder: string;\n accentHoverBackground: string;\n}\n\nexport type PrincipalColorOverrides = Partial<PrincipalColors>;\n\nconst parseSrgb = (color: string): [number, number, number] | null => {\n const value = color.trim();\n const shortHex = /^#([0-9a-f]{3})$/i.exec(value);\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((c) => parseInt(c + c, 16)) as [\n number,\n number,\n number,\n ];\n return [r, g, b];\n }\n const longHex = /^#([0-9a-f]{6})$/i.exec(value);\n if (longHex) {\n const v = longHex[1];\n return [\n parseInt(v.slice(0, 2), 16),\n parseInt(v.slice(2, 4), 16),\n parseInt(v.slice(4, 6), 16),\n ];\n }\n const rgb =\n /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i.exec(\n value,\n );\n if (rgb) {\n return [parseInt(rgb[1], 10), parseInt(rgb[2], 10), parseInt(rgb[3], 10)];\n }\n return null;\n};\n\n/**\n * WCAG-style relative luminance in [0, 1]. Returns `null` for color formats\n * the parser doesn't understand (named colors, hsl, color-mix, …).\n */\nexport const relativeLuminance = (color: string): number | null => {\n const rgb = parseSrgb(color);\n if (!rgb) return null;\n const [r, g, b] = rgb.map((c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n }) as [number, number, number];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/**\n * Picks a readable foreground for `background`. Falls back to `lightFg` when\n * the background can't be parsed.\n */\nexport const pickContrastColor = (\n background: string,\n lightFg: string = \"#ffffff\",\n darkFg: string = \"#0a0a0a\",\n): string => {\n const lum = relativeLuminance(background);\n if (lum === null) return lightFg;\n return lum > 0.5 ? darkFg : lightFg;\n};\n\nexport const colorWithAlpha = (color: string, alpha: number): string => {\n const hex = color.trim();\n const shortHex = /^#([0-9a-f]{3})$/i.exec(hex);\n const longHex = /^#([0-9a-f]{6})$/i.exec(hex);\n\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((value) => value + value);\n return `rgba(${parseInt(r, 16)},${parseInt(g, 16)},${parseInt(b, 16)},${alpha})`;\n }\n\n if (longHex) {\n const value = longHex[1];\n return `rgba(${parseInt(value.slice(0, 2), 16)},${parseInt(\n value.slice(2, 4),\n 16,\n )},${parseInt(value.slice(4, 6), 16)},${alpha})`;\n }\n\n return `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`;\n};\n\nexport const resolvePrincipalColors = (\n accentColor?: string,\n overrides: PrincipalColorOverrides = {},\n): PrincipalColors => {\n const hasCustomAccent = !!accentColor || !!overrides.accent;\n const accent = overrides.accent ?? accentColor ?? profileColors.accent;\n const accentText =\n overrides.accentText ?? (hasCustomAccent ? accent : profileColors.purple);\n\n return {\n accent,\n accentText,\n accentBackground: overrides.accentBackground ?? colorWithAlpha(accent, 0.1),\n accentBorder: overrides.accentBorder ?? colorWithAlpha(accent, 0.25),\n accentHoverBackground:\n overrides.accentHoverBackground ?? colorWithAlpha(accent, 0.1),\n };\n};\n\nexport const modalBackdropStyle = (zIndex: number): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n background: profileColors.backdrop,\n backdropFilter: \"blur(4px)\",\n WebkitBackdropFilter: \"blur(4px)\",\n});\n\nexport const modalWrapperStyle = (\n zIndex: number,\n padding = 0,\n): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding,\n});\n\nexport const modalPanelStyle = (solid = false): CSSProperties => ({\n position: \"relative\",\n width: \"100%\",\n maxWidth: 448,\n background: solid ? profileColors.panelSolid : profileColors.panel,\n backdropFilter: solid ? undefined : \"blur(10px)\",\n WebkitBackdropFilter: solid ? undefined : \"blur(10px)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n boxShadow: \"var(--shadow-modal)\",\n overflow: \"hidden\",\n fontFamily: fontFamily.sans,\n});\n\nexport const modalHeaderStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"24px 24px 20px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nexport const titleStyle: CSSProperties = {\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n};\n\nexport const closeBtnStyle = (disabled = false): CSSProperties => ({\n position: \"absolute\",\n right: 24,\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n padding: 0,\n display: \"flex\",\n opacity: disabled ? 0.4 : 1,\n transition: \"color 150ms\",\n});\n\nexport const upperLabelStyle: CSSProperties = {\n fontSize: 11,\n lineHeight: \"1rem\",\n fontWeight: 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.1em\",\n};\n\n/**\n * Raised button surface, computed inline. Uses `--btn-bevel` for the top\n * sheen so dark theme keeps the white-bevel look while light theme picks up\n * a dark bevel (host sets `--btn-bevel: 15 23 42` under `.light`).\n */\nexport const raisedButtonStyle = (\n state: \"default\" | \"hover\" | \"active\" | \"disabled\" = \"default\",\n): CSSProperties => {\n if (state === \"active\") {\n return {\n backgroundColor: profileColors.surfaceBtnActive,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.05), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.18), inset 0 -1px 0 rgba(0,0,0,0.45), inset 0 0 0 1px rgb(var(--surface-bd-active)), 0 1px 2px rgba(0,0,0,0.5)\",\n color: profileColors.text,\n border: \"none\",\n };\n }\n\n if (state === \"disabled\") {\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.02), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.05), inset 0 -1px 0 rgba(0,0,0,0.25), inset 0 0 0 1px rgb(var(--surface-bd) / 0.6)\",\n color: profileColors.subdued,\n border: \"none\",\n cursor: \"not-allowed\",\n };\n }\n\n if (state === \"hover\") {\n return {\n backgroundColor: profileColors.surfaceBtnHover,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.04), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.14), inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 0 0 1px rgb(var(--surface-bd-hover))\",\n color: \"rgb(var(--content-tertiary))\",\n border: \"none\",\n };\n }\n\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgb(var(--btn-bevel) / 0.03), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgb(var(--btn-bevel) / 0.10), inset 0 -1px 0 rgba(0,0,0,0.35), inset 0 0 0 1px rgb(var(--surface-bd))\",\n color: profileColors.muted,\n border: \"none\",\n };\n};\n\nexport const dangerOutlineButtonStyle = (\n enabled: boolean,\n hovered = false,\n): CSSProperties => ({\n background: enabled && hovered ? \"rgba(248,113,113,0.1)\" : \"transparent\",\n border: `1px solid ${\n enabled ? profileColors.danger : \"rgb(var(--line-strong))\"\n }`,\n color: enabled ? profileColors.danger : profileColors.disabled,\n cursor: enabled ? \"pointer\" : \"not-allowed\",\n});\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useEffect,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n Pencil,\n SpinKeyframes,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface RenameWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number, name: string) => Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Kept for compatibility. Profile modal actions now use the shared app raised button style. */\n accentColor?: string;\n}\n\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\nconst WALLET_NAME_REGEX = /^[a-zA-Z0-9/]+$/;\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgb(var(--line))\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgb(var(--btn-bevel) / 0.03)\",\n border: \"1px solid rgb(var(--line))\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (disabled: boolean): CSSProperties => ({\n width: \"100%\",\n borderRadius: 8,\n padding: \"10px 12px\",\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst saveButtonStyle: CSSProperties = {\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n};\n\nexport function RenameWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: RenameWalletModalProps): ReactNode {\n const [name, setName] = useState(\"\");\n const [isRenaming, setIsRenaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const currentName = wallet?.name || \"Unnamed\";\n const displayAddress = wallet?.ethereumAddress;\n const trimmedName = name.trim();\n const isNameChanged = trimmedName !== currentName;\n const isNameValid = WALLET_NAME_REGEX.test(trimmedName);\n const canSubmit = isNameValid && isNameChanged && !isRenaming;\n\n useEffect(() => {\n if (!wallet) return;\n setName(wallet.name || \"\");\n setError(null);\n }, [wallet]);\n\n const handleClose = useCallback(() => {\n if (isRenaming) return;\n setError(null);\n onClose();\n }, [isRenaming, onClose]);\n\n const handleRename = useCallback(async () => {\n if (!wallet || !isNameValid || !isNameChanged) return;\n setError(null);\n setIsRenaming(true);\n try {\n await onConfirm(wallet.id, trimmedName);\n onNotify?.({ type: \"success\", message: \"Wallet renamed successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to rename wallet\");\n } finally {\n setIsRenaming(false);\n }\n }, [\n wallet,\n isNameValid,\n isNameChanged,\n onConfirm,\n trimmedName,\n onClose,\n onNotify,\n ]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle} onClick={handleClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Rename Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isRenaming}\n style={makeCloseBtnStyle(isRenaming)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {currentName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>Wallet name</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleRename();\n if (e.key === \"Escape\") handleClose();\n }}\n disabled={isRenaming}\n placeholder=\"Wallet name\"\n className={`input text-content placeholder-content-faint ${\n error ? \"input-error\" : \"\"\n }`}\n style={inputStyle(isRenaming)}\n />\n <p\n style={{\n margin: \"8px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n }}\n >\n Use letters, numbers, and / only.\n </p>\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleRename}\n disabled={!canSubmit}\n className={canSubmit ? \"btn-raised\" : \"btn-raised-disabled\"}\n style={saveButtonStyle}\n >\n {isRenaming ? (\n <>\n <Loader2 size={14} /> Saving...\n </>\n ) : (\n <>\n <Pencil size={14} /> Save Name\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { ExchangeClient } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport type {\n HyperliquidScaleCreateRequest,\n HyperliquidTwapCreateRequest,\n HyperliquidTwapModifyRequest,\n} from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type {\n HyperliquidWalletScaleSession,\n HyperliquidWalletTwapSession,\n} from \"hypurr-grpc/ts/hypurr/tools\";\nimport type {\n TelegramChatWalletPack,\n TelegramUserAddressBookEntry,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\n// ─── Config ──────────────────────────────────────────────────────\n\nexport interface HypurrConnectConfig {\n /** Auth hub client identifier. Sent as `client_id` during Telegram login. */\n clientId: string;\n /** gRPC-web base URL. Defaults to https://grpc.hypurr.fun. */\n grpcUrl?: string;\n /** Media base URL for user-uploaded assets. Defaults to https://media.hypurr.fun. */\n mediaUrl?: string;\n grpcTimeout?: number;\n isTestnet?: boolean;\n /** Polling interval in ms for TWAP/Scale session updates. Default 5000. Set 0 to disable. */\n sessionPollInterval?: number;\n telegram?: {\n /** Auth hub login URL. Defaults to https://auth.hypurr.fun/login. */\n authHubUrl?: string;\n /** Optional OAuth redirect URI. Defaults to the current page without auth query params. */\n redirectUri?: string | (() => string);\n /** Requested hub scopes. Defaults to the scopes required by this SDK. */\n scope?: string | string[];\n /** @deprecated Telegram login is handled by the auth hub; this option is ignored. */\n useWidget?: boolean;\n };\n}\n\n// ─── Telegram login ──────────────────────────────────────────────\n\n/** @deprecated Telegram login is handled by the auth hub; raw Telegram data is no longer used by the provider. */\nexport interface TelegramLoginData {\n id: number;\n first_name: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: number;\n hash: string;\n}\n\n// ─── Auth ────────────────────────────────────────────────────────\n\nexport type AuthMethod = \"telegram\" | \"eoa\" | null;\n\nexport interface HypurrUser {\n address: string;\n walletId: number;\n displayName: string;\n photoUrl?: string;\n authMethod: AuthMethod;\n telegramId?: string;\n hfunScore?: number;\n reputationScore?: number;\n /** Saved address-book entries (Telegram users only). */\n addressBook?: TelegramUserAddressBookEntry[];\n}\n\n// ─── Agent (EOA flow) ────────────────────────────────────────────\n\nexport interface StoredAgent {\n privateKey: `0x${string}`;\n address: `0x${string}`;\n approvedAt: number;\n /** Epoch ms from the `extraAgents` response; agent is invalid after this time. */\n validUntil: number;\n}\n\nexport type SignTypedDataFn = (params: {\n domain: Record<string, unknown>;\n types: Record<string, { name: string; type: string }[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}) => Promise<`0x${string}`>;\n\nexport type Hex = `0x${string}`;\n\nexport interface EvmTransactionRequest {\n from?: Hex;\n to?: Hex;\n gas?: Hex;\n gasPrice?: Hex;\n value?: Hex;\n data?: Hex;\n nonce?: Hex;\n chainId?: Hex;\n maxFeePerGas?: Hex;\n maxPriorityFeePerGas?: Hex;\n type?: Hex;\n accessList?: unknown;\n [key: string]: unknown;\n}\n\nexport type EvmRequestFn = (args: {\n method: string;\n params?: unknown[];\n}) => Promise<unknown>;\n\nexport type SignEvmTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<Hex>;\n\nexport type EoaSignTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<unknown>;\n\n/** Wallet signer provided at EOA connect time for user-signed actions. */\nexport interface EoaSigner {\n signTypedData: SignTypedDataFn;\n /** Optional raw EVM transaction signer. Used by `signEvmTransaction()` in EOA mode. */\n signTransaction?: EoaSignTransactionFn;\n /** Optional EIP-1193 provider request function. Used as a fallback for `eth_signTransaction`. */\n request?: EvmRequestFn;\n chainId: number;\n}\n\nexport interface EoaSignerOptions {\n signTransaction?: EoaSignTransactionFn;\n request?: EvmRequestFn;\n}\n\nexport interface RenewAgentWalletParams {\n walletId: number;\n /** Connected owner wallet address that will sign the approveAgent transaction. */\n ownerAddress: Hex;\n signTypedDataAsync: SignTypedDataFn;\n chainId: number;\n /** Approval length used when `agentName` is omitted. Defaults to 1 day. */\n approvalDurationMs?: number;\n /** Hyperliquid agent name to approve. Defaults to the Telegram agent-wallet valid_until name. */\n agentName?: string;\n}\n\n/**\n * Create an {@link EoaSigner} from any EIP-712 signing function.\n *\n * Accepts either a direct function or a `{ current }` ref object so the\n * signer always calls through to the latest function (avoids stale closures\n * with React hooks like wagmi's `useSignTypedData`).\n *\n * @example wagmi v2 — ref pattern (recommended)\n * ```ts\n * const { signTypedDataAsync } = useSignTypedData();\n * const chainId = useChainId();\n * const signerRef = useRef(signTypedDataAsync);\n * signerRef.current = signTypedDataAsync; // stays fresh every render\n *\n * // call once — the ref keeps it up to date\n * connectEoa(address, createEoaSigner(signerRef, chainId));\n * ```\n *\n * @example direct function (e.g. from viem WalletClient)\n * ```ts\n * connectEoa(address, createEoaSigner(client.signTypedData, chainId));\n * ```\n */\nexport function createEoaSigner(\n signTypedDataAsync:\n | ((args: Record<string, unknown>) => Promise<`0x${string}`>)\n | { current: (args: Record<string, unknown>) => Promise<`0x${string}`> },\n chainId: number,\n options: EoaSignerOptions = {},\n): EoaSigner {\n const resolve =\n typeof signTypedDataAsync === \"function\"\n ? signTypedDataAsync\n : (args: Record<string, unknown>) => signTypedDataAsync.current(args);\n return {\n signTypedData: (params) => resolve(params),\n signTransaction: options.signTransaction,\n request: options.request,\n chainId,\n };\n}\n\n// ─── TWAP / Scale param types ────────────────────────────────────\n// Omit authData & walletId — auto-filled from context using the selected wallet.\n\nexport type TwapCreateParams = Omit<\n HyperliquidTwapCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type TwapModifyParams = Omit<\n HyperliquidTwapModifyRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type ScaleCreateParams = Omit<\n HyperliquidScaleCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\n// ─── Context state ───────────────────────────────────────────────\n\nexport interface HypurrConnectState {\n // Auth\n user: HypurrUser | null;\n isLoggedIn: boolean;\n isLoading: boolean;\n error: string | null;\n authMethod: AuthMethod;\n\n // SDK ExchangeClient — handles both L1 (agent-signed) and user-signed actions.\n // Telegram: backed by GrpcExchangeTransport (HyperliquidCoreAction)\n // EOA: uses a dual wallet — agent key for L1 actions, master wallet for\n // user-signed actions (transfers, withdrawals, etc.) when a signer is provided.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exchange: ExchangeClient<any> | null;\n\n // Multi-wallet (Telegram only — EOA has a single wallet)\n wallets: HyperliquidWallet[];\n selectedWalletId: number;\n selectWallet: (walletId: number) => void;\n\n // Wallet management (Telegram only)\n createWallet: (name: string) => Promise<HyperliquidWallet>;\n deleteWallet: (walletId: number) => Promise<void>;\n renameWallet: (walletId: number, name: string) => Promise<void>;\n renewAgentWallet: (params: RenewAgentWalletParams) => Promise<void>;\n refreshWallets: () => void;\n\n // Wallet packs & labels (Telegram only)\n packs: TelegramChatWalletPack[];\n createWalletPack: (name: string) => Promise<number>;\n addPackLabel: (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n modifyPackLabel: (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }) => Promise<void>;\n removePackLabel: (params: {\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n\n // TWAP sessions (Telegram only)\n createTwap: (\n params: TwapCreateParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n modifyTwap: (\n params: TwapModifyParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n cancelTwap: (sessionId: number) => Promise<void>;\n\n // Scale sessions (Telegram only)\n createScale: (\n params: ScaleCreateParams,\n ) => Promise<HyperliquidWalletScaleSession>;\n cancelScale: (sessionId: number) => Promise<void>;\n\n // Login modal\n loginModalOpen: boolean;\n openLoginModal: () => void;\n closeLoginModal: () => void;\n\n // Auth actions\n connectEoa: (address: `0x${string}`, signer?: EoaSigner) => void;\n signEvmTransaction: SignEvmTransactionFn;\n approveAgent: (\n signTypedDataAsync: SignTypedDataFn,\n chainId: number,\n ) => Promise<void>;\n logout: () => void;\n\n // EOA agent management\n agent: StoredAgent | null;\n agentReady: boolean;\n clearAgent: () => void;\n\n // Low-level access\n /** Deprecated: JWT auth leaves authData empty; use `telegramRpcOptions` for low-level calls. */\n authDataMap: Record<string, string>;\n authToken: string | null;\n telegramRpcOptions?: RpcOptions;\n telegramClient: TelegramClient;\n staticClient: StaticClient;\n}\n"],"mappings":"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","names":["user","isTestnet","useCallback","jsx","jsx","jsxs","jsx","jsxs","useCallback","AnimatePresence","motion","useCallback","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","AnimatePresence","motion","AnimatePresence","motion","useCallback","useMemo","useState","Fragment","jsx","jsxs","formatAddress","useState","useMemo","useCallback","AnimatePresence","motion","ApprovalDurationPicker","AnimatePresence","motion","Fragment","useCallback","useMemo","useState","useCallback","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useCallback","AnimatePresence","motion","useCallback","useEffect","useMemo","useState","AnimatePresence","motion","useCallback","useState","modalWrapperStyle","Fragment","jsx","jsxs","backdropStyle","modalWrapperStyle","useState","useCallback","AnimatePresence","motion","AnimatePresence","motion","useCallback","useEffect","useState","Fragment","jsx","jsxs","DANGER_BORDER","WALLET_NAME_REGEX","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","bodyStyle","infoBoxStyle","labelStyle","inputStyle","footerStyle","useState","useEffect","useCallback","AnimatePresence","motion","Fragment","jsx","jsxs","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","useState","useEffect","useMemo","useCallback","AnimatePresence","motion","agent","Fragment","jsx","jsxs","DEFAULT_BACKGROUND_COLOR","useState","useCallback","useMemo","WalletRow","AnimatePresence","motion"]}