diff --git a/frontend/next.config.js b/frontend/next.config.js index c1a479f06..017c7bddf 100644 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -2,6 +2,10 @@ const nextConfig = { images: { remotePatterns: [ + { + protocol: 'https', + hostname: '**', + }, { protocol: 'https', hostname: 'raw.githubusercontent.com', diff --git a/frontend/package.json b/frontend/package.json index 6404b4202..9ee2ce368 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ "lint": "next lint --no-cache" }, "dependencies": { + "@0xsquid/sdk": "^1.14.15", "@cosmjs/amino": "^0.31.3", "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", @@ -22,13 +23,14 @@ "@mui/material": "^5.14.10", "@mui/x-date-pickers": "5.0.4", "@reduxjs/toolkit": "^1.9.7", - "@skip-router/core": "^1.1.1", + "@skip-router/core": "^1.3.11", "@types/node": "20.6.5", "@types/react": "18.2.37", "@types/react-dom": "18.2.15", "autoprefixer": "10.4.16", "axios": "^1.5.1", "axios-retry": "^4.0.0", + "chain-registry": "1.28.1", "chart.js": "^4.4.1", "cosmjs-types": "^0.9.0", "date-fns": "2.30.0", diff --git a/frontend/public/down-arrow-icon.svg b/frontend/public/down-arrow-icon.svg new file mode 100644 index 000000000..02e08d48e --- /dev/null +++ b/frontend/public/down-arrow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/public/ibc-swap-icon.svg b/frontend/public/ibc-swap-icon.svg new file mode 100644 index 000000000..d8941013c --- /dev/null +++ b/frontend/public/ibc-swap-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/frontend/src/app/(routes)/transfers/components/AssetsList.tsx b/frontend/src/app/(routes)/transfers/components/AssetsList.tsx new file mode 100644 index 000000000..feecddb38 --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/AssetsList.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import Avatar from '@mui/material/Avatar'; +import { CircularProgress, Paper } from '@mui/material'; +import { shortenName } from '@/utils/util'; +import { AssetConfig } from '@/types/swaps'; + +export default function AssetsAutocomplete({ + options, + handleChange, + selectedAsset, + assetsLoading, +}: { + options: AssetConfig[]; + handleChange: (option: AssetConfig | null) => void; + selectedAsset: AssetConfig | null; + assetsLoading: boolean; +}) { + /* eslint-disable @typescript-eslint/no-explicit-any */ + const renderOption = (props: any, option: AssetConfig) => ( +
  • +
    + +
    + + {shortenName(option.symbol, 15)} + + + {shortenName(option.name, 20)} + +
    +
    +
  • + ); + + /* eslint-disable @typescript-eslint/no-explicit-any */ + const renderInput = (params: any) => ( + + {selectedAsset && ( + + )} + {params.InputProps.startAdornment} + + ), + }} + sx={{ + '& .MuiInputBase-input': { + color: 'white', + fontSize: '16px', + fontWeight: 300, + fontFamily: 'inter', + }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '& .MuiSvgIcon-root': { + color: 'white', + }, + }} + /> + ); + + return ( + option.symbol} + renderOption={renderOption} + renderInput={renderInput} + onChange={(_, newValue) => handleChange(newValue)} + value={selectedAsset} + PaperComponent={({ children }) => ( + + {assetsLoading ? ( +
    + +
    + ) : ( + children + )} +
    + )} + /> + ); +} diff --git a/frontend/src/app/(routes)/transfers/components/ChainsList.tsx b/frontend/src/app/(routes)/transfers/components/ChainsList.tsx new file mode 100644 index 000000000..41c901f5b --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/ChainsList.tsx @@ -0,0 +1,121 @@ +import React from 'react'; +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import Avatar from '@mui/material/Avatar'; +import { CircularProgress, Paper } from '@mui/material'; +import { shortenName } from '@/utils/util'; +import { ChainConfig } from '@/types/swaps'; + +interface ChainOption { + label: string; + chainID: string; + logoURI: string; +} + +export default function ChainsList({ + options, + handleChange, + selectedChain, + dataLoading, +}: { + options: ChainConfig[]; + handleChange: (option: ChainOption | null) => void; + selectedChain: ChainConfig | null; + dataLoading: boolean; +}) { + /* eslint-disable @typescript-eslint/no-explicit-any */ + const renderOption = (props: any, option: ChainOption) => ( +
  • +
    + +
    + + {shortenName(option.label, 15)} + + + {shortenName(option.chainID, 15)} + +
    +
    +
  • + ); + + /* eslint-disable @typescript-eslint/no-explicit-any */ + const renderInput = (params: any) => ( + + {selectedChain && ( + + )} + {params.InputProps.startAdornment} + + ), + }} + sx={{ + '& .MuiInputBase-input': { + color: 'white', + fontSize: '16px', + fontWeight: 300, + fontFamily: 'inter', + textTransform: 'capitalize', + }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '& .MuiSvgIcon-root': { + color: 'white', + }, + }} + /> + ); + + return ( +
    + option.label} + renderOption={renderOption} + renderInput={renderInput} + onChange={(_, newValue) => handleChange(newValue)} + value={selectedChain} + PaperComponent={({ children }) => ( + + {dataLoading ? ( +
    + +
    + ) : ( + children + )} +
    + )} + /> +
    + ); +} diff --git a/frontend/src/app/(routes)/transfers/components/IBCSwap.tsx b/frontend/src/app/(routes)/transfers/components/IBCSwap.tsx new file mode 100644 index 000000000..5d42f7100 --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/IBCSwap.tsx @@ -0,0 +1,682 @@ +import { CircularProgress, InputAdornment, TextField } from '@mui/material'; +import Image from 'next/image'; +import React, { useEffect, useState } from 'react'; +import { swapTextFieldStyles } from '../styles'; +import AssetsList from './AssetsList'; +import useGetChains from '@/custom-hooks/useGetChains'; +import useGetAssets from '@/custom-hooks/useGetAssets'; +import useChain from '@/custom-hooks/useChain'; +import { useAppDispatch, useAppSelector } from '@/custom-hooks/StateHooks'; +import { getBalances } from '@/store/features/bank/bankSlice'; +import useAccount from '@/custom-hooks/useAccount'; +import useSwaps from '@/custom-hooks/useSwaps'; +import { + resetTx, + setAmountIn, + setAmountOut, + setDestAsset, + setDestChain, + setFromAddress, + setSourceAsset, + setSourceChain, + setToAddress, + txIBCSwap, +} from '@/store/features/swaps/swapsSlice'; +import ChainsList from './ChainsList'; +import { AssetConfig, ChainConfig } from '@/types/swaps'; +import { TxStatus } from '@/types/enums'; +import { RouteData } from '@0xsquid/sdk'; +import { fromBech32 } from '@cosmjs/encoding'; +import { shortenAddress } from '@/utils/util'; +import { setError } from '@/store/features/common/commonSlice'; +import RoutePreview from './RoutePreview'; + +const emptyBalance = { + amount: 0, + minimalDenom: '', + displayDenom: '', + decimals: 0, + parsedAmount: 0, +}; + +const IBCSwap = () => { + // To fetch all skip supported chains + const { chainsInfo, loading: chainsLoading } = useGetChains(); + + // To fetch all skip supported assets (chain - assets) + const { getTokensByChainID, srcAssetsLoading, destAssetLoading } = + useGetAssets(); + + // To fetch 4 rest endpoints from chain-registry + const { getChainEndpoints, getExplorerEndpoints } = useChain(); + + const { getSwapRoute, routeLoading, routeError } = useSwaps(); + const { getAccountAddress, getAvailableBalance } = useAccount(); + const [otherAddress, setOtherAddress] = useState(false); + const dispatch = useAppDispatch(); + const handleSendToAnotherAddress = () => { + setOtherAddress((prev) => !prev); + }; + + const selectedSourceChain = useAppSelector( + (state) => state.swaps.sourceChain + ); + const selectedSourceAsset = useAppSelector( + (state) => state.swaps.sourceAsset + ); + const selectedDestChain = useAppSelector((state) => state.swaps.destChain); + const selectedDestAsset = useAppSelector((state) => state.swaps.destAsset); + const amountIn = useAppSelector((state) => state.swaps.amountIn); + const amountOut = useAppSelector((state) => state.swaps.amountOut); + const toAddress = useAppSelector((state) => state.swaps.toAddress); + const fromAddress = useAppSelector((state) => state.swaps.fromAddress); + const txStatus = useAppSelector((state) => state.swaps.txStatus.status); + const sourceTxHash = useAppSelector((state) => state.swaps.txSuccess.txHash); + + const balanceStatus = useAppSelector( + (state) => state.bank.balances?.[selectedSourceChain?.chainID || '']?.status + ); + + const [selectedSourceChainAssets, setSelectedSourceChainAssets] = useState< + AssetConfig[] + >([]); + const [selectDestChainAssets, setSelectedDestChainAssets] = useState< + AssetConfig[] + >([]); + const [availableBalance, setAvailableBalance] = useState(emptyBalance); + const [userInputChange, setUserInputChange] = useState(true); + const [receiverAddress, setReceiverAddress] = useState(''); + const [selfReceiverAddress, setSelfReceiverAddress] = useState(''); + const [swapRoute, setSwapRoute] = useState(null); + const [addressValidationError, setAddressValidationError] = useState(''); + const [allInputsProvided, setAllInputsProvided] = useState(false); + + const handleSelectSourceChain = async (option: ChainConfig | null) => { + dispatch(setFromAddress('')); + dispatch(setSourceChain(option)); + + setSelectedSourceChainAssets([]); + dispatch(setSourceAsset(null)); + + dispatch(setAmountIn('')); + dispatch(setAmountOut('')); + + if (!option) { + setAvailableBalance(emptyBalance); + } + + if (option?.chainID) { + const { address } = await getAccountAddress(option?.chainID || ''); + dispatch(setFromAddress(address)); + + // Select assets based on chainID + const assets = await getTokensByChainID(option?.chainID || '', true); + setSelectedSourceChainAssets(assets || []); + + setAvailableBalance(emptyBalance); + const { apis } = getChainEndpoints(option?.chainID || ''); + + // To get all asset balances of address using selected chain + if (address?.length) { + dispatch( + getBalances({ + address: address, + baseURL: apis[0], + baseURLs: apis, + chainID: option?.chainID, + }) + ); + } + } + }; + + const handleSelectSourceAsset = async (option: AssetConfig | null) => { + dispatch(setSourceAsset(option)); + dispatch(setAmountIn('')); + dispatch(setAmountOut('')); + if (option) { + const { balanceInfo } = await getAvailableBalance({ + chainID: selectedSourceChain?.chainID || '', + denom: option?.label || '', + }); + setAvailableBalance(balanceInfo); + } else { + setAvailableBalance(emptyBalance); + } + }; + + const handleSelectDestChain = async (option: ChainConfig | null) => { + dispatch(setToAddress('')); + dispatch(setDestAsset(null)); + dispatch(setAmountOut('')); + dispatch(setDestChain(option)); + if (option?.chainID) { + const { address } = await getAccountAddress(option.chainID); + setSelfReceiverAddress(address); + dispatch(setToAddress(address)); + const assets = await getTokensByChainID(option.chainID, false); + setSelectedDestChainAssets(assets || []); + } else { + setSelectedDestChainAssets([]); + } + }; + + const handleSelectDestAsset = (option: AssetConfig | null) => { + dispatch(setDestAsset(option)); + dispatch(setAmountOut('')); + }; + + const flipChains = async () => { + const tempSelectedSourceChain = selectedSourceChain; + dispatch(setSourceChain(selectedDestChain)); + dispatch(setDestChain(tempSelectedSourceChain)); + + const tempSelectedSourceAsset = selectedSourceAsset; + dispatch(setSourceAsset(selectedDestAsset)); + dispatch(setDestAsset(tempSelectedSourceAsset)); + + const tempFromAddress = fromAddress; + dispatch(setFromAddress(toAddress)); + dispatch(setToAddress(tempFromAddress)); + + handleRotate(); + if (selectedDestChain && selectedDestAsset) { + const { apis } = getChainEndpoints(selectedDestChain?.chainID || ''); + const { address } = await getAccountAddress( + selectedDestChain?.chainID || '' + ); + dispatch( + getBalances({ + address: address, + baseURL: apis[0], + baseURLs: apis, + chainID: selectedDestChain?.chainID || '', + }) + ); + + const { balanceInfo } = await getAvailableBalance({ + chainID: selectedDestChain?.chainID || '', + denom: selectedDestAsset?.label || '', + }); + setAvailableBalance(balanceInfo); + } else { + setAvailableBalance(emptyBalance); + } + }; + + const [isRotated, setIsRotated] = useState(false); + const disableSwapBtn = + txStatus === TxStatus.PENDING || + !allInputsProvided || + routeLoading || + !!routeError; + + const handleRotate = () => { + setIsRotated((prev) => !prev); + }; + + const fetchSwapRoute = async () => { + if ( + selectedDestAsset && + selectedDestChain && + selectedSourceAsset && + selectedSourceChain && + Number(amountIn) + ) { + const amount = amountIn; + const decimals = selectedSourceAsset?.decimals; + const { resAmount, route } = await getSwapRoute({ + amount: Number(amount) * 10 ** (decimals || 1), + destChainID: selectedDestChain?.chainID || '', + destDenom: selectedDestAsset?.denom || '', + sourceChainID: selectedSourceChain?.chainID || '', + sourceDenom: selectedSourceAsset?.denom || '', + fromAddress: fromAddress, + toAddress: toAddress, + }); + setSwapRoute(route); + const resultDecimals = selectedDestAsset?.decimals; + const parsedDestAmount = parseFloat( + (Number(resAmount) / 10.0 ** (resultDecimals || 1)).toFixed(6) + ); + dispatch(setAmountOut(parsedDestAmount.toString())); + } else if (!Number(amountIn)) { + dispatch(setAmountOut('0')); + } + }; + + const handleAmountInChange = ( + e: React.ChangeEvent + ) => { + const input = e.target.value; + if (/^-?\d*\.?\d*$/.test(input)) { + if ((input.match(/\./g) || []).length <= 1) { + dispatch(setAmountIn(input)); + setUserInputChange(true); + } + } + }; + + const handleAddressChange = ( + e: React.ChangeEvent + ) => { + const value = e.target.value; + validateAddress(value); + dispatch(setToAddress(value)); + setReceiverAddress(value); + }; + + const validateAddress = (address: string) => { + if (address.length) { + try { + fromBech32(address); + setAddressValidationError(''); + return true; + } catch (error) { + setAddressValidationError('Invalid recipient address'); + return false; + } + } else { + setAddressValidationError('Please enter address'); + return false; + } + }; + + useEffect(() => { + if (userInputChange) { + fetchSwapRoute(); + setUserInputChange(false); + } + }, [amountIn]); + + useEffect(() => { + if (selectedDestAsset) { + fetchSwapRoute(); + } else { + dispatch(setAmountOut('')); + } + }, [selectedDestAsset]); + + useEffect(() => { + if (receiverAddress && !addressValidationError) { + fetchSwapRoute(); + } + }, [toAddress]); + + const onTxSwap = async () => { + if (otherAddress && addressValidationError) { + dispatch( + setError({ + message: addressValidationError, + type: 'error', + }) + ); + return; + } else if (otherAddress && !receiverAddress.length) { + dispatch( + setError({ + message: 'Please enter the recipient address', + type: 'error', + }) + ); + return; + } + if (swapRoute && allInputsProvided) { + const { rpcs, apis } = getChainEndpoints( + selectedSourceChain?.chainID || '' + ); + const { explorerEndpoint } = getExplorerEndpoints( + selectedSourceChain?.chainID || '' + ); + dispatch( + txIBCSwap({ + rpcURLs: rpcs, + signerAddress: fromAddress, + sourceChainID: selectedSourceChain?.chainID || '', + destChainID: selectedDestChain?.chainID || '', + swapRoute: swapRoute, + explorerEndpoint, + baseURLs: apis, + }) + ); + } + }; + + useEffect(() => { + dispatch(resetTx()); + }, []); + + const validateAllInputs = () => { + const chainsSelected = selectedSourceChain && selectedDestChain; + const assetsSelected = selectedSourceAsset && selectedDestAsset; + const srcAmount = Number(amountIn) ? true : false; + const validReceiverAddress = !otherAddress + ? true + : receiverAddress && !addressValidationError + ? true + : false; + + if (chainsSelected && assetsSelected && srcAmount && validReceiverAddress) { + setAllInputsProvided(true); + } + setAllInputsProvided(false); + }; + + const selectNetworkAlert = () => { + dispatch( + setError({ + message: 'Please select a network', + type: 'error', + }) + ); + }; + + const connectSourceWallet = async () => { + if (selectedSourceChain) { + const { address } = await getAccountAddress( + selectedSourceChain?.chainID || '' + ); + dispatch(setFromAddress(address)); + } else { + selectNetworkAlert(); + } + }; + + const connectDestWallet = async () => { + if (selectedDestChain) { + const { address } = await getAccountAddress( + selectedDestChain?.chainID || '' + ); + dispatch(setToAddress(address)); + } else { + selectNetworkAlert(); + } + }; + + useEffect(() => { + validateAllInputs(); + }, [ + selectedDestAsset, + selectedDestChain, + selectedSourceAsset, + selectedSourceChain, + amountIn, + ]); + + useEffect(() => { + if (!otherAddress) { + dispatch(setToAddress(selfReceiverAddress)); + setReceiverAddress(''); + setAddressValidationError(''); + } + }, [otherAddress]); + + useEffect(() => { + if (!otherAddress && !addressValidationError) { + fetchSwapRoute(); + } + }, [otherAddress, toAddress]); + + useEffect(() => { + if (sourceTxHash?.length && balanceStatus === TxStatus.IDLE) { + const updateBalance = async () => { + const { balanceInfo } = await getAvailableBalance({ + chainID: selectedSourceChain?.chainID || '', + denom: selectedSourceAsset?.label || '', + }); + setAvailableBalance(balanceInfo); + }; + updateBalance(); + } + }, [balanceStatus, sourceTxHash]); + + const [showRoute, setShowRoute] = useState(false); + + return ( +
    +
    +
    +
    +
    +
    From
    +
    + {fromAddress ? ( +
    + {shortenAddress(fromAddress, 20)} +
    + ) : ( + + )} +
    +
    +
    +
    Select Asset *
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    Enter Amount *
    + +
    + {balanceStatus === TxStatus.PENDING && + !availableBalance.parsedAmount && + !availableBalance.displayDenom ? ( + + ) : ( + <> +
    + {availableBalance.parsedAmount || 0} +
    +
    + {availableBalance.displayDenom || '-'} +
    + + )} +
    + + ), + }} + onChange={handleAmountInChange} + /> +
    +
    +
    + Swap +
    +
    +
    +
    To
    +
    + {toAddress ? ( +
    + {shortenAddress(toAddress, 20)} +
    + ) : ( + + )} +
    +
    +
    +
    Select Asset *
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + You will receive + {routeLoading ? ( + + ) : null} +
    + +
    +
    +
    + {otherAddress + ? 'Receive on same wallet' + : 'Receive on another wallet'} +
    +
    +
    + +
    +
    + {showRoute && swapRoute ? ( + setShowRoute(false)} + /> + ) : null} +
    +
    + {!allInputsProvided ? ( + 'Please provide the required fields' + ) : routeLoading ? ( +
    + Fetching route {' '} +
    + ) : routeError ? ( +
    {routeError}
    + ) : ( +
    + {!routeLoading && swapRoute ? ( +
    +
    Route found
    +
    setShowRoute((prev) => !prev)} + > + {showRoute ? 'Close' : 'View route'} +
    +
    + ) : ( + '' + )} +
    + )} +
    +
    + +
    +
    +
    + ); +}; + +export default IBCSwap; diff --git a/frontend/src/app/(routes)/transfers/components/RoutePreview.tsx b/frontend/src/app/(routes)/transfers/components/RoutePreview.tsx new file mode 100644 index 000000000..0d19f9834 --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/RoutePreview.tsx @@ -0,0 +1,91 @@ +import useSwaps from '@/custom-hooks/useSwaps'; +import { CLOSE_ICON_PATH } from '@/utils/constants'; +import { RouteData } from '@0xsquid/sdk'; +import Image from 'next/image'; +import React from 'react'; +import TransferPath from './route-preview/TransferPath'; +import SwapPath from './route-preview/SwapPath'; +import ChainToken from './route-preview/ChainToken'; + +const RoutePreview = ({ + swapRoute, + onClose, +}: { + swapRoute: RouteData; + onClose: () => void; +}) => { + const { getSwapPathData } = useSwaps(); + const { fromChainData, toChainData, pathData } = getSwapPathData(swapRoute); + return ( +
    +
    +
    +
    Route Preview
    + Close onClose()} + /> +
    +
    +
    + +
    +
    + +
    +
    + {pathData.map((path, index) => { + return ( + + {path.type === 'swap' ? ( + + ) : ( + + )} + + ); + })} +
    +
    + +
    +
    +
    +
    + ); +}; + +export default RoutePreview; diff --git a/frontend/src/app/(routes)/transfers/components/TransfersPage.tsx b/frontend/src/app/(routes)/transfers/components/TransfersPage.tsx index 5dd71a2ba..806b12890 100644 --- a/frontend/src/app/(routes)/transfers/components/TransfersPage.tsx +++ b/frontend/src/app/(routes)/transfers/components/TransfersPage.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import MainTopNav from '@/components/MainTopNav'; import TransfersHistory from './TransfersHistory'; import { TRANSFERS_TAB2 } from '../../../../utils/constants'; -import { SINGLE_TAB_TEXT, TRANSFERS_TAB1 } from '@/utils/constants'; +import { TRANSFERS_TAB1 } from '@/utils/constants'; import SingleTransfer from './SingleTransfer'; import MultiTransfer from './MultiTransfer'; import useInitBalances from '@/custom-hooks/useInitBalances'; @@ -12,6 +12,7 @@ import useSortedAssets from '@/custom-hooks/useSortedAssets'; import AuthzToast from '@/components/AuthzToast'; import AuthzExecLoader from '@/components/AuthzExecLoader'; import FeegrantToast from '@/components/FeegrantToast'; +import IBCSwap from './IBCSwap'; export interface TransfersTab { current: string; @@ -47,6 +48,9 @@ const TransfersPage = ({ chainIDs }: { chainIDs: string[] }) => { changeTab(tab); }; + const tabs = ['Send', 'Multi Send', 'Swap']; + const [selectedTab, setSelectedTab] = useState('Send'); + return (
    @@ -54,20 +58,64 @@ const TransfersPage = ({ chainIDs }: { chainIDs: string[] }) => { -
    - {tab.current === SINGLE_TAB_TEXT ? ( - +
    + {tabs.map((tab) => ( +
    +
    { + if ( + tab.toLowerCase() === 'multi send' && + chainIDs.length > 1 + ) { + dispatch( + setError({ + type: 'error', + message: + 'Multi transfer is not available for All networks!', + }) + ); + } else { + setSelectedTab(tab); + } + }} + > + {tab} +
    +
    +
    + ))} +
    +
    + {selectedTab === 'Send' ? ( +
    + +
    + ) : selectedTab === 'Multi Send' ? ( +
    + +
    ) : ( - + )}
    diff --git a/frontend/src/app/(routes)/transfers/components/route-preview/ChainToken.tsx b/frontend/src/app/(routes)/transfers/components/route-preview/ChainToken.tsx new file mode 100644 index 000000000..0d2ef72ea --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/route-preview/ChainToken.tsx @@ -0,0 +1,38 @@ +import Image from 'next/image'; +import React from 'react'; + +const ChainToken = ({ + amount, + chainName, + logo, + symbol, +}: { + logo: string; + amount: string; + symbol: string; + chainName: string; +}) => { + return ( +
    +
    + {chainName} +
    +
    +
    + {amount} {symbol} +
    +
    + On {chainName} +
    +
    +
    + ); +}; + +export default ChainToken; diff --git a/frontend/src/app/(routes)/transfers/components/route-preview/SwapPath.tsx b/frontend/src/app/(routes)/transfers/components/route-preview/SwapPath.tsx new file mode 100644 index 000000000..8d570ff3f --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/route-preview/SwapPath.tsx @@ -0,0 +1,37 @@ +import Image from 'next/image'; +import React from 'react'; + +const SwapPath = ({ + dex, + fromLogo, + fromSymbol, + toLogo, + toSymbol, +}: { + fromLogo: string; + fromSymbol: string; + toLogo: string; + toSymbol: string; + dex: string; +}) => { + return ( +
    +
    Swap
    +
    + + {fromSymbol} +
    +
    for
    +
    + + {toSymbol} +
    +
    + on + {dex} +
    +
    + ); +}; + +export default SwapPath; diff --git a/frontend/src/app/(routes)/transfers/components/route-preview/TransferPath.tsx b/frontend/src/app/(routes)/transfers/components/route-preview/TransferPath.tsx new file mode 100644 index 000000000..f1dd19d5b --- /dev/null +++ b/frontend/src/app/(routes)/transfers/components/route-preview/TransferPath.tsx @@ -0,0 +1,40 @@ +import Image from 'next/image'; +import React from 'react'; + +const TransferPath = ({ + fromLogo, + fromName, + toLogo, + toName, + tokenLogo, + tokenSymbol, +}: { + tokenLogo: string; + tokenSymbol: string; + fromLogo: string; + fromName: string; + toLogo: string; + toName: string; +}) => { + return ( +
    +
    Transfer
    +
    + + {tokenSymbol} +
    +
    from
    +
    + + {fromName} +
    +
    to
    +
    + + {toName} +
    +
    + ); +}; + +export default TransferPath; diff --git a/frontend/src/app/(routes)/transfers/styles.ts b/frontend/src/app/(routes)/transfers/styles.ts index 14af2c623..dfa0fa0ce 100644 --- a/frontend/src/app/(routes)/transfers/styles.ts +++ b/frontend/src/app/(routes)/transfers/styles.ts @@ -2,3 +2,31 @@ export const customDialogPaper = { borderRadius: '24px', background: 'linear-gradient(90deg, #704290 0.11%, #241b61 70.28%)', }; + +export const swapTextFieldStyles = { + '& .MuiTypography-body1': { + color: 'white', + fontSize: '12px', + fontWeight: 200, + }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '& .MuiOutlinedInput-root': { + border: '1px solid transparent', + borderRadius: '12px', + color: 'white', + }, + '& .Mui-focused': { + border: '1px solid #ffffff4a', + borderRadius: '12px', + }, + '& .MuiInputAdornment-root': { + '& button': { + color: 'white', + }, + }, + '& .Mui-disabled': { + WebkitTextFillColor: '#ffffff !important', + }, +}; diff --git a/frontend/src/app/(routes)/transfers/transfers.css b/frontend/src/app/(routes)/transfers/transfers.css index 13c918a04..c4d9f4836 100644 --- a/frontend/src/app/(routes)/transfers/transfers.css +++ b/frontend/src/app/(routes)/transfers/transfers.css @@ -9,7 +9,7 @@ .selected { box-sizing: border-box; - background: linear-gradient(180deg, #4AA29C 0%, #8B3DA7 100%); + background: linear-gradient(180deg, #4aa29c 0%, #8b3da7 100%); } .coloured-container { @@ -33,18 +33,34 @@ .amount-options { @apply text-white text-sm not-italic font-normal leading-[normal] rounded-[100px]; - background: rgba(255, 255, 255, 0.10); + background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(2px); } .amount-options-default { - background: rgba(255, 255, 255, 0.10); + background: rgba(255, 255, 255, 0.1); } .amount-options-fill { background: - linear-gradient(180deg, + linear-gradient( + 180deg, rgba(74, 162, 156, 0.9) 0%, - rgba(139, 61, 167, 0.9) 100%), + rgba(139, 61, 167, 0.9) 100% + ), lightgray 50% / cover no-repeat; -} \ No newline at end of file +} + +.send-menu-item { + @apply cursor-pointer px-2 text-[18px] h-9 flex items-center pb-[14px] leading-[21.7px]; +} + +/* IBC Swap Styles */ + +.swap-btn { + @apply rounded-lg text-[12px] font-medium tracking-[0.48px] py-[10px] px-4 w-full flex justify-center items-center; +} + +.drop-down { + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); +} diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index d825490b6..fb1dd159c 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -1,5 +1,5 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;400&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@100..900&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; @@ -25,6 +25,10 @@ -ms-user-select: none; } +.custom-font { + font-family: 'Inter', sans-serif; +} + .main { @apply leading-[normal] m-0 text-white; background-color: #0b071d; @@ -646,3 +650,12 @@ @apply opacity-80 rounded-lg; background: rgba(255, 255, 255, 0.1); } + +.dialog-box-bg { + background: linear-gradient( + 178deg, + #241b61 1.71%, + #69448d 98.35%, + #69448d 98.35% + ); +} diff --git a/frontend/src/components/IBCSwapTxStatus.tsx b/frontend/src/components/IBCSwapTxStatus.tsx new file mode 100644 index 000000000..21995f236 --- /dev/null +++ b/frontend/src/components/IBCSwapTxStatus.tsx @@ -0,0 +1,167 @@ +import { useAppDispatch, useAppSelector } from '@/custom-hooks/StateHooks'; +import { resetTx, resetTxDestSuccess } from '@/store/features/swaps/swapsSlice'; +import { TxStatus } from '@/types/enums'; +import { + Alert, + AlertTitle, + CircularProgress, + IconButton, + Snackbar, +} from '@mui/material'; +import Link from 'next/link'; +import React, { useEffect, useState } from 'react'; +import TaskAltOutlinedIcon from '@mui/icons-material/TaskAltOutlined'; +import CloseIcon from '@mui/icons-material/Close'; +import CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'; +import { cleanURL } from '@/utils/util'; + +const IBCSwapTxStatus = () => { + const dispatch = useAppDispatch(); + const [showTxSourceSuccess, setTxSourceSuccess] = useState(false); + const [showTxDestSuccess, setTxDestSuccess] = useState(false); + const txLoadRes = useAppSelector((state) => state.swaps.txStatus.status); + const txHash = useAppSelector((state) => state.swaps.txSuccess.txHash); + const explorerUrl = useAppSelector((state) => state.swaps.explorerEndpoint); + const txDestStatus = useAppSelector((state) => state.swaps.txDestSuccess); + + useEffect(() => { + if (txHash?.length) { + setTxSourceSuccess(true); + } else { + setTxSourceSuccess(false); + } + }, [txHash]); + + useEffect(() => { + if (txDestStatus.status.length) { + setTxDestSuccess(true); + } else { + setTxDestSuccess(false); + } + }, [txDestStatus]); + + useEffect(() => { + dispatch(resetTx()); + dispatch(resetTxDestSuccess()); + }, []); + + return ( +
    + + , + }} + onClose={() => { + dispatch(resetTx()); + }} + severity="info" + sx={{ + width: '100%', + backgroundColor: '#0B071D', + borderRadius: '8px', + border: '1px solid #ffffffD0', + }} + action={ + { + dispatch(resetTx()); + }} + sx={{ color: '#fff' }} + > + + + } + > + + Transaction Pending... + + {showTxSourceSuccess ? ( + <> + +
    + +
    + Transaction Broadcasted on Source Chain +
    +
    +
    + + View on explorer + + + ) : null} +
    +
    + + + + ), + }} + onClose={() => { + dispatch(resetTxDestSuccess()); + }} + severity="info" + sx={{ + width: '100%', + backgroundColor: '#0B071D', + borderRadius: '8px', + border: '1px solid #ffffffD0', + }} + action={ + { + dispatch(resetTxDestSuccess()); + }} + sx={{ color: '#fff' }} + > + + + } + > + + {txDestStatus.msg || ''} + + + View on explorer + + + +
    + ); +}; + +export default IBCSwapTxStatus; diff --git a/frontend/src/components/SideBar.tsx b/frontend/src/components/SideBar.tsx index 23d729526..628ac5393 100644 --- a/frontend/src/components/SideBar.tsx +++ b/frontend/src/components/SideBar.tsx @@ -21,10 +21,8 @@ import { } from '@/utils/constants'; // import useInitAuthz from '@/custom-hooks/useInitAuthz'; // import useInitFeegrant from '@/custom-hooks/useInitFeegrant'; -import { - getAllTokensPrice, - setAllNetworksInfo, -} from '@/store/features/common/commonSlice'; +import { getAllTokensPrice, setAllNetworksInfo } from '@/store/features/common/commonSlice'; +import IBCSwapTxStatus from './IBCSwapTxStatus'; const SideBar = ({ children }: { children: React.ReactNode }) => { const pathName = usePathname(); @@ -41,6 +39,7 @@ const SideBar = ({ children }: { children: React.ReactNode }) => { return (
    +
    diff --git a/frontend/src/custom-hooks/useAccount.ts b/frontend/src/custom-hooks/useAccount.ts new file mode 100644 index 000000000..0be46a987 --- /dev/null +++ b/frontend/src/custom-hooks/useAccount.ts @@ -0,0 +1,93 @@ +import { useAppSelector } from './StateHooks'; +import useGetAssets from './useGetAssets'; +import useGetChains from './useGetChains'; + +declare let window: WalletWindow; + +interface CustomChainData extends ChainData { + chainName: string; +} + +const useAccount = () => { + const balances = useAppSelector((state) => state.bank.balances); + const { getTokensByChainID } = useGetAssets(); + const { getChainConfig } = useGetChains(); + const getAccountAddress = async ( + chainID: string + ): Promise<{ address: string }> => { + try { + const account = await window.wallet.getKey(chainID); + return { address: account.bech32Address }; + } catch (error) { + const chainConfig = getChainConfig(chainID); + const chainData: CustomChainData = { + ...chainConfig, + chainName: chainConfig.networkName, + }; + try { + const account = await window.wallet.experimentalSuggestChain(chainData); + return { address: account.bech32Address }; + } catch (error) { + console.log(error); + return { address: '' }; + } + } + }; + + const getAvailableBalance = async ({ + chainID, + denom, + }: { + chainID: string; + denom: string; + }) => { + const chainBalances = balances?.[chainID]?.list || []; + + const balanceInfo = { + amount: 0, + minimalDenom: '', + displayDenom: '', + decimals: 0, + parsedAmount: 0, + }; + + const chainAssets = await getTokensByChainID(chainID, true); + + chainBalances.forEach((balance) => { + const filteredDenomInfo = chainAssets?.filter((denomInfo) => { + return denomInfo.denom === balance.denom; + }); + const denomInfo = filteredDenomInfo[0]; + if (denomInfo && denomInfo.denom === denom) { + balanceInfo.amount = parseFloat(balance.amount); + const precision = denomInfo.decimals || 0 > 6 ? 6 : denomInfo.decimals; + balanceInfo.decimals = denomInfo.decimals || 0; + balanceInfo.displayDenom = denomInfo.symbol || ''; + balanceInfo.minimalDenom = denomInfo.denom; + + balanceInfo.parsedAmount = parseFloat( + (Number(balance.amount) / 10.0 ** (denomInfo.decimals || 0)).toFixed( + precision + ) + ); + } + }); + + if (!balanceInfo.minimalDenom || !balanceInfo.displayDenom) { + const filteredDenomInfo = chainAssets?.filter((denomInfo) => { + return denomInfo.denom === denom; + }); + balanceInfo.minimalDenom = filteredDenomInfo[0].denom || ''; + balanceInfo.displayDenom = filteredDenomInfo[0].symbol || ''; + balanceInfo.decimals = filteredDenomInfo[0].decimals || 0; + } + + return { + balanceInfo, + }; + }; + + return { getAccountAddress, getAvailableBalance }; +}; + +export default useAccount; diff --git a/frontend/src/custom-hooks/useChain.ts b/frontend/src/custom-hooks/useChain.ts new file mode 100644 index 000000000..604c9c271 --- /dev/null +++ b/frontend/src/custom-hooks/useChain.ts @@ -0,0 +1,79 @@ +import { chains } from 'chain-registry'; + +const useChain = () => { + const getChainEndpoints = (chainID: string) => { + const filteredChain = chains.filter((chain) => chain.chain_id === chainID); + const chainData = filteredChain[0]; + const apis: string[] = []; + const rpcs: string[] = []; + chainData?.apis?.rest?.slice(0, 3).forEach((api) => { + apis.push(api.address); + }); + chainData?.apis?.rpc?.slice(0, 3).forEach((rpc) => { + rpcs.push(rpc.address); + }); + return { + apis, + rpcs, + }; + }; + + const getExplorerEndpoints = (chainID: string) => { + if (!chainID.length) { + return { + explorerEndpoint: '', + }; + } + const filteredChain = chains.filter((chain) => chain.chain_id === chainID); + const chainData = filteredChain[0]; + let explorerEndpoint = chainData.explorers?.[0].tx_page || ''; + chainData.explorers?.forEach((explorer) => { + if (explorer.kind?.includes('mintscan')) + explorerEndpoint = explorer.tx_page || ''; + }); + explorerEndpoint = explorerEndpoint ? explorerEndpoint.split('$')[0] : ''; + return { + explorerEndpoint, + }; + }; + + const getChainNameFromID = (chainID: string) => { + if (!chainID.length) { + return { + chainName: '', + }; + } + const filteredChain = chains.filter((chain) => chain.chain_id === chainID); + const chainData = filteredChain[0]; + return { + chainName: chainData.chain_name, + }; + }; + + const getChainLogoURI = (chainID: string) => { + if (!chainID.length) { + return { + chainLogo: '', + }; + } + const filteredChain = chains.filter((chain) => chain.chain_id === chainID); + const chainData = filteredChain[0]; + return { + chainLogo: + chainData.logo_URIs?.svg || + chainData.logo_URIs?.jpeg || + chainData.logo_URIs?.jpeg || + chainData.logo_URIs?.png || + '', + }; + }; + + return { + getChainEndpoints, + getExplorerEndpoints, + getChainNameFromID, + getChainLogoURI, + }; +}; + +export default useChain; diff --git a/frontend/src/custom-hooks/useGetAssets.ts b/frontend/src/custom-hooks/useGetAssets.ts new file mode 100644 index 000000000..100915802 --- /dev/null +++ b/frontend/src/custom-hooks/useGetAssets.ts @@ -0,0 +1,71 @@ +import { AssetConfig } from '@/types/swaps'; +import { useState } from 'react'; +import { TokenData } from '@0xsquid/sdk/dist/types'; +import axios from 'axios'; +import { SQUID_CLIENT_API, SQUID_ID } from '@/utils/constants'; +import { cleanURL } from '@/utils/util'; + +const useGetAssets = () => { + const [srcAssetsLoading, setSrcAssetsLoading] = useState(false); + const [destAssetLoading, setDestAssetsLoading] = useState(false); + + const fetchAssetsInfo = async (chainID: string, isSource: boolean) => { + try { + if (isSource) { + setSrcAssetsLoading(true); + } else { + setDestAssetsLoading(true); + } + const result = await axios.get( + `${cleanURL(SQUID_CLIENT_API)}/v1/tokens?chainId=${chainID}`, + { + headers: { + 'x-integrator-id': SQUID_ID, + }, + } + ); + const assets: TokenData[] = result.data.tokens; + return assets; + } catch (error) { + console.log('error while fetching data', error); + } finally { + if (isSource) { + setSrcAssetsLoading(false); + } else { + setDestAssetsLoading(false); + } + } + }; + + const getTokensByChainID = async (chainID: string, isSource: boolean) => { + if (!chainID?.length) return []; + const assets = await fetchAssetsInfo(chainID, isSource); + const formattedAssets = assets ? getFormattedAssetsList(assets) : []; + return formattedAssets; + }; + return { + getTokensByChainID, + srcAssetsLoading, + destAssetLoading, + }; +}; + +const getFormattedAssetsList = (data: TokenData[]): AssetConfig[] => { + const assetsList = data + .map((asset): AssetConfig => { + return { + symbol: asset.symbol || '', + label: asset.ibcDenom || '', + logoURI: asset.logoURI || '', + denom: asset.ibcDenom || '', + decimals: asset.decimals || 0, + name: asset.name || '', + }; + }) + .sort((assetA, assetB) => { + return assetA.label.localeCompare(assetB.label); + }); + return assetsList; +}; + +export default useGetAssets; diff --git a/frontend/src/custom-hooks/useGetChains.ts b/frontend/src/custom-hooks/useGetChains.ts new file mode 100644 index 000000000..50c7a179f --- /dev/null +++ b/frontend/src/custom-hooks/useGetChains.ts @@ -0,0 +1,63 @@ +import { ChainConfig } from '@/types/swaps'; +import { SQUID_CHAINS_API, SQUID_ID } from '@/utils/constants'; +import axios from 'axios'; +import { useEffect, useState } from 'react'; + +const useGetChains = () => { + const [chainsInfo, setChainInfo] = useState([]); + const [chainsData, setChainsData] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + fetchChainsInfo(); + }, []); + + const fetchChainsInfo = async () => { + try { + const result = await axios.get(SQUID_CHAINS_API, { + headers: { + 'x-integrator-id': SQUID_ID, + }, + }); + const chains: ChainData[] = result.data.chains; + setChainsData(chains); + const chainsData = chains + .filter((chain) => chain.chainType === 'cosmos') // To filter cosmos chains + .map((chain): ChainConfig => { + return { + label: chain.axelarChainName, + logoURI: chain.chainIconURI || '', + chainID: chain.chainId, + }; + }) + .sort((chainA, chainB) => { + return chainA.label.localeCompare(chainB.label); + }); + setChainInfo(chainsData); + } catch (error) { + console.log('error while fetching data', error); + } finally { + setLoading(false); + } + }; + + const getChainConfig = (chainID: string) => { + const chainConfig = chainsData.filter((chain) => chain.chainId === chainID); + return chainConfig[0]; + }; + + const getChainLogoURI = (chainID: string) => { + const chainConfig = getChainConfig(chainID); + const logoURI = chainConfig?.chainIconURI || ''; + return logoURI; + }; + + return { + loading, + chainsInfo, + getChainConfig, + getChainLogoURI, + }; +}; + +export default useGetChains; diff --git a/frontend/src/custom-hooks/useSwaps.ts b/frontend/src/custom-hooks/useSwaps.ts new file mode 100644 index 000000000..0d4ac0fce --- /dev/null +++ b/frontend/src/custom-hooks/useSwaps.ts @@ -0,0 +1,167 @@ +import { useState } from 'react'; +import { + CosmosTransferAction, + GetRoute, + RouteData, + Swap, +} from '@0xsquid/sdk/dist/types'; +import { SWAP_ROUTE_ERROR } from '@/utils/constants'; +import useChain from './useChain'; +import { useAppSelector } from './StateHooks'; +import { SwapPathObject } from '@/types/swaps'; +import useGetChains from './useGetChains'; +import { fetchSwapRoute } from '@/store/features/swaps/swapsService'; + +interface GetRouteInputs { + sourceChainID: string; + sourceDenom: string; + destChainID: string; + destDenom: string; + amount: number; + fromAddress: string; + toAddress: string; +} + +const useSwaps = () => { + const [routeLoading, setRouteLoading] = useState(false); + const [routeError, setRouteError] = useState(''); + const { getChainNameFromID } = useChain(); + const { getChainLogoURI } = useGetChains(); + const fromAmount = useAppSelector((state) => state.swaps.amountIn); + const toAmount = useAppSelector((state) => state.swaps.amountOut); + const getSwapRoute = async ({ + amount, + destChainID, + destDenom, + sourceChainID, + sourceDenom, + fromAddress, + toAddress, + }: GetRouteInputs) => { + const params: GetRoute = { + fromAddress: fromAddress, + fromAmount: amount.toString(), + fromChain: sourceChainID, + fromToken: sourceDenom, + toAddress: toAddress, + toChain: destChainID, + toToken: destDenom, + slippage: 1, + quoteOnly: false, + }; + try { + setRouteLoading(true); + setRouteError(''); + const res = await fetchSwapRoute(params); + setRouteLoading(false); + return { + resAmount: res.route.estimate.toAmount, + route: res.route, + }; + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (error: any) { + if (error?.code === 'ERR_NETWORK') { + console.log(error.message); + setRouteError(error?.message || SWAP_ROUTE_ERROR); + } else { + const errMsg = + error?.response?.data?.errors?.[0]?.message || SWAP_ROUTE_ERROR; + console.log('error occured while fetch route', errMsg); + setRouteError(errMsg || SWAP_ROUTE_ERROR); + } + } finally { + setRouteLoading(false); + } + return { + resAmount: 0, + route: null, + }; + }; + + const getSwapPathData = (swapRoute: RouteData) => { + const pathData: SwapPathObject[] = []; + const fromTokenData = swapRoute.params.fromToken; + const toTokenData = swapRoute.params.toToken; + const fromTokenLogo = fromTokenData.logoURI; + const toTokenLogo = toTokenData.logoURI; + const fromChainId = fromTokenData.chainId; + const toChainId = toTokenData.chainId; + const fromTokenSymbol = fromTokenData.symbol; + const toTokenSymbol = toTokenData.symbol; + const { chainName: fromChainName } = getChainNameFromID( + fromChainId.toString() + ); + const { chainName: toChainName } = getChainNameFromID(toChainId.toString()); + const fromChainRoute = swapRoute.estimate.route.fromChain; + fromChainRoute.forEach((route) => { + if (route.type === 'Swap') { + const routePath = route as Swap; + const pathObject: SwapPathObject = { + type: 'swap', + value: { + dex: routePath.dex, + fromToken: { + symbol: routePath.fromToken.symbol, + logo: routePath.fromToken.logoURI, + }, + toToken: { + symbol: routePath.toToken.symbol, + logo: routePath.toToken.logoURI, + }, + }, + }; + pathData.push(pathObject); + } else if (route.type === 'Transfer') { + const routePath = route as CosmosTransferAction; + const { chainName: fromChainName } = getChainNameFromID( + routePath.fromChain + ); + const { chainName: toChainName } = getChainNameFromID( + routePath.toChain + ); + const fromChainLogo = getChainLogoURI( + routePath.fromToken.chainId.toString() + ); + const toChainLogo = getChainLogoURI( + routePath.toToken.chainId.toString() + ); + const pathObject: SwapPathObject = { + type: 'transfer', + value: { + fromChainName, + toChainName, + tokenLogo: routePath.fromToken.logoURI || routePath.toToken.logoURI, + fromChainLogo, + toChainLogo, + tokenSymbol: routePath.fromToken.symbol || routePath.toToken.symbol, + }, + }; + pathData.push(pathObject); + } + }); + return { + fromChainData: { + tokenLogo: fromTokenLogo, + amount: fromAmount, + tokenSymbol: fromTokenSymbol, + chainName: fromChainName, + }, + toChainData: { + tokenLogo: toTokenLogo, + amount: toAmount, + tokenSymbol: toTokenSymbol, + chainName: toChainName, + }, + pathData, + }; + }; + + return { + getSwapRoute, + getSwapPathData, + routeLoading, + routeError, + }; +}; + +export default useSwaps; diff --git a/frontend/src/store/features/swaps/swapsService.ts b/frontend/src/store/features/swaps/swapsService.ts new file mode 100644 index 000000000..555bf6d5c --- /dev/null +++ b/frontend/src/store/features/swaps/swapsService.ts @@ -0,0 +1,106 @@ +import { TxSwapServiceInputs } from '@/types/swaps'; +import { SQUID_CLIENT_API, SQUID_ID } from '@/utils/constants'; +import { GetRoute, Squid } from '@0xsquid/sdk'; +import { OfflineDirectSigner } from '@cosmjs/proto-signing'; +import { SigningStargateClient } from '@cosmjs/stargate'; +import { TxRaw } from 'cosmjs-types/cosmos/tx/v1beta1/tx'; + +const squidClient = new Squid(); +squidClient.setConfig({ + baseUrl: SQUID_CLIENT_API, + integratorId: SQUID_ID, +}); +squidClient.init(); + +export const txExecuteSwap = async ({ + route, + signer, + signerAddress, +}: TxSwapServiceInputs): Promise => { + try { + const tx = (await squidClient.executeRoute({ + signer: signer, + route: route, + signerAddress: signerAddress, + })) as TxRaw; + return tx; + } catch (error) { + throw error; + } +}; + +export const connectWithSigner = async ( + urls: string[], + offlineSigner: OfflineDirectSigner +) => { + for (const url of urls) { + try { + const signer = await SigningStargateClient.connectWithSigner( + url, + offlineSigner + ); + return signer; + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (error: any) { + console.error(`Error connecting to ${url}: ${error.message}`); + } + } + throw new Error('Unable to connect to any RPC URLs'); +}; + +export const trackTransactionStatus = async ({ + transactionId, + fromChainId, + toChainId, +}: { + transactionId: string; + fromChainId: string; + toChainId: string; +}): Promise => { + const squid = new Squid(); + squid.setConfig({ + baseUrl: SQUID_CLIENT_API, + integratorId: SQUID_ID, + }); + await squid.init(); + + let status: string; + do { + const response = await squid.getStatus({ + transactionId, + integratorId: SQUID_ID, + fromChainId, + toChainId, + }); + status = response.squidTransactionStatus || ''; + if (status === 'ongoing') { + await new Promise((resolve) => setTimeout(resolve, 3000)); + } + } while (status === 'ongoing'); + + return status; +}; + +export const connectStargateClient = async (urls: string[]) => { + for (const url of urls) { + try { + const client = await SigningStargateClient.connect(url); + return client; + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (error: any) { + console.error(`Error connecting to ${url}: ${error.message}`); + } + } + throw new Error('Unable to connect to any RPC URLs'); +}; + +export const fetchSwapRoute = async (params: GetRoute) => { + try { + const res = await squidClient.getRoute(params); + return res; + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (err: any) { + console.error(err.message); + throw new Error(err.message); + } +}; diff --git a/frontend/src/store/features/swaps/swapsSlice.ts b/frontend/src/store/features/swaps/swapsSlice.ts new file mode 100644 index 000000000..987a95222 --- /dev/null +++ b/frontend/src/store/features/swaps/swapsSlice.ts @@ -0,0 +1,227 @@ +'use client'; + +import { TxStatus } from '@/types/enums'; +import { + AssetConfig, + ChainConfig, + SwapState, + TxSwapInputs, +} from '@/types/swaps'; +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { + connectStargateClient, + connectWithSigner, + trackTransactionStatus, + txExecuteSwap, +} from './swapsService'; +import { setError } from '../common/commonSlice'; +import { ERR_UNKNOWN } from '@/utils/errors'; +import { OfflineDirectSigner } from '@cosmjs/proto-signing'; +import { TxRaw } from 'cosmjs-types/cosmos/tx/v1beta1/tx'; +import { getBalances } from '../bank/bankSlice'; + +declare let window: WalletWindow; + +const initialState: SwapState = { + destAsset: null, + destChain: null, + sourceAsset: null, + sourceChain: null, + amountIn: '', + amountOut: '', + fromAddress: '', + toAddress: '', + txStatus: { + status: TxStatus.INIT, + error: '', + }, + txSuccess: { + txHash: '', + }, + txDestSuccess: { + status: '', + msg: '', + }, + explorerEndpoint: '', +}; + +export const txIBCSwap = createAsyncThunk( + 'ibc-swap/txSwap', + async (data: TxSwapInputs, { rejectWithValue, dispatch }) => { + try { + dispatch(setExplorerEndpoint(data.explorerEndpoint)); + dispatch(resetTx()); + dispatch(resetTxDestSuccess()); + const offlineSigner: OfflineDirectSigner = + await window.wallet.getOfflineSigner(data.sourceChainID); + + const signerAddress = (await offlineSigner.getAccounts())[0].address; + + const signer = await connectWithSigner(data.rpcURLs, offlineSigner); + + const executionResponse = await txExecuteSwap({ + route: data.swapRoute, + signer, + signerAddress, + }); + + const client = await connectStargateClient(data.rpcURLs); + + const txResponse = await client.broadcastTx( + Uint8Array.from(TxRaw.encode(executionResponse).finish()) + ); + + dispatch(setTx(txResponse.transactionHash)); + + if (txResponse?.code === 0) { + dispatch( + getBalances({ + address: data.signerAddress, + baseURL: data.baseURLs[0], + baseURLs: data.baseURLs, + chainID: data.sourceChainID, + }) + ); + } + + const txStatus = await trackTransactionStatus({ + transactionId: txResponse.transactionHash, + toChainId: data.destChainID, + fromChainId: data.sourceChainID, + }); + + if (txStatus === 'success') { + dispatch( + setTxDestSuccess({ + msg: 'Transaction Successful', + status: 'success', + }) + ); + } else if (txStatus === 'needs_gas') { + dispatch( + setError({ + message: 'Transaction could not be completed, needs gas', + type: 'error', + }) + ); + } else if (txStatus === 'partial_success') { + dispatch( + setTxDestSuccess({ + msg: 'Transaction Partially Successful', + status: 'partial_success', + }) + ); + } else if (txStatus === 'not_found') { + dispatch( + setError({ + message: 'Transaction not found', + type: 'error', + }) + ); + } + + return txStatus; + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (error: any) { + const errMsg = error?.message || ERR_UNKNOWN; + dispatch( + setError({ + message: errMsg, + type: 'error', + }) + ); + return rejectWithValue(error?.message || ERR_UNKNOWN); + } + } +); + +export const swapsSlice = createSlice({ + name: 'ibc-swap', + initialState, + reducers: { + setSourceChain: (state, action: PayloadAction) => { + state.sourceChain = action.payload; + }, + setSourceAsset: (state, action: PayloadAction) => { + state.sourceAsset = action.payload; + }, + setDestChain: (state, action: PayloadAction) => { + state.destChain = action.payload; + }, + setDestAsset: (state, action: PayloadAction) => { + state.destAsset = action.payload; + }, + setAmountIn: (state, action: PayloadAction) => { + state.amountIn = action.payload; + }, + setAmountOut: (state, action: PayloadAction) => { + state.amountOut = action.payload; + }, + setToAddress: (state, action: PayloadAction) => { + state.toAddress = action.payload; + }, + setFromAddress: (state, action: PayloadAction) => { + state.fromAddress = action.payload; + }, + setExplorerEndpoint: (state, action: PayloadAction) => { + state.explorerEndpoint = action.payload; + }, + resetTxStatus: (state) => { + state.txStatus = { + status: TxStatus.INIT, + error: '', + }; + }, + setTx: (state, action: PayloadAction) => { + state.txSuccess.txHash = action.payload; + }, + resetTx: (state) => { + state.txSuccess.txHash = ''; + }, + setTxDestSuccess: ( + state, + action: PayloadAction<{ status: string; msg: string }> + ) => { + state.txDestSuccess.status = action.payload.status; + state.txDestSuccess.msg = action.payload.msg; + }, + resetTxDestSuccess: (state) => { + state.txDestSuccess.status = ''; + state.txDestSuccess.msg = ''; + }, + }, + extraReducers: (builder) => { + builder + .addCase(txIBCSwap.pending, (state) => { + state.txStatus.status = TxStatus.PENDING; + state.txStatus.error = ''; + }) + .addCase(txIBCSwap.fulfilled, (state) => { + state.txStatus.status = TxStatus.IDLE; + state.txStatus.error = ''; + }) + .addCase(txIBCSwap.rejected, (state, action) => { + state.txStatus.status = TxStatus.REJECTED; + state.txStatus.error = action.error.message || ERR_UNKNOWN; + }); + }, +}); + +export const { + setDestAsset, + setDestChain, + setSourceAsset, + setSourceChain, + setAmountIn, + setAmountOut, + resetTxStatus, + resetTx, + setTx, + setTxDestSuccess, + resetTxDestSuccess, + setFromAddress, + setToAddress, + setExplorerEndpoint, +} = swapsSlice.actions; + +export default swapsSlice.reducer; diff --git a/frontend/src/store/store.ts b/frontend/src/store/store.ts index 713c92aee..58011d9a1 100644 --- a/frontend/src/store/store.ts +++ b/frontend/src/store/store.ts @@ -13,6 +13,7 @@ import ibcSlice from './features/ibc/ibcSlice'; import authzSlice from './features/authz/authzSlice'; import feegrantSlice from './features/feegrant/feegrantSlice'; import recentTransactionsSlice from './features/recent-transactions/recentTransactionsSlice'; +import swapsSlice from './features/swaps/swapsSlice'; export const store = configureStore({ reducer: { @@ -28,6 +29,7 @@ export const store = configureStore({ authz: authzSlice, feegrant: feegrantSlice, recentTransactions: recentTransactionsSlice, + swaps: swapsSlice, }, }); diff --git a/frontend/src/types/squid.d.ts b/frontend/src/types/squid.d.ts new file mode 100644 index 000000000..6e3f30d55 --- /dev/null +++ b/frontend/src/types/squid.d.ts @@ -0,0 +1,60 @@ + + + + +interface NativeCurrency { + name: string; + symbol: string; + decimals: number; + icon: string; +} + +interface ChainNativeContracts { + wrappedNativeToken: string; + ensRegistry: string; + multicall: string; + usdcToken: string; +} + +interface Bridges { + axelar: { + gateway: string; + }; + cctp: { + cctpDomain: number; + tokenMessenger: string; + }; +} + +interface SquidContracts { + squidRouter: string; + defaultCrosschainToken: string; + squidMulticall: string; + squidFeeCollector: string; +} + +interface Compliance { + trmIdentifier: string; +} + +interface ChainData { + axelarChainName: string; + networkIdentifier: string; + chainType: string; + rpc: string; + networkName: string; + chainId: string; + nativeCurrency: NativeCurrency; + swapAmountForGas: string; + sameChainSwapsSupported: boolean; + chainIconURI: string; + blockExplorerUrls: string[]; + chainNativeContracts: ChainNativeContracts; + bridges: Bridges; + squidContracts: SquidContracts; + compliance: Compliance; + estimatedRouteDuration: number; + estimatedBoostRouteDuration: number; + enableBoostByDefault: boolean; +} + diff --git a/frontend/src/types/swaps.d.ts b/frontend/src/types/swaps.d.ts new file mode 100644 index 000000000..4ef6319b0 --- /dev/null +++ b/frontend/src/types/swaps.d.ts @@ -0,0 +1,63 @@ +import { TxStatus } from './enums'; +import { RouteData } from '@0xsquid/sdk'; +import { SigningStargateClient } from '@cosmjs/stargate'; + +interface ChainConfig { + label: string; + logoURI: string; + chainID: string; +} + +interface AssetConfig { + label: string; + symbol: string; + logoURI: string; + denom: string; + decimals: number; + name: string; +} + +interface SwapState { + sourceChain: ChainConfig | null; + sourceAsset: AssetConfig | null; + destChain: ChainConfig | null; + destAsset: AssetConfig | null; + amountIn: string; + amountOut: string; + toAddress: string; + fromAddress: string; + txStatus: { + status: TxStatus; + error: string; + }; + txSuccess: { + txHash: string; + }; + txDestSuccess: { + status: string; + msg: string; + }; + explorerEndpoint: string; +} + +interface TxSwapInputs { + rpcURLs: string[]; + swapRoute: RouteData; + signerAddress: string; + sourceChainID: string; + destChainID: string; + explorerEndpoint: string; + baseURLs: string[]; +} + +interface TxSwapServiceInputs { + signer: SigningStargateClient; + route: RouteData; + signerAddress: string; +} + +interface SwapPathObject { + type: string; + /* eslint-disable @typescript-eslint/no-explicit-any */ + value: any; +} diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index 06c6f4d94..98bb1b077 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -228,6 +228,9 @@ export const AXIOS_RETRIES_COUNT = 2; export const MAX_TRY_END_POINTS = 20; export const NO_FEEGRANTS_BY_ME_TEXT = "You haven't granted any allowance yet"; export const NO_FEEGRANTS_TO_ME_TEXT = "You don't have any feegrants"; +export const SQUID_ID = process.env.NEXT_PUBLIC_SQUID_ID || ''; +export const SQUID_CLIENT_API = 'https://api.0xsquid.com'; +export const SQUID_CHAINS_API = 'https://v2.api.squidrouter.com/v2/chains'; export const ALERT_TYPE_MAP: Record = { success: 'success', error: 'error', @@ -265,3 +268,5 @@ export const COIN_GECKO_IDS: Record = { umars: 'Mars Protocol', ucmdx: 'cmdx', }; + +export const SWAP_ROUTE_ERROR = 'Failed to fetch routes.'; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d1076f2f0..385484fdf 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,6 +2,19 @@ # yarn lockfile v1 +"@0xsquid/sdk@^1.14.15": + version "1.14.15" + resolved "https://registry.yarnpkg.com/@0xsquid/sdk/-/sdk-1.14.15.tgz#ce74445b838a8f1321a96c796940a2106a58ada6" + integrity sha512-MJUoKYnlqqrkUb1h+6tePPL1luf/ppG9fxD2IrTcTuN1Z/2NYfAlF2jd2J+0MpMVKXpSZishzbW3sBFPjPej8Q== + dependencies: + "@cosmjs/cosmwasm-stargate" "^0.32.2" + "@cosmjs/encoding" "^0.32.2" + "@cosmjs/stargate" "^0.32.2" + axios "^0.27.2" + cosmjs-types "^0.9.0" + ethereum-multicall "2.23.0" + ethers "^5.7.1" + "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" @@ -35,42 +48,6 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" -"@axelar-network/axelar-cgp-solidity@^4.5.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-4.5.0.tgz#f0456a2a6665302613a4d5243282ce1b18842348" - integrity sha512-4F4rmHei0cmzeUR7/mW4Bap5rc/KlPV2crD9HA7HTRfl15mVcN6/3z8p+pAm9We6bOrQplNW9KBZ3HJFP3C1Gw== - -"@axelar-network/axelarjs-sdk@^0.13.6": - version "0.13.9" - resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-sdk/-/axelarjs-sdk-0.13.9.tgz#e587728e6a62911c7c20838ed0a074a0d5c04d0d" - integrity sha512-c7UooF1/2V51LAB936GOHRxMtautB7uGXW3QfeEufzoBAPx2Sfx2IB8pT7KHaohdY4zZUI8lVYRNogOVeZhjpg== - dependencies: - "@axelar-network/axelar-cgp-solidity" "^4.5.0" - "@axelar-network/axelarjs-types" "^0.33.0" - "@cosmjs/json-rpc" "^0.30.1" - "@cosmjs/stargate" "0.31.0-alpha.1" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/networks" "^5.7.1" - "@ethersproject/providers" "^5.7.2" - "@types/uuid" "^8.3.1" - bech32 "^2.0.0" - clone-deep "^4.0.1" - cross-fetch "^3.1.5" - ethers "^5.7.2" - socket.io-client "^4.6.1" - standard-http-error "^2.0.1" - string-similarity-js "^2.1.4" - uuid "^8.3.2" - ws "^8.13.0" - -"@axelar-network/axelarjs-types@^0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-types/-/axelarjs-types-0.33.0.tgz#070ffbaec6be57259b64a41ee14f98804907732e" - integrity sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ== - dependencies: - long "^5.2.0" - protobufjs "^7.0.0" - "@babel/code-frame@^7.0.0": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" @@ -121,10 +98,10 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@chain-registry/types@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.17.1.tgz#0ac7bda6178d3917834578627f232a247fe5def8" - integrity sha512-O0CgrtJgIlqXvZm1CqDZe/7jZz068O/uuCIoyDXCegFHK03rdHacKcDGwEIUuI0MNUf8YV3jdE4xHQMSAX+79w== +"@chain-registry/types@^0.18.0", "@chain-registry/types@^0.18.1": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.18.1.tgz#bd926ddf204f2ae986a79b42f0cfe85764e2977a" + integrity sha512-H/UnOyd7WdcWHa2FGKxy4MclDDFrbE2rFwaUh9oubNJOey7UBI4dNF10oZIWM/1by15LUgDz45fVbh6uA6W5Tg== dependencies: "@babel/runtime" "^7.21.0" @@ -136,7 +113,17 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" -"@cosmjs/amino@^0.31.0", "@cosmjs/amino@^0.31.0-alpha.1", "@cosmjs/amino@^0.31.1", "@cosmjs/amino@^0.31.3": +"@cosmjs/amino@0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.27.1.tgz#0910256b5aecd794420bb5f7319d98fc63252fa1" + integrity sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA== + dependencies: + "@cosmjs/crypto" "0.27.1" + "@cosmjs/encoding" "0.27.1" + "@cosmjs/math" "0.27.1" + "@cosmjs/utils" "0.27.1" + +"@cosmjs/amino@0.31.x", "@cosmjs/amino@^0.31.0", "@cosmjs/amino@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.3.tgz#0f4aa6bd68331c71bd51b187fa64f00eb075db0a" integrity sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw== @@ -156,7 +143,17 @@ "@cosmjs/math" "^0.32.2" "@cosmjs/utils" "^0.32.2" -"@cosmjs/cosmwasm-stargate@^0.31.1": +"@cosmjs/amino@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.3.tgz#b81d4a2b8d61568431a1afcd871e1344a19d97ff" + integrity sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA== + dependencies: + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + +"@cosmjs/cosmwasm-stargate@0.31.x", "@cosmjs/cosmwasm-stargate@^0.31.1": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.31.3.tgz#13066822f111832d57c2c5acc9e697ed389713f8" integrity sha512-Uv9TmCn3650gdFeZm7SEfUZF3uX3lfJfFhXOk6I2ZLr/FrKximnlb+vwAfZaZnWYvlA7qrKtHIjeRNHvT23zcw== @@ -173,6 +170,38 @@ long "^4.0.0" pako "^2.0.2" +"@cosmjs/cosmwasm-stargate@^0.32.2": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.3.tgz#26a110a6bb0c15fdeef647e3433bd9553a1acd5f" + integrity sha512-pqkt+QsLIPNMTRh9m+igJgIpzXXgn1BxmxfAb9zlC23kvsuzY/12un9M7iAdim1NwKXDFeYw46xC2YkprwQp+g== + dependencies: + "@cosmjs/amino" "^0.32.3" + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/proto-signing" "^0.32.3" + "@cosmjs/stargate" "^0.32.3" + "@cosmjs/tendermint-rpc" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + cosmjs-types "^0.9.0" + pako "^2.0.2" + +"@cosmjs/crypto@0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.27.1.tgz#271c853089a3baf3acd6cf0b2122fd49f8815743" + integrity sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg== + dependencies: + "@cosmjs/encoding" "0.27.1" + "@cosmjs/math" "0.27.1" + "@cosmjs/utils" "0.27.1" + bip39 "^3.0.2" + bn.js "^5.2.0" + elliptic "^6.5.3" + js-sha3 "^0.8.0" + libsodium-wrappers "^0.7.6" + ripemd160 "^2.0.2" + sha.js "^2.4.11" + "@cosmjs/crypto@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.3.tgz#c752cb6d682fdc735dcb45a2519f89c56ba16c26" @@ -199,7 +228,29 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" -"@cosmjs/encoding@^0.31.0-alpha.1", "@cosmjs/encoding@^0.31.1", "@cosmjs/encoding@^0.31.3": +"@cosmjs/crypto@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.3.tgz#787f8e659709678722068ee1ddf379f65051a25e" + integrity sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ== + dependencies: + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + +"@cosmjs/encoding@0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1" + integrity sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/encoding@0.31.x", "@cosmjs/encoding@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== @@ -217,13 +268,14 @@ bech32 "^1.1.4" readonly-date "^1.0.0" -"@cosmjs/json-rpc@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" - integrity sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ== +"@cosmjs/encoding@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.3.tgz#e245ff511fe4a0df7ba427b5187aab69e3468e5b" + integrity sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w== dependencies: - "@cosmjs/stream" "^0.30.1" - xstream "^11.14.0" + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" "@cosmjs/json-rpc@^0.31.3": version "0.31.3" @@ -241,7 +293,35 @@ "@cosmjs/stream" "^0.32.2" xstream "^11.14.0" -"@cosmjs/math@^0.31.0-alpha.1", "@cosmjs/math@^0.31.1", "@cosmjs/math@^0.31.3": +"@cosmjs/json-rpc@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz#ccffdd7f722cecfab6daaa7463843b92f5d25355" + integrity sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q== + dependencies: + "@cosmjs/stream" "^0.32.3" + xstream "^11.14.0" + +"@cosmjs/launchpad@^0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.27.1.tgz#b6f1995748be96560f5f01e84d3ff907477dda77" + integrity sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw== + dependencies: + "@cosmjs/amino" "0.27.1" + "@cosmjs/crypto" "0.27.1" + "@cosmjs/encoding" "0.27.1" + "@cosmjs/math" "0.27.1" + "@cosmjs/utils" "0.27.1" + axios "^0.21.2" + fast-deep-equal "^3.1.3" + +"@cosmjs/math@0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.27.1.tgz#be78857b008ffc6b1ed6fecaa1c4cd5bc38c07d7" + integrity sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/math@0.31.x", "@cosmjs/math@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.3.tgz#767f7263d12ba1b9ed2f01f68d857597839fd957" integrity sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A== @@ -255,7 +335,14 @@ dependencies: bn.js "^5.2.0" -"@cosmjs/proto-signing@^0.31.0", "@cosmjs/proto-signing@^0.31.0-alpha.1", "@cosmjs/proto-signing@^0.31.1", "@cosmjs/proto-signing@^0.31.3": +"@cosmjs/math@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.3.tgz#16e4256f4da507b9352327da12ae64056a2ba6c9" + integrity sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/proto-signing@0.31.x", "@cosmjs/proto-signing@^0.31.0", "@cosmjs/proto-signing@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz#20440b7b96fb2cd924256a10e656fd8d4481cdcd" integrity sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA== @@ -280,6 +367,18 @@ "@cosmjs/utils" "^0.32.2" cosmjs-types "^0.9.0" +"@cosmjs/proto-signing@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz#91ae149b747d18666a6ccc924165b306431f7c0d" + integrity sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg== + dependencies: + "@cosmjs/amino" "^0.32.3" + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + cosmjs-types "^0.9.0" + "@cosmjs/socket@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.31.3.tgz#52086380f4de2fc3514b90b0484b4b1c4c50e39e" @@ -300,25 +399,17 @@ ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@0.31.0-alpha.1": - version "0.31.0-alpha.1" - resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.0-alpha.1.tgz#85b9d41cd5e73c3b8db73115aa1c9cd6eb5914fd" - integrity sha512-kCTUT3niB2hvcHjhlxpM8cNw1KOVmgZROdJUQaO8Ts4j22OyRZRFdwRPrOIuAKpqhVW2I1vI2HQL9Bg7pk9Glw== +"@cosmjs/socket@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.32.3.tgz#fa5c36bf58e87c0ad865d6318ecb0f8d9c89a28a" + integrity sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA== dependencies: - "@confio/ics23" "^0.6.8" - "@cosmjs/amino" "^0.31.0-alpha.1" - "@cosmjs/encoding" "^0.31.0-alpha.1" - "@cosmjs/math" "^0.31.0-alpha.1" - "@cosmjs/proto-signing" "^0.31.0-alpha.1" - "@cosmjs/stream" "^0.31.0-alpha.1" - "@cosmjs/tendermint-rpc" "^0.31.0-alpha.1" - "@cosmjs/utils" "^0.31.0-alpha.1" - cosmjs-types "^0.8.0" - long "^4.0.0" - protobufjs "~6.11.3" + "@cosmjs/stream" "^0.32.3" + isomorphic-ws "^4.0.1" + ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@^0.31.1", "@cosmjs/stargate@^0.31.3": +"@cosmjs/stargate@0.31.x", "@cosmjs/stargate@^0.31.1", "@cosmjs/stargate@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.3.tgz#a2b38e398097a00f897dbd8f02d4d347d8fed818" integrity sha512-53NxnzmB9FfXpG4KjOUAYAvWLYKdEmZKsutcat/u2BrDXNZ7BN8jim/ENcpwXfs9/Og0K24lEIdvA4gsq3JDQw== @@ -336,7 +427,7 @@ protobufjs "~6.11.3" xstream "^11.14.0" -"@cosmjs/stargate@^0.32.1": +"@cosmjs/stargate@^0.32.1", "@cosmjs/stargate@^0.32.2": version "0.32.2" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.2.tgz#73718c5c6a3ae138682ee9987333d911eca22a13" integrity sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg== @@ -352,14 +443,23 @@ cosmjs-types "^0.9.0" xstream "^11.14.0" -"@cosmjs/stream@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" - integrity sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ== +"@cosmjs/stargate@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.3.tgz#5a92b222ada960ebecea72cc9f366370763f4b66" + integrity sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w== dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/proto-signing" "^0.32.3" + "@cosmjs/stream" "^0.32.3" + "@cosmjs/tendermint-rpc" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + cosmjs-types "^0.9.0" xstream "^11.14.0" -"@cosmjs/stream@^0.31.0-alpha.1", "@cosmjs/stream@^0.31.3": +"@cosmjs/stream@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.31.3.tgz#53428fd62487ec08fc3886a50a3feeb8b2af2e66" integrity sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w== @@ -373,7 +473,14 @@ dependencies: xstream "^11.14.0" -"@cosmjs/tendermint-rpc@^0.31.0-alpha.1", "@cosmjs/tendermint-rpc@^0.31.1", "@cosmjs/tendermint-rpc@^0.31.3": +"@cosmjs/stream@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.3.tgz#7522579aaf18025d322c2f33d6fb7573220395d6" + integrity sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw== + dependencies: + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@0.31.x", "@cosmjs/tendermint-rpc@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz#d1a2bc5b3c98743631c9b55888589d352403c9b3" integrity sha512-s3TiWkPCW4QceTQjpYqn4xttUJH36mTPqplMl+qyocdqk5+X5mergzExU/pHZRWQ4pbby8bnR7kMvG4OC1aZ8g== @@ -405,7 +512,28 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@^0.31.0-alpha.1", "@cosmjs/utils@^0.31.3": +"@cosmjs/tendermint-rpc@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz#f0406b9f0233e588fb924dca8c614972f9038aff" + integrity sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw== + dependencies: + "@cosmjs/crypto" "^0.32.3" + "@cosmjs/encoding" "^0.32.3" + "@cosmjs/json-rpc" "^0.32.3" + "@cosmjs/math" "^0.32.3" + "@cosmjs/socket" "^0.32.3" + "@cosmjs/stream" "^0.32.3" + "@cosmjs/utils" "^0.32.3" + axios "^1.6.0" + readonly-date "^1.0.0" + xstream "^11.14.0" + +"@cosmjs/utils@0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2" + integrity sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg== + +"@cosmjs/utils@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== @@ -415,6 +543,11 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.2.tgz#324304aa85bfa6f10561cc17781d824d02130897" integrity sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q== +"@cosmjs/utils@^0.32.3": + version "0.32.3" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.3.tgz#5dcaee6dd7cc846cdc073e9a7a7f63242f5f7e31" + integrity sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg== + "@date-io/core@^2.15.0", "@date-io/core@^2.17.0": version "2.17.0" resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.17.0.tgz#360a4d0641f069776ed22e457876e8a8a58c205e" @@ -783,7 +916,7 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0", "@ethersproject/networks@^5.7.1": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== @@ -805,7 +938,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.0.10": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -1120,17 +1253,7 @@ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz#148e96dfd6e68747da41a311b9ee4559bb1b1471" integrity sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg== -"@injectivelabs/core-proto-ts@^0.0.18": - version "0.0.18" - resolved "https://registry.yarnpkg.com/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.18.tgz#aa60ffde2b52cbbf80a18ba77833ecad605d8fd6" - integrity sha512-WSZS7SQ+I/m8jdc7fhzkMTUhA7i5nVTeKbN6QGqKmOwQ/F+PqM75vDHD9Y9NbLPx9P+m7hyUzSHz4zmajth5jw== - dependencies: - "@injectivelabs/grpc-web" "^0.0.1" - google-protobuf "^3.14.0" - protobufjs "^7.0.0" - rxjs "^7.4.0" - -"@injectivelabs/core-proto-ts@^0.0.21": +"@injectivelabs/core-proto-ts@0.0.x", "@injectivelabs/core-proto-ts@^0.0.21": version "0.0.21" resolved "https://registry.yarnpkg.com/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz#b52d4bee7556ce57c7c7e2c1ec7f6b920b4c2ffd" integrity sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ== @@ -1150,13 +1273,13 @@ protobufjs "^7.0.0" rxjs "^7.4.0" -"@injectivelabs/exceptions@^1.14.5": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/exceptions/-/exceptions-1.14.5.tgz#3ee2cb89f591c83bd325487511b3b553b19602d8" - integrity sha512-WQ+hxpKz4g4+ZXNTXLFKpf9D9uosleZLqC++2+wK81IQ/lcwi5GrTLYdasOhJeu3c+LKWxHQRHJfSsvt8TQWbA== +"@injectivelabs/exceptions@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz#86f93815eb6bc60902c43072b8e212146d78614e" + integrity sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ== dependencies: "@injectivelabs/grpc-web" "^0.0.1" - "@injectivelabs/ts-types" "^1.14.5" + "@injectivelabs/ts-types" "^1.14.6" http-status-codes "^2.2.0" link-module-alias "^1.2.0" shx "^0.3.2" @@ -1178,67 +1301,67 @@ dependencies: browser-headers "^0.4.1" -"@injectivelabs/indexer-proto-ts@1.11.32": - version "1.11.32" - resolved "https://registry.yarnpkg.com/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.32.tgz#a91d9368ca9a3a782bbe9722762f8d7d754ebafd" - integrity sha512-gCkbMlBq34MY2xZcauDEsCP0h5l/FgKMwCgJ8aWGaTkh27XBWpl1zvlreuWg/IpSvTPJZBoADW9KqixqyoBdJw== +"@injectivelabs/indexer-proto-ts@1.11.36": + version "1.11.36" + resolved "https://registry.yarnpkg.com/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz#4a1476e52a5003a077b30a22679272eb9dd18d7a" + integrity sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew== dependencies: "@injectivelabs/grpc-web" "^0.0.1" google-protobuf "^3.14.0" protobufjs "^7.0.0" rxjs "^7.4.0" -"@injectivelabs/mito-proto-ts@1.0.55": - version "1.0.55" - resolved "https://registry.yarnpkg.com/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.55.tgz#78cc7a11ea4a433f3897ec5acc48d62ccf42cad6" - integrity sha512-clFKpU/LCYvYiPg5PRjhVJFTxKcfJHzaj5saJHuL32LaOaB3Rd8L3CqP9qUrg78L7eKjjXjyG97U3NdRdZBlWg== +"@injectivelabs/mito-proto-ts@1.0.62": + version "1.0.62" + resolved "https://registry.yarnpkg.com/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz#45fc0746af7d1b283625816caeb9fff9887e050f" + integrity sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA== dependencies: "@injectivelabs/grpc-web" "^0.0.1" google-protobuf "^3.14.0" protobufjs "^7.0.0" rxjs "^7.4.0" -"@injectivelabs/networks@^1.14.5": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/networks/-/networks-1.14.5.tgz#4d7536fede8edcc24ecbd2bceeca11affa7d24e9" - integrity sha512-9GINd/pPBX6Jyc26pmlLC54s7nLlXsBLZ/1fo8a0nvHkrrODRDE4IldP6KsA9OLVomMPk5TyBUgYLGgM3ST9GA== +"@injectivelabs/networks@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/networks/-/networks-1.14.6.tgz#29be5e81e60d725a0eef2db2c9b6ba0b4588141b" + integrity sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ== dependencies: - "@injectivelabs/exceptions" "^1.14.5" - "@injectivelabs/ts-types" "^1.14.5" - "@injectivelabs/utils" "^1.14.5" + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" link-module-alias "^1.2.0" shx "^0.3.2" -"@injectivelabs/sdk-ts@^1.12.1": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/sdk-ts/-/sdk-ts-1.14.5.tgz#75f4723da8a5c697f1fc04eec19529788a317c93" - integrity sha512-j/6EcvNgQn563L0P5x80cZDTbYYbsXmHgtIbj8DCzemzgPRadmZLtlMDBjMQZ0ZcMhDSMfVOCINBOB2bBz2qMw== +"@injectivelabs/sdk-ts@1.x": + version "1.14.7" + resolved "https://registry.yarnpkg.com/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz#16e84cecb14fe796314f8f616567511e1030f043" + integrity sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg== dependencies: "@apollo/client" "^3.5.8" - "@cosmjs/amino" "^0.31.3" - "@cosmjs/proto-signing" "^0.31.3" - "@cosmjs/stargate" "^0.31.3" + "@cosmjs/amino" "^0.32.2" + "@cosmjs/proto-signing" "^0.32.2" + "@cosmjs/stargate" "^0.32.2" "@ensdomains/ens-validation" "^0.1.0" "@ensdomains/eth-ens-namehash" "^2.0.15" "@ethersproject/bytes" "^5.7.0" "@injectivelabs/core-proto-ts" "^0.0.21" "@injectivelabs/dmm-proto-ts" "1.0.19" - "@injectivelabs/exceptions" "^1.14.5" + "@injectivelabs/exceptions" "^1.14.6" "@injectivelabs/grpc-web" "^0.0.1" "@injectivelabs/grpc-web-node-http-transport" "^0.0.2" "@injectivelabs/grpc-web-react-native-transport" "^0.0.2" - "@injectivelabs/indexer-proto-ts" "1.11.32" - "@injectivelabs/mito-proto-ts" "1.0.55" - "@injectivelabs/networks" "^1.14.5" + "@injectivelabs/indexer-proto-ts" "1.11.36" + "@injectivelabs/mito-proto-ts" "1.0.62" + "@injectivelabs/networks" "^1.14.6" "@injectivelabs/test-utils" "^1.14.3" - "@injectivelabs/token-metadata" "^1.14.5" - "@injectivelabs/ts-types" "^1.14.5" - "@injectivelabs/utils" "^1.14.5" + "@injectivelabs/token-metadata" "^1.14.7" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" "@metamask/eth-sig-util" "^4.0.0" axios "^0.27.2" bech32 "^2.0.0" bip39 "^3.0.4" - cosmjs-types "^0.7.1" + cosmjs-types "^0.9.0" ethereumjs-util "^7.1.4" ethers "^5.7.2" google-protobuf "^3.21.0" @@ -1264,15 +1387,15 @@ snakecase-keys "^5.1.2" store2 "^2.12.0" -"@injectivelabs/token-metadata@^1.14.5": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/token-metadata/-/token-metadata-1.14.5.tgz#73552e3e78e5d15f5317a05a5812d0be3647e38d" - integrity sha512-GiIiNDixfvbfEjzZG7ixtGYmJllFIcA2Xl1LnsK5yawT8Q+/SoSIJig4tE+0CC/AaGHS1GxDKySrIdMse7PZ0w== +"@injectivelabs/token-metadata@^1.14.7": + version "1.14.7" + resolved "https://registry.yarnpkg.com/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz#0adba14e76e8882dc13a6a488ced0762fd888ae3" + integrity sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw== dependencies: - "@injectivelabs/exceptions" "^1.14.5" - "@injectivelabs/networks" "^1.14.5" - "@injectivelabs/ts-types" "^1.14.5" - "@injectivelabs/utils" "^1.14.5" + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/networks" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" + "@injectivelabs/utils" "^1.14.6" "@types/lodash.values" "^4.3.6" copyfiles "^2.4.1" jsonschema "^1.4.0" @@ -1281,21 +1404,21 @@ lodash.values "^4.3.0" shx "^0.3.2" -"@injectivelabs/ts-types@^1.14.5": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/ts-types/-/ts-types-1.14.5.tgz#e7ed5fa87052b0763908bd77b132775aa37a097c" - integrity sha512-dwmEJE90vMr1zkQhz5lX2280sBMe2GvAj98vOHoL2RLTo0OQkJZrirUHwsTkexJf7sFZIT2PlmLCfix9Ulcp5A== +"@injectivelabs/ts-types@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz#917a14c8fed81c683bc7dece3ec254388123a10e" + integrity sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw== dependencies: link-module-alias "^1.2.0" shx "^0.3.2" -"@injectivelabs/utils@^1.14.5": - version "1.14.5" - resolved "https://registry.yarnpkg.com/@injectivelabs/utils/-/utils-1.14.5.tgz#4fe9055c2c36f6f09faed9a95e2d77ae8daaf71f" - integrity sha512-L2ul/7rgop8RLJBhlXjt6Q/A6fXeRZ3hhCZFXGXmA63vz9RSqOFHILiRp6hAFsuZbiITjmVx0eubFPaQU0MymA== +"@injectivelabs/utils@^1.14.6": + version "1.14.6" + resolved "https://registry.yarnpkg.com/@injectivelabs/utils/-/utils-1.14.6.tgz#1e5c60973f9b2bb1a0334a0cd5b3f56377904472" + integrity sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg== dependencies: - "@injectivelabs/exceptions" "^1.14.5" - "@injectivelabs/ts-types" "^1.14.5" + "@injectivelabs/exceptions" "^1.14.6" + "@injectivelabs/ts-types" "^1.14.6" axios "^0.21.1" bignumber.js "^9.0.1" http-status-codes "^2.2.0" @@ -1348,6 +1471,21 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@keplr-wallet/types@0.12.72": + version "0.12.72" + resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.12.72.tgz#0e7d35a0c4f6758aa4c89d8b2044f388031692e3" + integrity sha512-gDP+NCPa4seTT1xU9bkIKbMw7N/LPla9/4/amDLIGyFb6OEjfnFkRuReI/cZe/8aEvlkYAKnfB0UMipHobsn5g== + dependencies: + long "^4.0.0" + +"@keplr-wallet/types@^0.11.12": + version "0.11.64" + resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.11.64.tgz#5a308c8c019b4e18f894e0f35f0904b60134d605" + integrity sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ== + dependencies: + axios "^0.27.2" + long "^4.0.0" + "@keplr-wallet/types@^0.12.39": version "0.12.63" resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.12.63.tgz#684b018d0b9fd9f9eee79eb530f2306dfc9dedfc" @@ -1355,6 +1493,15 @@ dependencies: long "^4.0.0" +"@keplr-wallet/unit@^0.12.67": + version "0.12.72" + resolved "https://registry.yarnpkg.com/@keplr-wallet/unit/-/unit-0.12.72.tgz#8a818be8d271acfe127dc029ef9c85b3be4bdb9c" + integrity sha512-egrh0L/uo6MQrAfVi1V8GQB1eml1ZbfWDiv5gpU6AkeAte4Q1DIe8qkYqeJOJ+KW1TurnxDw9L+9/T/i4Lu8Jg== + dependencies: + "@keplr-wallet/types" "0.12.72" + big-integer "^1.6.48" + utility-types "^3.10.0" + "@kurkle/color@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" @@ -1697,32 +1844,26 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@skip-router/core@^1.1.1": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@skip-router/core/-/core-1.2.7.tgz#9be82f5ef9fae57684dd6312f7d3b8bc0eec7a48" - integrity sha512-Zbz7wH57yJPU2hJ3DICnCDDxFYYqWq9aF4yCTAOTMdOA6HPx6EJqiO2xAaSsN6OwtkTazNqUCkZ0MS41r0Kyjw== - dependencies: - "@axelar-network/axelarjs-sdk" "^0.13.6" - "@cosmjs/amino" "^0.31.1" - "@cosmjs/cosmwasm-stargate" "^0.31.1" - "@cosmjs/encoding" "^0.31.1" - "@cosmjs/math" "^0.31.1" - "@cosmjs/proto-signing" "^0.31.1" - "@cosmjs/stargate" "^0.31.1" - "@cosmjs/tendermint-rpc" "^0.31.1" - "@injectivelabs/core-proto-ts" "^0.0.18" - "@injectivelabs/sdk-ts" "^1.12.1" - axios "^1.4.0" - chain-registry "^1.25.4" - cosmjs-types "^0.8.0" - faker "^6.6.6" - keccak256 "^1.0.6" - viem "^1.12.2" - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== +"@skip-router/core@^1.3.11": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@skip-router/core/-/core-1.3.11.tgz#f59ecfae353ecb5cc74165c1b9f543e4001c9f33" + integrity sha512-lStTsB1F/ODhyrkh6kpPT+FrnbjgCmBhm0aKv7F8zI2Y8KHNdNtsB8dQlPHs4tidjHr1e2QkHRsaiwkLRyt6Hw== + dependencies: + "@cosmjs/amino" "0.31.x" + "@cosmjs/cosmwasm-stargate" "0.31.x" + "@cosmjs/encoding" "0.31.x" + "@cosmjs/math" "0.31.x" + "@cosmjs/proto-signing" "0.31.x" + "@cosmjs/stargate" "0.31.x" + "@cosmjs/tendermint-rpc" "0.31.x" + "@injectivelabs/core-proto-ts" "0.0.x" + "@injectivelabs/sdk-ts" "1.x" + "@keplr-wallet/unit" "^0.12.67" + axios "1.x" + cosmjs-types "0.8.x" + keccak256 "1.x" + kujira.js "0.9.x" + viem "1.x" "@swc/helpers@0.5.2": version "0.5.2" @@ -1745,6 +1886,11 @@ dependencies: "@types/node" "*" +"@types/google-protobuf@^3.15.6": + version "3.15.12" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b" + integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ== + "@types/hoist-non-react-statics@^3.3.1": version "3.3.5" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" @@ -1875,11 +2021,6 @@ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== -"@types/uuid@^8.3.1": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@typescript-eslint/eslint-plugin@^6.9.1": version "6.19.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz#bb0676af940bc23bf299ca58dbdc6589c2548c2e" @@ -2215,6 +2356,15 @@ axios-retry@^4.0.0: dependencies: is-retry-allowed "^2.2.0" +axios@1.x: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axios@^0.21.1, axios@^0.21.2: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -2230,7 +2380,7 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@^1.4.0, axios@^1.5.1, axios@^1.6.0: +axios@^1.5.1, axios@^1.6.0: version "1.6.5" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== @@ -2287,6 +2437,11 @@ bech32@^2.0.0: resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== +big-integer@^1.6.48: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bignumber.js@^9.0.1, bignumber.js@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" @@ -2297,7 +2452,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bip39@^3.0.4: +bip39@^3.0.2, bip39@^3.0.4: version "3.1.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A== @@ -2438,13 +2593,21 @@ caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565, caniuse-lite@^1.0.300015 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz#45c065216110f46d6274311a4b3fcf6278e0852a" integrity sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA== -chain-registry@^1.25.4: - version "1.25.4" - resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.25.4.tgz#6d1546cd6070201809ba255924a407ad71116311" - integrity sha512-QxBSg4lLR4CXqDgratAAqelw3K/WdROKNvq+IThuirXMfCcuL6wNPVunlvz3gPPdnyAA6D+dSZ4ky4ZWavDcOg== +chain-registry@1.28.1: + version "1.28.1" + resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.28.1.tgz#3aa6fd1199e06e1e95fe6a53b55076962effb980" + integrity sha512-WYFhulujAss5llO75CAoLVbMs+EmiYH6N/+XAtV2xBCI0V8eI2yBxHI93w9YsagizE8Ew9wCuNZk8QdAXPNHtg== dependencies: "@babel/runtime" "^7.21.0" - "@chain-registry/types" "^0.17.1" + "@chain-registry/types" "^0.18.0" + +chain-registry@^1.27.0: + version "1.28.7" + resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.28.7.tgz#c4efa2a3a10e71c45166a6f03d58593683d08d02" + integrity sha512-XsLGriPOonROPOD069KkZEuORw4ngJf2ntME4dbuavh4B3asYwXWK4oak0kGR2fQC2GI0vnBuWNs4dEGuH5njA== + dependencies: + "@babel/runtime" "^7.21.0" + "@chain-registry/types" "^0.18.1" chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -2522,15 +2685,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -2642,15 +2796,7 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cosmjs-types@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.7.2.tgz#a757371abd340949c5bd5d49c6f8379ae1ffd7e2" - integrity sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA== - dependencies: - long "^4.0.0" - protobufjs "~6.11.2" - -cosmjs-types@^0.8.0: +cosmjs-types@0.8.x, cosmjs-types@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.8.0.tgz#2ed78f3e990f770229726f95f3ef5bf9e2b6859b" integrity sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg== @@ -2686,13 +2832,6 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2731,7 +2870,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2858,6 +2997,19 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2868,22 +3020,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -engine.io-client@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" - integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" - integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== - enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -3240,6 +3376,14 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-multicall@2.23.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/ethereum-multicall/-/ethereum-multicall-2.23.0.tgz#9f39e80cae6d6d587b5f64d1e78152add32bb5b3" + integrity sha512-KVboRQSXzJ/czaD9UXIuYFKF9YwDsWORGDDRNyOtkBRYg7TUk2RkmqLcu/+uXUemdb3+XRcAU7c8bfdfOGfoiQ== + dependencies: + "@ethersproject/providers" "^5.0.10" + ethers "^5.0.15" + ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" @@ -3272,7 +3416,7 @@ ethereumjs-util@^7.1.4: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.7.2: +ethers@^5.0.15, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -3329,11 +3473,6 @@ extend@^3.0.0: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -faker@^6.6.6: - version "6.6.6" - resolved "https://registry.yarnpkg.com/faker/-/faker-6.6.6.tgz#e9529da0109dca4c7c5dbfeaadbd9234af943033" - integrity sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3947,13 +4086,6 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4040,11 +4172,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -4149,7 +4276,7 @@ jsonschema@^1.4.0, jsonschema@^1.4.1: object.assign "^4.1.4" object.values "^1.1.6" -keccak256@^1.0.6: +keccak256@1.x, keccak256@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58" integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== @@ -4174,10 +4301,22 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kujira.js@0.9.x: + version "0.9.150" + resolved "https://registry.yarnpkg.com/kujira.js/-/kujira.js-0.9.150.tgz#4b4e003d07518aa097e5a813767443abd0eb2f61" + integrity sha512-F/xEFgHAh9KG+yw3FhasTADN1l8BnojJTjk6bDm0NFNqHyDYWuamu/zUuDeYT3RietDBdHKI1qEfmbw+svzb+g== + dependencies: + "@cosmjs/cosmwasm-stargate" "^0.31.1" + "@cosmjs/launchpad" "^0.27.1" + "@cosmjs/stargate" "^0.31.1" + "@ethersproject/bignumber" "^5.7.0" + "@keplr-wallet/types" "^0.11.12" + "@types/google-protobuf" "^3.15.6" + chain-registry "^1.27.0" + cosmjs-types "^0.8.0" + long "^4.0.0" + text-encoding "^0.7.0" + yarn "^1.22.19" language-subtag-registry@^0.3.20: version "0.3.22" @@ -4211,6 +4350,18 @@ libsodium-wrappers-sumo@^0.7.11: dependencies: libsodium-sumo "^0.7.13" +libsodium-wrappers@^0.7.6: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== + dependencies: + libsodium "^0.7.13" + +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== + lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -4260,7 +4411,7 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -long@^5.0.0, long@^5.2.0, long@^5.2.3: +long@^5.0.0, long@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== @@ -4512,13 +4663,6 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-gyp-build@^4.2.0: version "4.8.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" @@ -5196,7 +5340,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -5317,7 +5461,7 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -sha.js@^2.4.0, sha.js@^2.4.8: +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -5325,13 +5469,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - sharp@^0.33.1: version "0.33.2" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.2.tgz#fcd52f2c70effa8a02160b1bfd989a3de55f2dfb" @@ -5433,24 +5570,6 @@ snakecase-keys@^5.1.2, snakecase-keys@^5.4.1: snake-case "^3.0.4" type-fest "^3.12.0" -socket.io-client@^4.6.1: - version "4.7.4" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.4.tgz#5f0e060ff34ac0a4b4c5abaaa88e0d1d928c64c8" - integrity sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.5.2" - socket.io-parser "~4.2.4" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -5466,18 +5585,6 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== -"standard-error@>= 1.1.0 < 2": - version "1.1.0" - resolved "https://registry.yarnpkg.com/standard-error/-/standard-error-1.1.0.tgz#23e5168fa1c0820189e5812701a79058510d0d34" - integrity sha512-4v7qzU7oLJfMI5EltUSHCaaOd65J6S4BqKRWgzMi4EYaE5fvNabPxmAPGdxpGXqrcWjhDGI/H09CIdEuUOUeXg== - -standard-http-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/standard-http-error/-/standard-http-error-2.0.1.tgz#f8ae9172e3cef9cb38d2e7084a1925f57a7c34bd" - integrity sha512-DX/xPIoyXQTuY6BMZK4Utyi4l3A4vFoafsfqrU6/dO4Oe/59c7PyqPd2IQj9m+ZieDg2K3RL9xOYJsabcD9IUA== - dependencies: - standard-error ">= 1.1.0 < 2" - store2@^2.12.0: version "2.14.2" resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" @@ -5488,12 +5595,8 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string-similarity-js@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/string-similarity-js/-/string-similarity-js-2.1.4.tgz#73716330691946f2ebc435859aba8327afd31307" - integrity sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA== - "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5697,6 +5800,11 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +text-encoding@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" + integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5754,11 +5862,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - trough@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" @@ -6266,10 +6369,10 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== vfile-message@^2.0.0: version "2.0.4" @@ -6289,7 +6392,7 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -viem@^1.12.2: +viem@1.x: version "1.21.4" resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== @@ -6308,19 +6411,6 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -6379,6 +6469,7 @@ which@^2.0.1: isexe "^2.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6416,21 +6507,6 @@ ws@^7: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.13.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== - -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - xstream@^11.14.0: version "11.14.0" resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" @@ -6489,6 +6565,11 @@ yargs@^16.1.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yarn@^1.22.19: + version "1.22.21" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.21.tgz#1959a18351b811cdeedbd484a8f86c3cc3bbaf72" + integrity sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"