diff --git a/bun.lockb b/bun.lockb index 2a20123..31f1581 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 6ddafe6..9600abd 100644 --- a/package.json +++ b/package.json @@ -52,29 +52,29 @@ "@tanstack/react-query-persist-client": "5.4.3", "@tanstack/react-virtual": "3.0.0-beta.54", "@total-typescript/ts-reset": "^0.5.1", - "@vanilla-extract/css": "^1.17.4", + "@vanilla-extract/css": "^1.18.0", "@vanilla-extract/css-utils": "^0.1.6", "@vanilla-extract/dynamic": "^2.1.5", "@vanilla-extract/sprinkles": "^1.6.5", "abitype": "^0.9.10", "chroma-js": "^2.6.0", "clsx": "^1.2.1", - "ethers": "^6.15.0", - "eventemitter3": "^5.0.1", - "human-id": "^4.1.2", + "ethers": "^6.16.0", + "eventemitter3": "^5.0.4", + "human-id": "^4.1.3", "lucide-react": "^0.548.0", "mipd": "^0.0.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-flatten-children": "^1.1.2", - "react-hook-form": "^7.66.0", + "react-hook-form": "^7.71.1", "react-intersection-observer": "^9.16.0", - "react-router": "^6.30.1", - "react-router-dom": "^6.30.1", + "react-router": "^6.30.3", + "react-router-dom": "^6.30.3", "remeda": "^1.61.0", "sonner": "^0.7.4", "use-sync-external-store": "^1.6.0", - "viem": "^2.38.6", + "viem": "^2.45.2", "zustand": "^4.5.7" }, "devDependencies": { @@ -83,14 +83,14 @@ "@types/chroma-js": "^2.4.5", "@types/chrome": "^0.0.266", "@types/qs": "^6.14.0", - "@types/react": "^18.3.26", + "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", "@types/use-sync-external-store": "^0.0.3", "@types/webextension-polyfill": "^0.10.7", "@types/which-pm-runs": "^1.0.2", "@vanilla-extract/vite-plugin": "^4.0.20", "@vitejs/plugin-react": "^4.7.0", - "bun-types": "^1.3.1", + "bun-types": "^1.3.9", "cross-env": "^7.0.3", "globby": "^13.2.2", "patch-package": "^8.0.1", diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 5b6a0b5..828afc7 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -190,9 +190,15 @@ function Account() { {account && ( - - {account.address} - + {account.displayName ? ( + + {account.displayName} + + ) : ( + + {account.address} + + )} )} diff --git a/src/screens/block-config.tsx b/src/screens/block-config.tsx index 66884cb..d8eabe7 100644 --- a/src/screens/block-config.tsx +++ b/src/screens/block-config.tsx @@ -71,21 +71,15 @@ function IntervalMining() { Interval Mining - + - - {/* TODO: don't do this lol */} - - {'‎'} - - - + - + diff --git a/src/screens/index.tsx b/src/screens/index.tsx index c6bbd97..e162074 100644 --- a/src/screens/index.tsx +++ b/src/screens/index.tsx @@ -129,13 +129,44 @@ function Accounts() { } function AccountRow({ account }: { account: Account }) { - const { account: activeAccount, removeAccount } = useAccountStore() + const { + account: activeAccount, + removeAccount, + upsertAccount, + } = useAccountStore() const { mutateAsync: setAccount } = useSetAccount() + const [isEditingAlias, setIsEditingAlias] = useState(false) + const [aliasValue, setAliasValue] = useState(account.displayName ?? '') + const aliasInputRef = useRef(null) + + useEffect(() => { + if (isEditingAlias) aliasInputRef.current?.focus() + }, [isEditingAlias]) + + const saveAlias = () => { + const trimmed = aliasValue.trim() + upsertAccount({ + account: { + ...account, + displayName: trimmed || undefined, + }, + }) + setIsEditingAlias(false) + } + + const cancelAlias = () => { + setAliasValue(account.displayName ?? '') + setIsEditingAlias(false) + } + const active = activeAccount?.address === account.address const truncatedAddress = account.address && account.address.length > 0 - ? truncate(account.address, { start: 5, end: 5 }) + ? truncate( + account.address, + account.displayName ? { start: 5, end: 4 } : { start: 8, end: 6 }, + ) : undefined return ( - - {account.state === 'loading' && ( - - {truncate(account.key, { start: 20, end: 20 })} - - )} - {account.displayName && ( - {account.displayName} - )} - - - {truncatedAddress ?? account.address} - - - {account.address && ( - - + {isEditingAlias ? ( + setAliasValue(e.target.value)} + onClick={(e) => e.stopPropagation()} + onBlur={saveAlias} + onKeyDown={(e) => { + if (e.key === 'Enter') saveAlias() + if (e.key === 'Escape') cancelAlias() + }} + style={{ maxWidth: '200px' }} + /> + ) : ( + + {account.state === 'loading' && ( + + {truncate(account.key, { start: 20, end: 20 })} + + )} + {account.displayName && ( + {account.displayName} + )} + + + {truncatedAddress ?? account.address} + - )} - + {account.state === 'loaded' && ( + + { + e.stopPropagation() + setAliasValue(account.displayName ?? '') + setIsEditingAlias(true) + }} + /> + + )} + {account.address && ( + + + + )} + + )} diff --git a/src/screens/onboarding/download.tsx b/src/screens/onboarding/download.tsx index 5fca103..3ef1cd7 100644 --- a/src/screens/onboarding/download.tsx +++ b/src/screens/onboarding/download.tsx @@ -29,7 +29,6 @@ export default function OnboardingDownload() { paddingLeft="12px" paddingRight="32px" position="relative" - // @ts-expect-error style={{ textWrap: 'wrap' }} > diff --git a/src/screens/onboarding/run.tsx b/src/screens/onboarding/run.tsx index aa590f4..4ef628b 100644 --- a/src/screens/onboarding/run.tsx +++ b/src/screens/onboarding/run.tsx @@ -62,7 +62,6 @@ export default function OnboardingRun() { paddingLeft="12px" paddingRight="12px" position="relative" - // @ts-expect-error style={{ textWrap: 'wrap' }} > diff --git a/src/zustand/account.ts b/src/zustand/account.ts index d345a31..9c902f9 100644 --- a/src/zustand/account.ts +++ b/src/zustand/account.ts @@ -70,18 +70,25 @@ export const accountStore = createStore( }) }, setJsonRpcAccounts({ addresses, rpcUrl }) { - const accounts = addresses.map( - (address) => - ({ + set((state) => { + const existingByAddress = new Map( + state.accounts.map((a) => [a.address.toLowerCase(), a]), + ) + + const accounts = addresses.map((address) => { + const existing = existingByAddress.get(address.toLowerCase()) + return { address, key: `${rpcUrl}.${address}`, rpcUrl, state: 'loaded', type: 'json-rpc', - }) as const, - ) + ...(existing?.displayName && { + displayName: existing.displayName, + }), + } as const + }) - set((state) => { return { ...state, account: get().account || accounts[0], diff --git a/yarn.lock b/yarn.lock index 232b7ed..0d832d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 -# bun ./bun.lockb --hash: 471FFBB55E23723E-8f31cff949a5132d-73DE31F80BF753DC-7b6106664aa34b10 +# bun ./bun.lockb --hash: 108BDA897DF487C2-103ea7c855a3bcb9-43F4C7887D70A567-b5d002aea4460a96 "@aashutoshrathi/word-wrap@^1.2.3": @@ -1656,10 +1656,10 @@ "@react-hook/latest" "^1.0.2" "@react-hook/passive-layout-effect" "^1.2.0" -"@remix-run/router@1.23.0": - version "1.23.0" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz" - integrity sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA== +"@remix-run/router@1.23.2": + version "1.23.2" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz" + integrity sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w== "@rolldown/pluginutils@1.0.0-beta.27": version "1.0.0-beta.27" @@ -2100,7 +2100,7 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@*", "@types/react@>=16.8", "@types/react@^18.0.0", "@types/react@^18.3.26", "@types/react@^19": +"@types/react@*", "@types/react@>=16.8", "@types/react@^18.0.0": version "18.3.26" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz" integrity sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA== @@ -2108,6 +2108,14 @@ csstype "^3.0.2" "@types/prop-types" "*" +"@types/react@^18.3.28": + version "18.3.28" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz" + integrity sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw== + dependencies: + csstype "^3.2.2" + "@types/prop-types" "*" + "@types/react-dom@*": version "18.2.14" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz" @@ -2204,6 +2212,24 @@ picocolors "^1.0.0" "@vanilla-extract/private" "^1.0.9" +"@vanilla-extract/css@^1.18.0": + version "1.18.0" + resolved "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.18.0.tgz" + integrity sha512-/p0dwOjr0o8gE5BRQ5O9P0u/2DjUd6Zfga2JGmE4KaY7ZITWMszTzk4x4CPlM5cKkRr2ZGzbE6XkuPNfp9shSQ== + dependencies: + "@emotion/hash" "^0.9.0" + css-what "^6.1.0" + cssesc "^3.0.0" + csstype "^3.2.3" + dedent "^1.5.3" + deep-object-diff "^1.1.9" + deepmerge "^4.2.2" + lru-cache "^10.4.3" + media-query-parser "^2.0.2" + modern-ahocorasick "^1.0.0" + picocolors "^1.0.0" + "@vanilla-extract/private" "^1.0.9" + "@vanilla-extract/css-utils@^0.1.6": version "0.1.6" resolved "https://registry.npmjs.org/@vanilla-extract/css-utils/-/css-utils-0.1.6.tgz" @@ -2277,10 +2303,10 @@ abitype@^0.9.10: resolved "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz" integrity sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ== -abitype@1.1.0, abitype@^1.0.9: - version "1.1.0" - resolved "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz" - integrity sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A== +abitype@1.2.3, abitype@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz" + integrity sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg== abort-controller@^3.0.0: version "3.0.0" @@ -2622,10 +2648,10 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" -bun-types@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.3.1.tgz" - integrity sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw== +bun-types@^1.3.9: + version "1.3.9" + resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.3.9.tgz" + integrity sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg== dependencies: "@types/node" "*" @@ -2975,6 +3001,11 @@ csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.1: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csstype@^3.2.2, csstype@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" @@ -3512,18 +3543,18 @@ ethers@^6.8.0: tslib "2.4.0" ws "8.5.0" -ethers@^6.15.0: - version "6.15.0" - resolved "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz" - integrity sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ== +ethers@^6.16.0: + version "6.16.0" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz" + integrity sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A== dependencies: - "@adraffy/ens-normalize" "1.10.1" + ws "8.17.1" + tslib "2.7.0" + aes-js "4.0.0-beta.5" + "@types/node" "22.7.5" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" - "@types/node" "22.7.5" - aes-js "4.0.0-beta.5" - tslib "2.7.0" - ws "8.17.1" + "@adraffy/ens-normalize" "1.10.1" eval@0.1.8: version "0.1.8" @@ -3538,11 +3569,16 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@5.0.1, eventemitter3@^5.0.1: +eventemitter3@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +eventemitter3@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== + events@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" @@ -4023,10 +4059,10 @@ http2-wrapper@^2.1.10: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -human-id@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/human-id/-/human-id-4.1.2.tgz" - integrity sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg== +human-id@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz" + integrity sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q== human-signals@^1.1.1: version "1.1.1" @@ -4967,12 +5003,12 @@ outdent@^0.8.0: resolved "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== -ox@0.9.6: - version "0.9.6" - resolved "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz" - integrity sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg== +ox@0.11.3: + version "0.11.3" + resolved "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz" + integrity sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw== dependencies: - abitype "^1.0.9" + abitype "^1.2.3" "@scure/bip32" "^1.7.0" "@scure/bip39" "^1.6.0" "@noble/curves" "1.9.1" @@ -5357,10 +5393,10 @@ react-flatten-children@^1.1.2: resolved "https://registry.npmjs.org/react-flatten-children/-/react-flatten-children-1.1.2.tgz" integrity sha512-9pnG/uw2Wa0n97s+yBZg/WgfMPE8RC4qNcr6iYbyb19sacCk3gRJCmCzAhTuANSWesFsK9v/yTKW42pkenaAfw== -react-hook-form@^7.66.0: - version "7.66.0" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.0.tgz" - integrity sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw== +react-hook-form@^7.71.1: + version "7.71.1" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz" + integrity sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w== react-intersection-observer@^9.16.0: version "9.16.0" @@ -5391,20 +5427,20 @@ react-remove-scroll-bar@^2.3.7: react-style-singleton "^2.2.2" tslib "^2.0.0" -react-router@6.30.1, react-router@^6.30.1: - version "6.30.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz" - integrity sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ== +react-router@6.30.3, react-router@^6.30.3: + version "6.30.3" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz" + integrity sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw== dependencies: - "@remix-run/router" "1.23.0" + "@remix-run/router" "1.23.2" -react-router-dom@^6.30.1: - version "6.30.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz" - integrity sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw== +react-router-dom@^6.30.3: + version "6.30.3" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz" + integrity sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag== dependencies: - react-router "6.30.1" - "@remix-run/router" "1.23.0" + react-router "6.30.3" + "@remix-run/router" "1.23.2" react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: version "2.2.3" @@ -6280,18 +6316,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -viem@^2.38.6: - version "2.38.6" - resolved "https://registry.npmjs.org/viem/-/viem-2.38.6.tgz" - integrity sha512-aqO6P52LPXRjdnP6rl5Buab65sYa4cZ6Cpn+k4OLOzVJhGIK8onTVoKMFMT04YjDfyDICa/DZyV9HmvLDgcjkw== +viem@^2.45.2: + version "2.45.2" + resolved "https://registry.npmjs.org/viem/-/viem-2.45.2.tgz" + integrity sha512-GXPMmj0ukqFNL87sgpsZBy4CjGvsFQk42/EUdsn8dv3ZWtL4ukDXNCM0nME2hU0IcuS29CuUbrwbZN6iWxAipw== dependencies: "@noble/curves" "1.9.1" "@noble/hashes" "1.8.0" "@scure/bip32" "1.7.0" "@scure/bip39" "1.6.0" - abitype "1.1.0" + abitype "1.2.3" isows "1.0.7" - ox "0.9.6" + ox "0.11.3" ws "8.18.3" vite@*: