diff --git a/.eslintrc b/.eslintrc index dcc1fd5e..20987951 100644 --- a/.eslintrc +++ b/.eslintrc @@ -37,6 +37,7 @@ "caughtErrorsIgnorePattern": "^_" } ], - "jsx-a11y/alt-text": ["off"] + "jsx-a11y/alt-text": ["off"], + "@next/next/no-img-element": ["off"] } } diff --git a/.github/workflows/create-merge-prs.yaml b/.github/workflows/create-merge-prs.yaml new file mode 100644 index 00000000..77be905e --- /dev/null +++ b/.github/workflows/create-merge-prs.yaml @@ -0,0 +1,46 @@ +name: Merge Main to Other Branches + +on: + push: + branches: + - main + +jobs: + create-merge-prs: + runs-on: ubuntu-latest + strategy: + matrix: + name: [ezeth, injective, nexus] + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Configure Git + run: | + git config user.name "GitHub Actions Bot" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Create and push merge branch + run: | + git checkout ${{ matrix.name }} + git merge origin/main + git checkout -b main-to-${{ matrix.name }} + git push -fu origin main-to-${{ matrix.name }} + + - name: Check and Create Pull Request + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_EXISTS=$(gh pr list --base ${{ matrix.name }} --head main-to-${{ matrix.name }} --json number --jq length) + if [ "$PR_EXISTS" -eq "0" ]; then + gh pr create \ + --base ${{ matrix.name }} \ + --head main-to-${{ matrix.name }} \ + --title "chore: merge main into ${{ matrix.name }}" \ + --body "This PR was automatically created to merge changes from \`main\` into \`${{ matrix.name }}\`." \ + --draft + else + echo "Pull request already exists. Skipping creation." + fi diff --git a/package.json b/package.json index e8d58c2d..b83043aa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/warp-ui-template", "description": "A web app template for building Hyperlane Warp Route UIs", - "version": "5.0.0", + "version": "5.1.0", "author": "J M Rossy", "dependencies": { "@chakra-ui/next-js": "^2.2.0", @@ -13,13 +13,14 @@ "@cosmos-kit/keplr": "^2.12.2", "@cosmos-kit/leap": "^2.12.2", "@cosmos-kit/react": "^2.18.0", + "@drift-labs/snap-wallet-adapter": "^0.3.0", "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@headlessui/react": "^1.7.14", - "@hyperlane-xyz/registry": "2.5.0", - "@hyperlane-xyz/sdk": "5.1.0", - "@hyperlane-xyz/utils": "5.1.0", - "@hyperlane-xyz/widgets": "5.1.0", + "@hyperlane-xyz/registry": "4.3.3", + "@hyperlane-xyz/sdk": "5.2.0", + "@hyperlane-xyz/utils": "5.2.0", + "@hyperlane-xyz/widgets": "5.2.0", "@interchain-ui/react": "^1.23.28", "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6", "@metamask/post-message-stream": "6.1.2", @@ -92,6 +93,7 @@ }, "types": "dist/src/index.d.ts", "resolutions": { + "@solana/web3.js": "^1.78.4", "axios": "0.27.2", "bn.js": "^5.2", "cosmjs-types": "0.9", diff --git a/src/components/banner/FormWarningBanner.tsx b/src/components/banner/FormWarningBanner.tsx new file mode 100644 index 00000000..52e2972e --- /dev/null +++ b/src/components/banner/FormWarningBanner.tsx @@ -0,0 +1,13 @@ +import { ComponentProps } from 'react'; + +import { WarningBanner } from '../../components/banner/WarningBanner'; + +export function FormWarningBanner({ className, ...props }: ComponentProps) { + return ( + + ); +} diff --git a/src/components/banner/WarningBanner.tsx b/src/components/banner/WarningBanner.tsx new file mode 100644 index 00000000..a701a075 --- /dev/null +++ b/src/components/banner/WarningBanner.tsx @@ -0,0 +1,37 @@ +import Image from 'next/image'; +import { PropsWithChildren, ReactNode } from 'react'; + +import WarningIcon from '../../images/icons/warning.svg'; + +export function WarningBanner({ + isVisible, + cta, + onClick, + className, + children, +}: PropsWithChildren<{ + isVisible: boolean; + cta: ReactNode; + onClick: () => void; + className?: string; +}>) { + return ( +
+
+ Warning: + {children} +
+ +
+ ); +} diff --git a/src/components/icons/TokenIcon.tsx b/src/components/icons/TokenIcon.tsx index 80bacb3d..95948be2 100644 --- a/src/components/icons/TokenIcon.tsx +++ b/src/components/icons/TokenIcon.tsx @@ -1,4 +1,3 @@ -import Image from 'next/image'; import { memo } from 'react'; import { IToken } from '@hyperlane-xyz/sdk'; @@ -26,7 +25,7 @@ function _TokenIcon({ token, size = 32 }: Props) { {imageSrc ? ( - + ) : (
{character}
diff --git a/src/consts/chains.ts b/src/consts/chains.ts index 9083e108..1ee848df 100644 --- a/src/consts/chains.ts +++ b/src/consts/chains.ts @@ -1,3 +1,9 @@ +import { + eclipsemainnet, + eclipsemainnetAddresses, + solanamainnet, + solanamainnetAddresses, +} from '@hyperlane-xyz/registry'; import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; // A map of chain names to ChainMetadata @@ -5,6 +11,19 @@ import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk'; // Chains already in the SDK need not be included here unless you want to override some fields // Schema here: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts export const chains: ChainMap = { + solanamainnet: { + ...solanamainnet, + // SVM chains require mailbox addresses for the token adapters + mailbox: solanamainnetAddresses.mailbox, + // Including a convenient rpc override because the Solana public RPC does not allow browser requests from localhost + rpcUrls: process.env.NEXT_PUBLIC_SOLANA_RPC_URL + ? [{ http: process.env.NEXT_PUBLIC_SOLANA_RPC_URL }, ...solanamainnet.rpcUrls] + : solanamainnet.rpcUrls, + }, + eclipsemainnet: { + ...eclipsemainnet, + mailbox: eclipsemainnetAddresses.mailbox, + }, // mycustomchain: { // protocol: ProtocolType.Ethereum, // chainId: 123123, diff --git a/src/consts/config.ts b/src/consts/config.ts index 0542d45f..0ef286c0 100644 --- a/src/consts/config.ts +++ b/src/consts/config.ts @@ -1,3 +1,5 @@ +import { ChainMap } from '@hyperlane-xyz/sdk'; + import { ADDRESS_BLACKLIST } from './blacklist'; const isDevMode = process?.env?.NODE_ENV === 'development'; @@ -7,6 +9,7 @@ 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 || '{}'); interface Config { isDevMode: boolean; // Enables some debug features in the app @@ -20,6 +23,7 @@ interface Config { transferBlacklist: string; // comma-separated list of routes between which transfers are disabled. Expects Caip2Id-Caip2Id (e.g. ethereum:1-sealevel:1399811149) enableExplorerLink: boolean; // Include a link to the hyperlane explorer in the transfer modal 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 } export const config: Config = Object.freeze({ @@ -34,4 +38,5 @@ export const config: Config = Object.freeze({ transferBlacklist, enableExplorerLink: true, addressBlacklist: ADDRESS_BLACKLIST.map((address) => address.toLowerCase()), + chainWalletWhitelists, }); diff --git a/src/features/chains/ChainWalletWarning.tsx b/src/features/chains/ChainWalletWarning.tsx new file mode 100644 index 00000000..fff43a15 --- /dev/null +++ b/src/features/chains/ChainWalletWarning.tsx @@ -0,0 +1,48 @@ +import { useMemo } from 'react'; + +import { toTitleCase } from '@hyperlane-xyz/utils'; + +import { FormWarningBanner } from '../../components/banner/FormWarningBanner'; +import { config } from '../../consts/config'; +import { logger } from '../../utils/logger'; +import { useConnectFns, useDisconnectFns, useWalletDetails } from '../wallet/hooks/multiProtocol'; + +import { getChainDisplayName, tryGetChainProtocol } from './utils'; + +export function ChainWalletWarning({ originChain }: { originChain: ChainName }) { + const wallets = useWalletDetails(); + const connectFns = useConnectFns(); + const disconnectFns = useDisconnectFns(); + + const { isVisible, chainDisplayName, walletWhitelist, connectFn, disconnectFn } = useMemo(() => { + const protocol = tryGetChainProtocol(originChain); + const walletWhitelist = config.chainWalletWhitelists[originChain]?.map((w) => + w.trim().toLowerCase(), + ); + if (!protocol || !walletWhitelist?.length) + return { isVisible: false, chainDisplayName: '', walletWhitelist: [] }; + + const chainDisplayName = getChainDisplayName(originChain, true); + const walletName = wallets[protocol]?.name?.trim()?.toLowerCase(); + const connectFn = connectFns[protocol]; + const disconnectFn = disconnectFns[protocol]; + const isVisible = !!walletName && !walletWhitelist.includes(walletName); + + return { isVisible, chainDisplayName, walletWhitelist, connectFn, disconnectFn }; + }, [originChain, wallets, connectFns, disconnectFns]); + + const onClickChange = () => { + if (!connectFn || !disconnectFn) return; + disconnectFn() + .then(() => connectFn()) + .catch((err) => logger.error('Error changing wallet connection', err)); + }; + + return ( + + {`${chainDisplayName} requires one of the following wallets: ${walletWhitelist + .map((w) => toTitleCase(w)) + .join(', ')}`} + + ); +} diff --git a/src/features/chains/metadata.ts b/src/features/chains/metadata.ts index 21f242f9..0ea3e229 100644 --- a/src/features/chains/metadata.ts +++ b/src/features/chains/metadata.ts @@ -1,10 +1,12 @@ import type { AssetList, Chain as CosmosChain } from '@chain-registry/types'; import type { Chain as WagmiChain } from '@wagmi/core'; -import { ChainName, chainMetadataToWagmiChain } from '@hyperlane-xyz/sdk'; +import { ChainMetadata, ChainName, chainMetadataToWagmiChain } from '@hyperlane-xyz/sdk'; import { ProtocolType } from '@hyperlane-xyz/utils'; -import { getWarpContext } from '../../context/context'; +import { getTokens, getWarpContext } from '../../context/context'; + +import { cosmosDefaultChain } from './cosmosDefault'; // Metadata formatted for use in Wagmi config export function getWagmiChainConfig(): WagmiChain[] { @@ -15,9 +17,7 @@ export function getWagmiChainConfig(): WagmiChain[] { } export function getCosmosKitConfig(): { chains: CosmosChain[]; assets: AssetList[] } { - const cosmosChains = Object.values(getWarpContext().chains).filter( - (c) => c.protocol === ProtocolType.Cosmos, - ); + const cosmosChains = getCosmosChains(); const chains = cosmosChains.map((c) => ({ chain_name: c.name, status: 'live', @@ -96,7 +96,13 @@ export function getCosmosKitConfig(): { chains: CosmosChain[]; assets: AssetList } export function getCosmosChainNames(): ChainName[] { - return Object.values(getWarpContext().chains) - .filter((c) => c.protocol === ProtocolType.Cosmos) - .map((c) => c.name); + return getCosmosChains().map((c) => c.name); +} + +export function getCosmosChains(): ChainMetadata[] { + const tokens = getTokens(); + const chains = Object.values(getWarpContext().chains).filter( + (c) => c.protocol === ProtocolType.Cosmos && tokens.some((t) => t.chainName === c.name), + ); + return [...chains, cosmosDefaultChain]; } diff --git a/src/features/chains/utils.ts b/src/features/chains/utils.ts index 645bff85..e638b9e2 100644 --- a/src/features/chains/utils.ts +++ b/src/features/chains/utils.ts @@ -1,9 +1,10 @@ -import { CoreChain, CoreChains } from '@hyperlane-xyz/registry'; import { ChainNameOrId } from '@hyperlane-xyz/sdk'; import { ProtocolType, toTitleCase } from '@hyperlane-xyz/utils'; import { getMultiProvider } from '../../context/context'; +const ABACUS_WORKS_DEPLOYER_NAME = 'abacus works'; + export function getChainDisplayName(chain: ChainName, shortName = false) { if (!chain) return 'Unknown'; const metadata = tryGetChainMetadata(chain); @@ -14,9 +15,10 @@ export function getChainDisplayName(chain: ChainName, shortName = false) { export function isPermissionlessChain(chain: ChainName) { if (!chain) return true; + const metadata = tryGetChainMetadata(chain); return ( - getChainMetadata(chain).protocol !== ProtocolType.Ethereum || - !CoreChains.includes(chain as CoreChain) + metadata?.protocol !== ProtocolType.Ethereum || + metadata.deployer?.name.trim().toLowerCase() !== ABACUS_WORKS_DEPLOYER_NAME ); } @@ -24,11 +26,11 @@ export function hasPermissionlessChain(ids: ChainName[]) { return !ids.every((c) => !isPermissionlessChain(c)); } -export function getChainByRpcEndpoint(endpoint?: string) { - if (!endpoint) return undefined; +export function getChainByRpcUrl(url?: string) { + if (!url) return undefined; const allMetadata = Object.values(getMultiProvider().metadata); return allMetadata.find( - (m) => !!m.rpcUrls.find((rpc) => rpc.http.toLowerCase().includes(endpoint.toLowerCase())), + (m) => !!m.rpcUrls.find((rpc) => rpc.http.toLowerCase().includes(url.toLowerCase())), ); } diff --git a/src/features/transfer/TransferTokenForm.tsx b/src/features/transfer/TransferTokenForm.tsx index 6d37609d..b7cfced9 100644 --- a/src/features/transfer/TransferTokenForm.tsx +++ b/src/features/transfer/TransferTokenForm.tsx @@ -18,6 +18,7 @@ import SwapIcon from '../../images/icons/swap.svg'; import { Color } from '../../styles/Color'; import { logger } from '../../utils/logger'; import { ChainSelectField } from '../chains/ChainSelectField'; +import { ChainWalletWarning } from '../chains/ChainWalletWarning'; import { getChainDisplayName } from '../chains/utils'; import { useIsAccountSanctioned } from '../sanctions/hooks/useIsAccountSanctioned'; import { useStore } from '../store'; @@ -62,8 +63,9 @@ export function TransferTokenForm() { validateOnChange={false} validateOnBlur={false} > - {({ isValidating }) => ( -
+ {({ isValidating, values }) => ( + +
@@ -112,7 +114,7 @@ function ChainSelectSection({ isReview }: { isReview: boolean }) { const chains = useMemo(() => getWarpCore().getTokenChains(), []); return ( -
+
@@ -427,7 +429,8 @@ function useFormInitialValues(): TransferFormValues { }, []); } -const insufficientFundsErrMsg = /insufficient.funds/i; +const insufficientFundsErrMsg = /insufficient.[funds|lamports]/i; +const emptyAccountErrMsg = /AccountNotFound/i; async function validateForm( values: TransferFormValues, @@ -447,10 +450,11 @@ async function validateForm( senderPubKey: await senderPubKey, }); return result; - } catch (error) { + } catch (error: any) { logger.error('Error validating form', error); let errorMsg = errorToString(error, 40); - if (insufficientFundsErrMsg.test(errorMsg)) { + const fullError = `${errorMsg} ${error.message}`; + if (insufficientFundsErrMsg.test(fullError) || emptyAccountErrMsg.test(fullError)) { errorMsg = 'Insufficient funds for gas fees'; } return { form: errorMsg }; diff --git a/src/features/wallet/SideBarMenu.tsx b/src/features/wallet/SideBarMenu.tsx index 25662e7b..213f94be 100644 --- a/src/features/wallet/SideBarMenu.tsx +++ b/src/features/wallet/SideBarMenu.tsx @@ -33,7 +33,7 @@ export function SideBarMenu({ const [isMenuOpen, setIsMenuOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedTransfer, setSelectedTransfer] = useState(null); - const disconnects = useDisconnectFns(); + const disconnectFns = useDisconnectFns(); const { readyAccounts } = useAccounts(); const didMountRef = useRef(false); @@ -57,7 +57,7 @@ export function SideBarMenu({ }, [isOpen]); const onClickDisconnect = async () => { - for (const disconnectFn of Object.values(disconnects)) { + for (const disconnectFn of Object.values(disconnectFns)) { await disconnectFn(); } }; diff --git a/src/features/wallet/WalletEnvSelectionModal.tsx b/src/features/wallet/WalletEnvSelectionModal.tsx index c2872f55..9c698976 100644 --- a/src/features/wallet/WalletEnvSelectionModal.tsx +++ b/src/features/wallet/WalletEnvSelectionModal.tsx @@ -1,7 +1,7 @@ import Image from 'next/image'; import { PropsWithChildren } from 'react'; -import { ethereum, solana } from '@hyperlane-xyz/registry'; +import { ethereum, solanamainnet } from '@hyperlane-xyz/registry'; import { ProtocolType } from '@hyperlane-xyz/utils'; import { ChainLogo } from '../../components/icons/ChainLogo'; @@ -31,7 +31,7 @@ export function WalletEnvSelectionModal({ isOpen, close }: { isOpen: boolean; cl Solana diff --git a/src/features/wallet/context/SolanaWalletContext.tsx b/src/features/wallet/context/SolanaWalletContext.tsx index 1eacdc4b..535a75c9 100644 --- a/src/features/wallet/context/SolanaWalletContext.tsx +++ b/src/features/wallet/context/SolanaWalletContext.tsx @@ -1,10 +1,13 @@ +import { SnapWalletAdapter } from '@drift-labs/snap-wallet-adapter'; import { WalletAdapterNetwork, WalletError } from '@solana/wallet-adapter-base'; import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react'; import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'; import '@solana/wallet-adapter-react-ui/styles.css'; import { + BackpackWalletAdapter, LedgerWalletAdapter, PhantomWalletAdapter, + SalmonWalletAdapter, SolflareWalletAdapter, TrustWalletAdapter, } from '@solana/wallet-adapter-wallets'; @@ -16,12 +19,15 @@ import { logger } from '../../../utils/logger'; export function SolanaWalletContext({ children }: PropsWithChildren) { // TODO support multiple networks - const network = WalletAdapterNetwork.Devnet; + const network = WalletAdapterNetwork.Mainnet; const endpoint = useMemo(() => clusterApiUrl(network), [network]); const wallets = useMemo( () => [ new PhantomWalletAdapter(), new SolflareWalletAdapter(), + new BackpackWalletAdapter(), + new SalmonWalletAdapter(), + new SnapWalletAdapter(), new TrustWalletAdapter(), new LedgerWalletAdapter(), ], diff --git a/src/features/wallet/hooks/solana.ts b/src/features/wallet/hooks/solana.ts index df6e9e38..8e54f415 100644 --- a/src/features/wallet/hooks/solana.ts +++ b/src/features/wallet/hooks/solana.ts @@ -2,14 +2,13 @@ import { useConnection, useWallet } from '@solana/wallet-adapter-react'; import { useWalletModal } from '@solana/wallet-adapter-react-ui'; import { Connection } from '@solana/web3.js'; import { useCallback, useMemo } from 'react'; -import { toast } from 'react-toastify'; import { ProviderType, TypedTransactionReceipt, WarpTypedTransaction } from '@hyperlane-xyz/sdk'; import { ProtocolType } from '@hyperlane-xyz/utils'; import { getMultiProvider } from '../../../context/context'; import { logger } from '../../../utils/logger'; -import { getChainByRpcEndpoint } from '../../chains/utils'; +import { getChainByRpcUrl } from '../../chains/utils'; import { AccountInfo, ActiveChainInfo, ChainTransactionFns, WalletDetails } from './types'; @@ -55,12 +54,18 @@ export function useSolActiveChain(): ActiveChainInfo { const { connection } = useConnection(); const connectionEndpoint = connection?.rpcEndpoint; return useMemo(() => { - const metadata = getChainByRpcEndpoint(connectionEndpoint); - if (!metadata) return {}; - return { - chainDisplayName: metadata.displayName, - chainName: metadata.name, - }; + try { + const hostname = new URL(connectionEndpoint).hostname; + const metadata = getChainByRpcUrl(hostname); + if (!metadata) return {}; + return { + chainDisplayName: metadata.displayName, + chainName: metadata.name, + }; + } catch (error) { + logger.warn('Error finding sol active chain', error); + return {}; + } }, [connectionEndpoint]); } @@ -68,7 +73,7 @@ export function useSolTransactionFns(): ChainTransactionFns { const { sendTransaction: sendSolTransaction } = useWallet(); const onSwitchNetwork = useCallback(async (chainName: ChainName) => { - toast.warn(`Solana wallet must be connected to origin chain ${chainName}}`); + logger.warn(`Solana wallet must be connected to origin chain ${chainName}`); }, []); const onSendTx = useCallback( diff --git a/src/images/icons/warning.svg b/src/images/icons/warning.svg new file mode 100644 index 00000000..521bbbe9 --- /dev/null +++ b/src/images/icons/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/yarn.lock b/yarn.lock index 3e5529a1..b2079097 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1132,7 +1132,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.6": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0": version: 7.23.2 resolution: "@babel/runtime@npm:7.23.2" dependencies: @@ -1141,6 +1141,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.25.0": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 0c4134734deb20e1005ffb9165bf342e1074576621b246d8e5e41cc7cb315a885b7d98950fbf5c63619a2990a56ae82f444d35fe8c4691a0b70c2fe5673667dc + languageName: node + linkType: hard + "@babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3": version: 7.22.5 resolution: "@babel/template@npm:7.22.5" @@ -2974,6 +2983,17 @@ __metadata: languageName: node linkType: hard +"@drift-labs/snap-wallet-adapter@npm:^0.3.0": + version: 0.3.0 + resolution: "@drift-labs/snap-wallet-adapter@npm:0.3.0" + dependencies: + "@solana/wallet-adapter-base": "npm:^0.9.22" + "@solana/web3.js": "npm:^1.76.0" + typescript: "npm:^5.0.4" + checksum: 6220e7d742b71fdab2c355f9f81217b7ef17ad29c6a732833ef432866c182c236711383aac0cdc21180a1af50533ce56d014c0281555229dc510f50ac331d16d + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:^11.12.0": version: 11.12.0 resolution: "@emotion/babel-plugin@npm:11.12.0" @@ -3919,13 +3939,13 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/core@npm:5.1.0": - version: 5.1.0 - resolution: "@hyperlane-xyz/core@npm:5.1.0" +"@hyperlane-xyz/core@npm:5.2.0": + version: 5.2.0 + resolution: "@hyperlane-xyz/core@npm:5.2.0" dependencies: "@arbitrum/nitro-contracts": "npm:^1.2.1" "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:5.1.0" + "@hyperlane-xyz/utils": "npm:5.2.0" "@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2" "@openzeppelin/contracts": "npm:^4.9.3" "@openzeppelin/contracts-upgradeable": "npm:^v4.9.3" @@ -3934,32 +3954,43 @@ __metadata: "@ethersproject/abi": "*" "@ethersproject/providers": "*" "@types/sinon-chai": "*" - checksum: 81fd921a06b0d289070afac8e352d8dd38bf9219dea62e6fa3dcc2082b0ae39c23810fb4fe669b1933566fa1dfb7930f25307cbca2361b7e848152e9dc4e6014 + checksum: 1872769da9d11814671fce662407b8823fb5ed265c952ed396671486ff8faff52f2a24903ba1f8d412eb72d23d9ac9663c77f0e8dd2fada470ada96e5f3d2caf languageName: node linkType: hard -"@hyperlane-xyz/registry@npm:2.5.0": - version: 2.5.0 - resolution: "@hyperlane-xyz/registry@npm:2.5.0" +"@hyperlane-xyz/registry@npm:4.1.0": + version: 4.1.0 + resolution: "@hyperlane-xyz/registry@npm:4.1.0" dependencies: - yaml: "npm:^2" + yaml: "npm:2.4.5" zod: "npm:^3.21.2" - checksum: 24f433c0938dc31913b0f7a93b880a9aa15eabebf664eb11f319c51f6b38163929429405dd996b8964f8a2f43dfa4ba5424b157ad6fd39432653e46e128e0ffc + checksum: 5de3ef5539abfaadbfefb82e6e69fdb2413f404d8321456c91810fb50a5a70e9f93b38789495efce6ab5963682536e95a2abe636c7d0ad91ee158cc0ce6b063a languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:5.1.0": - version: 5.1.0 - resolution: "@hyperlane-xyz/sdk@npm:5.1.0" +"@hyperlane-xyz/registry@npm:4.3.3": + version: 4.3.3 + resolution: "@hyperlane-xyz/registry@npm:4.3.3" + dependencies: + yaml: "npm:2.4.5" + zod: "npm:^3.21.2" + checksum: 09cf9242fd9b5dd4274ae1a3ce877d157db74fe85378dcf726e40dd3fa2ce8fc97523657c4008bc866daee0ac3aa569de706a31194eef4702182ea148091e180 + languageName: node + linkType: hard + +"@hyperlane-xyz/sdk@npm:5.2.0": + version: 5.2.0 + resolution: "@hyperlane-xyz/sdk@npm:5.2.0" dependencies: "@arbitrum/sdk": "npm:^4.0.0" "@aws-sdk/client-s3": "npm:^3.74.0" "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/stargate": "npm:^0.32.4" - "@hyperlane-xyz/core": "npm:5.1.0" - "@hyperlane-xyz/utils": "npm:5.1.0" + "@hyperlane-xyz/core": "npm:5.2.0" + "@hyperlane-xyz/utils": "npm:5.2.0" "@safe-global/api-kit": "npm:1.3.0" "@safe-global/protocol-kit": "npm:1.3.0" + "@safe-global/safe-deployments": "npm:1.37.8" "@solana/spl-token": "npm:^0.3.8" "@solana/web3.js": "npm:^1.78.0" "@types/coingecko-api": "npm:^1.0.10" @@ -3975,13 +4006,13 @@ __metadata: peerDependencies: "@ethersproject/abi": "*" "@ethersproject/providers": "*" - checksum: 80aaa6836fc1aaa1c10c69b7d80d960daeef9074c763fb2f1161f8d921ca344207117c4a21312ed6bdd80cba6e85ca30c75abab7992273c6da2ff4a953619400 + checksum: 2217671125e884e0133c321516beab1b0384fff438a6e9ae07703de507d8f613c74b9b4c6f0f83548d082f5bca5d20696337a0a22518afa2757a33e127f1468e languageName: node linkType: hard -"@hyperlane-xyz/utils@npm:5.1.0": - version: 5.1.0 - resolution: "@hyperlane-xyz/utils@npm:5.1.0" +"@hyperlane-xyz/utils@npm:5.2.0": + version: 5.2.0 + resolution: "@hyperlane-xyz/utils@npm:5.2.0" dependencies: "@cosmjs/encoding": "npm:^0.32.4" "@solana/web3.js": "npm:^1.78.0" @@ -3989,8 +4020,8 @@ __metadata: ethers: "npm:^5.7.2" lodash-es: "npm:^4.17.21" pino: "npm:^8.19.0" - yaml: "npm:^2.4.1" - checksum: 3a29c91b0fd8be48833743150299425e26fcf19f6bdbfddddf39e8480cc6587d9c525298d6aaa522a9c854954fb197ef7a11b237b4d48f88c20a75a319453914 + yaml: "npm:2.4.5" + checksum: fbc7b5c4061d81f588c4272bfe35aeeb90a6fd2edc0e6be8d4cc5ab11dc438c8955593559a88ed4e816306e8ea37893bb22eedc0c12ffa5bede74de29671e976 languageName: node linkType: hard @@ -4007,13 +4038,14 @@ __metadata: "@cosmos-kit/keplr": "npm:^2.12.2" "@cosmos-kit/leap": "npm:^2.12.2" "@cosmos-kit/react": "npm:^2.18.0" + "@drift-labs/snap-wallet-adapter": "npm:^0.3.0" "@emotion/react": "npm:^11.13.0" "@emotion/styled": "npm:^11.13.0" "@headlessui/react": "npm:^1.7.14" - "@hyperlane-xyz/registry": "npm:2.5.0" - "@hyperlane-xyz/sdk": "npm:5.1.0" - "@hyperlane-xyz/utils": "npm:5.1.0" - "@hyperlane-xyz/widgets": "npm:5.1.0" + "@hyperlane-xyz/registry": "npm:4.3.3" + "@hyperlane-xyz/sdk": "npm:5.2.0" + "@hyperlane-xyz/utils": "npm:5.2.0" + "@hyperlane-xyz/widgets": "npm:5.2.0" "@interchain-ui/react": "npm:^1.23.28" "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6" "@metamask/post-message-stream": "npm:6.1.2" @@ -4065,16 +4097,16 @@ __metadata: languageName: unknown linkType: soft -"@hyperlane-xyz/widgets@npm:5.1.0": - version: 5.1.0 - resolution: "@hyperlane-xyz/widgets@npm:5.1.0" +"@hyperlane-xyz/widgets@npm:5.2.0": + version: 5.2.0 + resolution: "@hyperlane-xyz/widgets@npm:5.2.0" dependencies: - "@hyperlane-xyz/registry": "npm:2.5.0" - "@hyperlane-xyz/sdk": "npm:5.1.0" + "@hyperlane-xyz/registry": "npm:4.1.0" + "@hyperlane-xyz/sdk": "npm:5.2.0" peerDependencies: react: ^18 react-dom: ^18 - checksum: 7a7a28129fa55ea1852f33dc16a527873252e10cf9d6bcc791864c2c9b9cd1c4ea1ef1ecc1a4d3d8a580613ad99548ed33d462eb49da7caf2719f9272e54ec43 + checksum: 85259297bc68c205e5aa52d8fed79ac4d2b3d01949b8e0322f51e96115ff4eb7084adc5b1c4e674fdf805eb7a6d2a49ce31e7fcdb0340be843d265c188624f01 languageName: node linkType: hard @@ -5158,7 +5190,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.2.0, @noble/curves@npm:^1.0.0, @noble/curves@npm:~1.2.0": +"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" dependencies: @@ -5176,6 +5208,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:^1.4.2": + version: 1.6.0 + resolution: "@noble/curves@npm:1.6.0" + dependencies: + "@noble/hashes": "npm:1.5.0" + checksum: 9090b5a020b7e38c7b6d21506afaacd0c7557129d716a174334c1efc36385bf3ca6de16a543c216db58055e019c6a6c3bea8d9c0b79386e6bacff5c4c6b438a9 + languageName: node + linkType: hard + "@noble/hashes@npm:1.3.0": version: 1.3.0 resolution: "@noble/hashes@npm:1.3.0" @@ -5183,7 +5224,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.3.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": +"@noble/hashes@npm:1.3.2, @noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.3.0, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" checksum: 685f59d2d44d88e738114b71011d343a9f7dce9dfb0a121f1489132f9247baa60bc985e5ec6f3213d114fbd1e1168e7294644e46cbd0ce2eba37994f28eeb51b @@ -5197,6 +5238,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.5.0": + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: da7fc7af52af7afcf59810a7eea6155075464ff462ffda2572dc6d57d53e2669b1ea2ec774e814f6273f1697e567f28d36823776c9bf7068cba2a2855140f26e + languageName: node + linkType: hard + "@noble/hashes@npm:^1.4.0": version: 1.4.0 resolution: "@noble/hashes@npm:1.4.0" @@ -7127,6 +7175,15 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-deployments@npm:1.37.8": + version: 1.37.8 + resolution: "@safe-global/safe-deployments@npm:1.37.8" + dependencies: + semver: "npm:^7.6.2" + checksum: bc8fce2c4d557e547a6cceebb611f9584d998dfb459cd50cf338409de986bed247ebca9425b0984a6e1a6accab42c7c4d1c68811e09cc981756183ba50a5e5a9 + languageName: node + linkType: hard + "@safe-global/safe-deployments@npm:^1.26.0": version: 1.36.0 resolution: "@safe-global/safe-deployments@npm:1.36.0" @@ -8077,6 +8134,15 @@ __metadata: languageName: node linkType: hard +"@solana/buffer-layout@npm:^4.0.1": + version: 4.0.1 + resolution: "@solana/buffer-layout@npm:4.0.1" + dependencies: + buffer: "npm:~6.0.3" + checksum: c64b996b832b2b7966a09e97f501fdd1409fece8975f7fb47698d7b8addb97504360cfb2f3d1368949c643d23ed9a4c9f79e19bbd721ebe5bf229353252f649e + languageName: node + linkType: hard + "@solana/spl-token@npm:^0.3.8": version: 0.3.8 resolution: "@solana/spl-token@npm:0.3.8" @@ -8765,26 +8831,26 @@ __metadata: languageName: node linkType: hard -"@solana/web3.js@npm:^1.32.0, @solana/web3.js@npm:^1.36.0, @solana/web3.js@npm:^1.44.3, @solana/web3.js@npm:^1.63.1, @solana/web3.js@npm:^1.70.1, @solana/web3.js@npm:^1.77.0, @solana/web3.js@npm:^1.78.0": - version: 1.78.4 - resolution: "@solana/web3.js@npm:1.78.4" +"@solana/web3.js@npm:^1.78.4": + version: 1.95.3 + resolution: "@solana/web3.js@npm:1.95.3" dependencies: - "@babel/runtime": "npm:^7.22.6" - "@noble/curves": "npm:^1.0.0" - "@noble/hashes": "npm:^1.3.1" - "@solana/buffer-layout": "npm:^4.0.0" - agentkeepalive: "npm:^4.3.0" + "@babel/runtime": "npm:^7.25.0" + "@noble/curves": "npm:^1.4.2" + "@noble/hashes": "npm:^1.4.0" + "@solana/buffer-layout": "npm:^4.0.1" + agentkeepalive: "npm:^4.5.0" bigint-buffer: "npm:^1.1.5" bn.js: "npm:^5.2.1" borsh: "npm:^0.7.0" bs58: "npm:^4.0.1" buffer: "npm:6.0.3" fast-stable-stringify: "npm:^1.0.0" - jayson: "npm:^4.1.0" - node-fetch: "npm:^2.6.12" - rpc-websockets: "npm:^7.5.1" - superstruct: "npm:^0.14.2" - checksum: f6af0f7456c3d0be4e576db4c5f1ddf33ad4a9fd553751a4cdd7ef55a4bbdca5f7625ce76f0452f87d3e963d8eb553805303e16189f0b8f679d8304619b9defc + jayson: "npm:^4.1.1" + node-fetch: "npm:^2.7.0" + rpc-websockets: "npm:^9.0.2" + superstruct: "npm:^2.0.2" + checksum: 25bdc5100faae6d3e48cbfac965b129060bec61669dcd75d0a525cea3ce8d23632ebea249a7b21616c89641bf7ea26d18826ce51246274b6aa1278d32180c870 languageName: node linkType: hard @@ -9002,6 +9068,15 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:^0.5.11": + version: 0.5.13 + resolution: "@swc/helpers@npm:0.5.13" + dependencies: + tslib: "npm:^2.4.0" + checksum: 6ba2f7e215d32d71fce139e2cfc426b3ed7eaa709febdeb07b97260a4c9eea4784cf047cc1271be273990b08220b576b94a42b5780947c0b3be84973a847a24d + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" @@ -9647,6 +9722,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^8.3.4": + version: 8.3.4 + resolution: "@types/uuid@npm:8.3.4" + checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f + languageName: node + linkType: hard + "@types/ws@npm:^7.4.4": version: 7.4.7 resolution: "@types/ws@npm:7.4.7" @@ -9656,6 +9738,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.2.2": + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" + dependencies: + "@types/node": "npm:*" + checksum: d8a3ddfb5ff8fea992a043113579d61ac1ea21e8464415af9e2b01b205ed19d817821ad64ca1b3a90062d1df1c23b0f586d8351d25ca6728844df99a74e8f76d + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -10861,7 +10952,7 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.2.1, agentkeepalive@npm:^4.3.0": +"agentkeepalive@npm:^4.2.1, agentkeepalive@npm:^4.5.0": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" dependencies: @@ -13823,6 +13914,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "events@npm:3.3.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -15662,9 +15760,9 @@ __metadata: languageName: node linkType: hard -"jayson@npm:^4.1.0": - version: 4.1.0 - resolution: "jayson@npm:4.1.0" +"jayson@npm:^4.1.1": + version: 4.1.2 + resolution: "jayson@npm:4.1.2" dependencies: "@types/connect": "npm:^3.4.33" "@types/node": "npm:^12.12.54" @@ -15677,10 +15775,10 @@ __metadata: isomorphic-ws: "npm:^4.0.1" json-stringify-safe: "npm:^5.0.1" uuid: "npm:^8.3.2" - ws: "npm:^7.4.5" + ws: "npm:^7.5.10" bin: jayson: bin/jayson.js - checksum: d76b3f220e14388007958b8f79e793009d6bc572b6e5ea65848a0f027b324d1950d836468986d7e38ddfb30b660e8b048b459c8bc8456e9b38dbbebc60a563b4 + checksum: 7ad5e80e11ef39b7382509d046546883d2595998aa245768b342bcc0a63843e011e16f02a023d5a78fb74df788b5f97c1e850568fc1b90c138fa4772cc55572c languageName: node linkType: hard @@ -17500,7 +17598,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -19450,13 +19548,16 @@ __metadata: languageName: node linkType: hard -"rpc-websockets@npm:^7.5.1": - version: 7.5.1 - resolution: "rpc-websockets@npm:7.5.1" +"rpc-websockets@npm:^9.0.2": + version: 9.0.2 + resolution: "rpc-websockets@npm:9.0.2" dependencies: - "@babel/runtime": "npm:^7.17.2" + "@swc/helpers": "npm:^0.5.11" + "@types/uuid": "npm:^8.3.4" + "@types/ws": "npm:^8.2.2" + buffer: "npm:^6.0.3" bufferutil: "npm:^4.0.1" - eventemitter3: "npm:^4.0.7" + eventemitter3: "npm:^5.0.1" utf-8-validate: "npm:^5.0.2" uuid: "npm:^8.3.2" ws: "npm:^8.5.0" @@ -19465,7 +19566,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 3553c2b303fe53ffe87f81645d89b8e482a13a0113bf6a9111296659bf46ad8fb4f15e6889b6fb6ae01a6452b3de4e47d75e2155f112863ec7c78475368a4eae + checksum: d558958888cd3469fb8560840305352e59c9ffcd71c7a443c0c5710995ecc3c130b1473f5d4a9d316dbd408fa7473e0de720b875cf8c6ada2668cf8fac072859 languageName: node linkType: hard @@ -19633,6 +19734,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.2": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -20253,13 +20363,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^0.14.2": - version: 0.14.2 - resolution: "superstruct@npm:0.14.2" - checksum: 81eb2af08f2a5b1c3d4c9a7815fe0decd4eddc305dbd74471b2c29496910dfb1188e54c4bfc8c5b5e64c0f69cd303af554332d1f9d7967eff39144d1a4c4d2e2 - languageName: node - linkType: hard - "superstruct@npm:^1.0.3": version: 1.0.3 resolution: "superstruct@npm:1.0.3" @@ -20267,6 +20370,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: 10e1944a9da4baee187fbaa6c5d97d7af266b55786dfe50bce67f0f1e7d93f1a5a42dd51e245a2e16404f8336d07c21c67f1c1fbc4ad0a252d3d2601d6c926da + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -20791,6 +20901,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.0.4": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b + languageName: node + linkType: hard + "typescript@npm:^5.3.3": version: 5.3.3 resolution: "typescript@npm:5.3.3" @@ -20811,6 +20931,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 060a7349adf698477b411be4ace470aee6c2c1bd99917fdf5d33697c17ec55c64fe724eb10399387530b50e9913b41528dd8bfcca0a5fc8f8bac63fbb4580a2e + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": version: 5.3.3 resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" @@ -21830,7 +21960,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.3.1, ws@npm:^7.4.0, ws@npm:^7.4.5, ws@npm:^7.5.1": +"ws@npm:^7, ws@npm:^7.3.1, ws@npm:^7.4.0, ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -21845,6 +21975,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 9c796b84ba80ffc2c2adcdfc9c8e9a219ba99caa435c9a8d45f9ac593bba325563b3f83edc5eb067cc6d21b9a6bf2c930adf76dd40af5f58a5ca6859e81858f0 + languageName: node + linkType: hard + "ws@npm:~8.11.0": version: 8.11.0 resolution: "ws@npm:8.11.0" @@ -21966,6 +22111,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:2.4.5": + version: 2.4.5 + resolution: "yaml@npm:2.4.5" + bin: + yaml: bin.mjs + checksum: b09bf5a615a65276d433d76b8e34ad6b4c0320b85eb3f1a39da132c61ae6e2ff34eff4624e6458d96d49566c93cf43408ba5e568218293a8c6541a2006883f64 + languageName: node + linkType: hard + "yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -21973,15 +22127,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2, yaml@npm:^2.4.1": - version: 2.4.2 - resolution: "yaml@npm:2.4.2" - bin: - yaml: bin.mjs - checksum: 6eafbcd68dead734035f6f72af21bd820c29214caf7d8e40c595671a3c908535cef8092b9660a1c055c5833aa148aa640e0c5fa4adb5af2dacd6d28296ccd81c - languageName: node - linkType: hard - "yaml@npm:^2.0.0, yaml@npm:^2.3.4": version: 2.3.4 resolution: "yaml@npm:2.3.4"