diff --git a/CUSTOMIZE.md b/CUSTOMIZE.md index 4872b8d0..8f87e0ee 100644 --- a/CUSTOMIZE.md +++ b/CUSTOMIZE.md @@ -48,7 +48,7 @@ The logo images you should change are: - `./src/images/logos/app-name.svg` - `./src/images/logos/app-title.svg` -These are images are primarily used in the header and footer files: +These images are primarily used in the header and footer files: - `./src/components/nav/Header.tsx` - `./src/components/nav/Footer.tsx` diff --git a/README.md b/README.md index ba78f469..f4674595 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Hyperlane Warp Route UI Template -This repo contains an example web interface for interchain tokens built with [Hyperlane Warp Route](https://docs.hyperlane.xyz/docs/reference/applications/warp-routes). Warp is a framework to permisionlessly bridge tokens to any chain. +This repo contains an example web interface for interchain tokens built with [Hyperlane Warp Route](https://docs.hyperlane.xyz/docs/reference/applications/warp-routes). Warp is a framework to permissionlessly bridge tokens to any chain. ## Architecture @@ -18,7 +18,12 @@ See [CUSTOMIZE.md](./CUSTOMIZE.md) for details about adjusting the tokens and br ### Setup +#### Configure + +You need a `projectId` from the WalletConnect Cloud to run the Hyperlane Warp Route UI. Sign up to [WalletConnect Cloud](https://cloud.walletconnect.com) to create a new project. + #### Build + ```sh # Install dependencies yarn @@ -27,22 +32,14 @@ yarn yarn build ``` -#### Configure - -You need a `projectId` from the WalletConnect Cloud to run the Hyperlane Warp Route UI successfully. -Sign up to [WalletConnect Cloud](https://cloud.walletconnect.com/), create -new project with AppKit and Next.js and copy the `projectId` from there. - ### Run You can add `.env.local` file next to `.env.example` where you set `projectId` copied from WalletConnect Cloud. + ```sh # Start the Next dev server yarn dev -``` - -Or you can set the WalletConnect Cloud `projectId` to use as follows: -``` +# Or with a custom projectId NEXT_PUBLIC_WALLET_CONNECT_ID= yarn dev ``` diff --git a/eslint.config.mjs b/eslint.config.mjs index 7d570005..54c8e85f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -56,12 +56,18 @@ export default [ }, rules: { + 'camelcase': ['error'], + 'guard-for-in': ['error'], + 'import/no-cycle': ['error'], + 'import/no-self-import': ['error'], 'no-console': ['warn'], 'no-eval': ['error'], 'no-ex-assign': ['error'], 'no-extra-boolean-cast': ['error'], 'no-constant-condition': ['off'], - 'guard-for-in': ['error'], + 'no-multiple-empty-lines': ['error'], + 'jsx-a11y/alt-text': ['off'], + '@typescript-eslint/ban-ts-comment': ['off'], '@typescript-eslint/explicit-module-boundary-types': ['off'], '@typescript-eslint/no-explicit-any': ['off'], @@ -77,7 +83,6 @@ export default [ }, ], - 'jsx-a11y/alt-text': ['off'], '@next/next/no-img-element': ['off'], }, }, diff --git a/package.json b/package.json index edd317dc..ad6c5b30 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,11 @@ "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", "@headlessui/react": "^2.2.0", - "@hyperlane-xyz/registry": "6.1.0", + "@hyperlane-xyz/registry": "6.11.0", "@hyperlane-xyz/sdk": "7.1.0", "@hyperlane-xyz/utils": "7.1.0", "@hyperlane-xyz/widgets": "7.1.0", "@interchain-ui/react": "^1.23.28", - "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6", "@metamask/post-message-stream": "6.1.2", "@metamask/providers": "10.2.1", "@rainbow-me/rainbowkit": "^2.2.0", diff --git a/public/logos/cosmos.svg b/public/logos/cosmos.svg deleted file mode 100644 index 6023d57e..00000000 --- a/public/logos/cosmos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/cosmwasm.svg b/public/logos/cosmwasm.svg deleted file mode 100644 index 21df9439..00000000 --- a/public/logos/cosmwasm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/solana.svg b/public/logos/solana.svg deleted file mode 100644 index 39609684..00000000 --- a/public/logos/solana.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/weth.png b/public/logos/weth.png deleted file mode 100644 index bf957d38..00000000 Binary files a/public/logos/weth.png and /dev/null differ diff --git a/src/components/icons/Identicon.tsx b/src/components/icons/Identicon.tsx deleted file mode 100644 index 344b7f3c..00000000 --- a/src/components/icons/Identicon.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { isValidAddressEvm, normalizeAddressEvm } from '@hyperlane-xyz/utils'; -import { Circle } from '@hyperlane-xyz/widgets'; -import jazzicon from '@metamask/jazzicon'; -import { memo } from 'react'; - -type Props = { - address?: string; - size?: number; -}; - -// This should match metamask: https://github.com/MetaMask/metamask-extension/blob/master/ui/helpers/utils/icon-factory.js#L84 -function addressToSeed(address: string) { - const addrStub = normalizeAddressEvm(address).slice(2, 10); - return parseInt(addrStub, 16); -} - -// TODO move to widgets lib -function _Identicon({ address, size: _size }: Props) { - const size = _size ?? 34; - - // TODO better handling of non-evm addresses here - if (!address || !isValidAddressEvm(address)) { - return ; - } - - const jazziconResult = jazzicon(size, addressToSeed(address)); - - return ( -
{ - if (nodeElement) { - nodeElement.innerHTML = ''; - nodeElement.appendChild(jazziconResult); - } - }} - >
- ); -} - -export const Identicon = memo(_Identicon); diff --git a/src/components/icons/types.ts b/src/components/icons/types.ts deleted file mode 100644 index 71146814..00000000 --- a/src/components/icons/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SVGProps } from 'react'; - -// TODO: Replace with DefaultIconProps in widgets lib -export type IconProps = SVGProps & { - color?: string; -}; diff --git a/src/consts/app.ts b/src/consts/app.ts index 8f7b5a56..2dc51e86 100644 --- a/src/consts/app.ts +++ b/src/consts/app.ts @@ -1,7 +1,7 @@ -import { Space_Grotesk } from 'next/font/google'; +import { Space_Grotesk as SpaceGrotesk } from 'next/font/google'; import { Color } from '../styles/Color'; -export const MAIN_FONT = Space_Grotesk({ +export const MAIN_FONT = SpaceGrotesk({ subsets: ['latin'], variable: '--font-main', preload: true, @@ -10,6 +10,6 @@ export const MAIN_FONT = Space_Grotesk({ export const APP_NAME = 'Hyperlane Warp UI Template'; export const APP_DESCRIPTION = 'A DApp for Hyperlane Warp Route transfers'; export const APP_URL = 'hyperlane-warp-template.vercel.app'; -export const BRAND_COLOR = Color.primary; -export const BACKGROUND_COLOR = Color.primary; +export const BRAND_COLOR = Color.primary['500']; +export const BACKGROUND_COLOR = Color.primary['500']; export const BACKGROUND_IMAGE = 'url(/backgrounds/main.svg)'; diff --git a/src/consts/config.ts b/src/consts/config.ts index d46f8ac6..ee80b349 100644 --- a/src/consts/config.ts +++ b/src/consts/config.ts @@ -4,10 +4,9 @@ import { ADDRESS_BLACKLIST } from './blacklist'; const isDevMode = process?.env?.NODE_ENV === 'development'; const version = process?.env?.NEXT_PUBLIC_VERSION || '0.0.0'; const registryUrl = process?.env?.NEXT_PUBLIC_REGISTRY_URL || undefined; +const registryBranch = process?.env?.NEXT_PUBLIC_REGISTRY_BRANCH || undefined; const registryProxyUrl = process?.env?.NEXT_PUBLIC_GITHUB_PROXY || 'https://proxy.hyperlane.xyz'; -const explorerApiKeys = JSON.parse(process?.env?.EXPLORER_API_KEYS || '{}'); const walletConnectProjectId = process?.env?.NEXT_PUBLIC_WALLET_CONNECT_ID || ''; -const withdrawalWhitelist = process?.env?.NEXT_PUBLIC_BLOCK_WITHDRAWAL_WHITELIST || ''; const transferBlacklist = process?.env?.NEXT_PUBLIC_TRANSFER_BLACKLIST || ''; const chainWalletWhitelists = JSON.parse(process?.env?.NEXT_PUBLIC_CHAIN_WALLET_WHITELISTS || '{}'); @@ -15,30 +14,28 @@ interface Config { addressBlacklist: string[]; // A list of addresses that are blacklisted and cannot be used in the app chainWalletWhitelists: ChainMap; // A map of chain names to a list of wallet names that work for it enableExplorerLink: boolean; // Include a link to the hyperlane explorer in the transfer modal - explorerApiKeys: Record; // Optional map of API keys for block explorer isDevMode: boolean; // Enables some debug features in the app registryUrl: string | undefined; // Optional URL to use a custom registry instead of the published canonical version + registryBranch?: string | undefined; // Optional customization of the registry branch instead of main registryProxyUrl?: string; // Optional URL to use a custom proxy for the GithubRegistry showDisabledTokens: boolean; // Show/Hide invalid token options in the selection modal showTipBox: boolean; // Show/Hide the blue tip box above the transfer form transferBlacklist: string; // comma-separated list of routes between which transfers are disabled. Expects Caip2Id-Caip2Id (e.g. ethereum:1-sealevel:1399811149) version: string; // Matches version number in package.json walletConnectProjectId: string; // Project ID provided by walletconnect - withdrawalWhitelist: string; // comma-separated list of CAIP2 chain IDs to which transfers are supported } export const config: Config = Object.freeze({ addressBlacklist: ADDRESS_BLACKLIST.map((address) => address.toLowerCase()), chainWalletWhitelists, enableExplorerLink: false, - explorerApiKeys, isDevMode, registryUrl, + registryBranch, registryProxyUrl, showDisabledTokens: false, showTipBox: true, version, transferBlacklist, walletConnectProjectId, - withdrawalWhitelist, }); diff --git a/src/consts/links.ts b/src/consts/links.ts index ab16f7df..7c5568ae 100644 --- a/src/consts/links.ts +++ b/src/consts/links.ts @@ -7,7 +7,7 @@ export const links = { warpDocs: 'https://docs.hyperlane.xyz/docs/reference/applications/warp-routes', gasDocs: 'https://docs.hyperlane.xyz/docs/reference/hooks/interchain-gas', chains: 'https://docs.hyperlane.xyz/docs/resources/domains', - twitter: 'https://twitter.com/hyperlane', + twitter: 'https://x.com/hyperlane', blog: 'https://medium.com/hyperlane', tos: 'https://hyperlane.xyz/terms-of-service', privacyPolicy: 'https://hyperlane.xyz/privacy-policy', diff --git a/src/features/chains/utils.ts b/src/features/chains/utils.ts index d67f7d0a..be11c771 100644 --- a/src/features/chains/utils.ts +++ b/src/features/chains/utils.ts @@ -25,14 +25,6 @@ export function hasPermissionlessChain(multiProvider: MultiProtocolProvider, ids return !ids.every((c) => !isPermissionlessChain(multiProvider, c)); } -export function getChainByRpcUrl(multiProvider: MultiProtocolProvider, url?: string) { - if (!url) return undefined; - const allMetadata = Object.values(multiProvider.metadata); - return allMetadata.find( - (m) => !!m.rpcUrls.find((rpc) => rpc.http.toLowerCase().includes(url.toLowerCase())), - ); -} - /** * Returns an object that contains the amount of * routes from a single chain to every other chain diff --git a/src/features/store.ts b/src/features/store.ts index e634529b..dc90b9a4 100644 --- a/src/features/store.ts +++ b/src/features/store.ts @@ -66,7 +66,11 @@ export const useStore = create()( set({ chainMetadataOverrides: filtered, multiProvider }); }, multiProvider: new MultiProtocolProvider({}), - registry: new GithubRegistry({ uri: config.registryUrl, proxyUrl: config.registryProxyUrl }), + registry: new GithubRegistry({ + uri: config.registryUrl, + branch: config.registryBranch, + proxyUrl: config.registryProxyUrl, + }), warpCore: new WarpCore(new MultiProtocolProvider({}), []), setWarpContext: ({ registry, chainMetadata, multiProvider, warpCore }) => { logger.debug('Setting warp context in store'); diff --git a/src/features/transfer/TransferTokenForm.tsx b/src/features/transfer/TransferTokenForm.tsx index 68f50121..4318670f 100644 --- a/src/features/transfer/TransferTokenForm.tsx +++ b/src/features/transfer/TransferTokenForm.tsx @@ -222,7 +222,7 @@ function RecipientSection({ isReview }: { isReview: boolean }) { } function TokenBalance({ label, balance }: { label: string; balance?: TokenAmount | null }) { - const value = balance?.getDecimalFormattedAmount().toFixed(4) || '0'; + const value = balance?.getDecimalFormattedAmount().toFixed(5) || '0'; return
{`${label}: ${value}`}
; } diff --git a/src/features/transfer/TransfersDetailsModal.tsx b/src/features/transfer/TransfersDetailsModal.tsx index 1c1c22b5..aa859430 100644 --- a/src/features/transfer/TransfersDetailsModal.tsx +++ b/src/features/transfer/TransfersDetailsModal.tsx @@ -20,16 +20,16 @@ import { Color } from '../../styles/Color'; import { formatTimestamp } from '../../utils/date'; import { getHypExplorerLink } from '../../utils/links'; import { logger } from '../../utils/logger'; +import { useMultiProvider } from '../chains/hooks'; +import { getChainDisplayName, hasPermissionlessChain } from '../chains/utils'; +import { tryFindToken, useWarpCore } from '../tokens/hooks'; +import { TransferContext, TransferStatus } from './types'; import { getIconByTransferStatus, getTransferStatusLabel, isTransferFailed, isTransferSent, -} from '../../utils/transfer'; -import { useMultiProvider } from '../chains/hooks'; -import { getChainDisplayName, hasPermissionlessChain } from '../chains/utils'; -import { tryFindToken, useWarpCore } from '../tokens/hooks'; -import { TransferContext, TransferStatus } from './types'; +} from './utils'; export function TransfersDetailsModal({ isOpen, @@ -263,7 +263,7 @@ function WideChevron() { width="16" height="100%" direction="e" - color={Color.lightGray} + color={Color.gray['300']} rounded={true} /> ); diff --git a/src/features/transfer/utils.ts b/src/features/transfer/utils.ts index ad8bb4fb..7d713529 100644 --- a/src/features/transfer/utils.ts +++ b/src/features/transfer/utils.ts @@ -1,3 +1,69 @@ +import ConfirmedIcon from '../../images/icons/confirmed-icon.svg'; +import DeliveredIcon from '../../images/icons/delivered-icon.svg'; +import ErrorCircleIcon from '../../images/icons/error-circle.svg'; +import { FinalTransferStatuses, SentTransferStatuses, TransferStatus } from './types'; + +export function getTransferStatusLabel( + status: TransferStatus, + connectorName: string, + isPermissionlessRoute: boolean, + isAccountReady: boolean, +) { + let statusDescription = '...'; + if (!isAccountReady && !FinalTransferStatuses.includes(status)) + statusDescription = 'Please connect wallet to continue'; + else if (status === TransferStatus.Preparing) + statusDescription = 'Preparing for token transfer...'; + else if (status === TransferStatus.CreatingTxs) statusDescription = 'Creating transactions...'; + else if (status === TransferStatus.SigningApprove) + statusDescription = `Sign approve transaction in ${connectorName} to continue.`; + else if (status === TransferStatus.ConfirmingApprove) + statusDescription = 'Confirming approve transaction...'; + else if (status === TransferStatus.SigningTransfer) + statusDescription = `Sign transfer transaction in ${connectorName} to continue.`; + else if (status === TransferStatus.ConfirmingTransfer) + statusDescription = 'Confirming transfer transaction...'; + else if (status === TransferStatus.ConfirmedTransfer) + if (!isPermissionlessRoute) + statusDescription = 'Transfer transaction confirmed, delivering message...'; + else + statusDescription = + 'Transfer confirmed, the funds will arrive when the message is delivered.'; + else if (status === TransferStatus.Delivered) + statusDescription = 'Delivery complete, transfer successful!'; + else if (status === TransferStatus.Failed) + statusDescription = 'Transfer failed, please try again.'; + + return statusDescription; +} + +export function isTransferSent(status: TransferStatus) { + return SentTransferStatuses.includes(status); +} + +export function isTransferFailed(status: TransferStatus) { + return status === TransferStatus.Failed; +} + +export const STATUSES_WITH_ICON = [ + TransferStatus.Delivered, + TransferStatus.ConfirmedTransfer, + TransferStatus.Failed, +]; + +export function getIconByTransferStatus(status: TransferStatus) { + switch (status) { + case TransferStatus.Delivered: + return DeliveredIcon; + case TransferStatus.ConfirmedTransfer: + return ConfirmedIcon; + case TransferStatus.Failed: + return ErrorCircleIcon; + default: + return ErrorCircleIcon; + } +} + import { ChainMap, CoreAddresses, diff --git a/src/features/wallet/SideBarMenu.tsx b/src/features/wallet/SideBarMenu.tsx index 9e436fbf..508bcd60 100644 --- a/src/features/wallet/SideBarMenu.tsx +++ b/src/features/wallet/SideBarMenu.tsx @@ -6,13 +6,13 @@ import { ChainLogo } from '../../components/icons/ChainLogo'; import ArrowRightIcon from '../../images/icons/arrow-right.svg'; import CollapseIcon from '../../images/icons/collapse-icon.svg'; import ResetIcon from '../../images/icons/reset-icon.svg'; -import { getIconByTransferStatus, STATUSES_WITH_ICON } from '../../utils/transfer'; import { useMultiProvider } from '../chains/hooks'; import { getChainDisplayName } from '../chains/utils'; import { useStore } from '../store'; import { tryFindToken, useWarpCore } from '../tokens/hooks'; import { TransfersDetailsModal } from '../transfer/TransfersDetailsModal'; import { TransferContext } from '../transfer/types'; +import { getIconByTransferStatus, STATUSES_WITH_ICON } from '../transfer/utils'; export function SideBarMenu({ onClickConnectWallet, diff --git a/src/features/wallet/WalletFloatingButtons.tsx b/src/features/wallet/WalletFloatingButtons.tsx index c0ab5b24..e93093e9 100644 --- a/src/features/wallet/WalletFloatingButtons.tsx +++ b/src/features/wallet/WalletFloatingButtons.tsx @@ -18,14 +18,14 @@ export function WalletFloatingButtons() { title="History" onClick={() => setIsSideBarOpen(!isSideBarOpen)} > - + - + ); diff --git a/src/features/wallet/context/EvmWalletContext.tsx b/src/features/wallet/context/EvmWalletContext.tsx index d8f802da..830948f6 100644 --- a/src/features/wallet/context/EvmWalletContext.tsx +++ b/src/features/wallet/context/EvmWalletContext.tsx @@ -68,7 +68,7 @@ export function EvmWalletContext({ children }: PropsWithChildren) { ; export const Color = { black: themeColors.black, white: themeColors.white, - gray: themeColors.gray[500], - lightGray: themeColors.gray[200], - primary: themeColors.primary[500], - accent: themeColors.accent[500], - red: themeColors.red[500], + gray: themeColors.gray, + primary: themeColors.primary, + accent: themeColors.accent, + red: themeColors.red, } as const; diff --git a/src/utils/transfer.ts b/src/utils/transfer.ts deleted file mode 100644 index 90dceae0..00000000 --- a/src/utils/transfer.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - FinalTransferStatuses, - SentTransferStatuses, - TransferStatus, -} from '../features/transfer/types'; -import ConfirmedIcon from '../images/icons/confirmed-icon.svg'; -import DeliveredIcon from '../images/icons/delivered-icon.svg'; -import ErrorCircleIcon from '../images/icons/error-circle.svg'; - -export function getTransferStatusLabel( - status: TransferStatus, - connectorName: string, - isPermissionlessRoute: boolean, - isAccountReady: boolean, -) { - let statusDescription = '...'; - if (!isAccountReady && !FinalTransferStatuses.includes(status)) - statusDescription = 'Please connect wallet to continue'; - else if (status === TransferStatus.Preparing) - statusDescription = 'Preparing for token transfer...'; - else if (status === TransferStatus.CreatingTxs) statusDescription = 'Creating transactions...'; - else if (status === TransferStatus.SigningApprove) - statusDescription = `Sign approve transaction in ${connectorName} to continue.`; - else if (status === TransferStatus.ConfirmingApprove) - statusDescription = 'Confirming approve transaction...'; - else if (status === TransferStatus.SigningTransfer) - statusDescription = `Sign transfer transaction in ${connectorName} to continue.`; - else if (status === TransferStatus.ConfirmingTransfer) - statusDescription = 'Confirming transfer transaction...'; - else if (status === TransferStatus.ConfirmedTransfer) - if (!isPermissionlessRoute) - statusDescription = 'Transfer transaction confirmed, delivering message...'; - else - statusDescription = - 'Transfer confirmed, the funds will arrive when the message is delivered.'; - else if (status === TransferStatus.Delivered) - statusDescription = 'Delivery complete, transfer successful!'; - else if (status === TransferStatus.Failed) - statusDescription = 'Transfer failed, please try again.'; - - return statusDescription; -} - -export function isTransferSent(status: TransferStatus) { - return SentTransferStatuses.includes(status); -} - -export function isTransferFailed(status: TransferStatus) { - return status === TransferStatus.Failed; -} - -export const STATUSES_WITH_ICON = [ - TransferStatus.Delivered, - TransferStatus.ConfirmedTransfer, - TransferStatus.Failed, -]; - -export function getIconByTransferStatus(status: TransferStatus) { - switch (status) { - case TransferStatus.Delivered: - return DeliveredIcon; - case TransferStatus.ConfirmedTransfer: - return ConfirmedIcon; - case TransferStatus.Failed: - return ErrorCircleIcon; - default: - return ErrorCircleIcon; - } -} diff --git a/tailwind.config.js b/tailwind.config.js index 66adf091..17ea7efc 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,7 @@ /** @type {import('tailwindcss').Config} */ const defaultTheme = require('tailwindcss/defaultTheme'); +const defaultColors = require('tailwindcss/colors'); module.exports = { content: ['./src/**/*.{js,ts,jsx,tsx}'], @@ -19,7 +20,7 @@ module.exports = { colors: { black: '#010101', white: '#ffffff', - gray: { ...defaultTheme.colors.gray, 150: '#EBEDF0', 250: '#404040', 350: '#6B6B6B' }, + gray: { ...defaultColors.gray, '150': '#EBEDF0', '250': '#404040', '350': '#6B6B6B' }, primary: { 50: '#E6EDF9', 100: '#CDDCF4', diff --git a/yarn.lock b/yarn.lock index cd31cab4..fe9a8660 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3881,13 +3881,13 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/registry@npm:6.1.0": - version: 6.1.0 - resolution: "@hyperlane-xyz/registry@npm:6.1.0" +"@hyperlane-xyz/registry@npm:6.11.0": + version: 6.11.0 + resolution: "@hyperlane-xyz/registry@npm:6.11.0" dependencies: yaml: "npm:2.4.5" zod: "npm:^3.21.2" - checksum: 10/a0e1ecc02d83604793ddda0a3e00a9ffcaa38b1cddf9883b47cf8f1919b4474abd6cc2ee84846e6a35e1bc7539299b9bec92bfdf06be72beecff6aa44b73d382 + checksum: 10/25019fbc8ff07b06e34c1ad55af556623fbd4676c12b40060bee89d468f8b3d57a2559286b500e1aae21e19c2ff7ca07bd00a2df7386340bfa1208790b47e8b7 languageName: node linkType: hard @@ -3953,12 +3953,11 @@ __metadata: "@emotion/react": "npm:^11.13.3" "@emotion/styled": "npm:^11.13.0" "@headlessui/react": "npm:^2.2.0" - "@hyperlane-xyz/registry": "npm:6.1.0" + "@hyperlane-xyz/registry": "npm:6.11.0" "@hyperlane-xyz/sdk": "npm:7.1.0" "@hyperlane-xyz/utils": "npm:7.1.0" "@hyperlane-xyz/widgets": "npm:7.1.0" "@interchain-ui/react": "npm:^1.23.28" - "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6" "@metamask/post-message-stream": "npm:6.1.2" "@metamask/providers": "npm:10.2.1" "@next/bundle-analyzer": "npm:^15.0.2" @@ -4793,15 +4792,6 @@ __metadata: languageName: node linkType: hard -"@metamask/jazzicon@https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6": - version: 2.1.0 - resolution: "@metamask/jazzicon@https://github.com/jmrossy/jazzicon.git#commit=7a8df28974b4e81129bfbe3cab76308b889032a6" - dependencies: - mersenne-twister: "npm:^1.1.0" - checksum: 10/5e56251b375eade58294334783fb37a15e8fd48d792f6dc93f7247b8897541324f9cf2d3f1d9b1cffdac1d932a8bc48a89dee7cdbd6e4a312ca2ff85df90131b - languageName: node - linkType: hard - "@metamask/json-rpc-engine@npm:^7.0.0": version: 7.3.3 resolution: "@metamask/json-rpc-engine@npm:7.3.3" @@ -17646,13 +17636,6 @@ __metadata: languageName: node linkType: hard -"mersenne-twister@npm:^1.1.0": - version: 1.1.0 - resolution: "mersenne-twister@npm:1.1.0" - checksum: 10/1123526199091097102f2f91639ad7d5b3df4b098de9a4a72c835920e11ef0ce08e25737d5af1d363325a60da8804365eae8a41e03b7a46a1acc22e18fa8f261 - languageName: node - linkType: hard - "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2"