diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b53fd77b..daef60b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,9 +3,9 @@ name: ci on: # Triggers the workflow on push or pull request events but only for the main branch push: - branches: [main, nautilus, nexus] + branches: [main, nautilus, nexus, injective] pull_request: - branches: [main, nautilus, nexus] + branches: [main, nautilus, nexus, injective] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/CUSTOMIZE.md b/CUSTOMIZE.md index 21b75ed5..682c7913 100644 --- a/CUSTOMIZE.md +++ b/CUSTOMIZE.md @@ -33,7 +33,7 @@ The logo images you should change are: - `./src/images/logos/app-logo.svg` - `./src/images/logos/app-name.svg` -- `./src/images/logos/app-title.png` +- `./src/images/logos/app-title.svg` These are images are primarily used in the header and footer files: diff --git a/package.json b/package.json index 0f0c15e2..5367a54e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@hyperlane-xyz/warp-ui-template", "description": "A web app template for building Hyperlane Warp Route UIs", - "version": "3.5.1", + "version": "3.6.1", "author": "J M Rossy", "dependencies": { "@chakra-ui/next-js": "^2.1.5", @@ -16,8 +16,8 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@headlessui/react": "^1.7.14", - "@hyperlane-xyz/sdk": "^3.5.1", - "@hyperlane-xyz/utils": "^3.5.1", + "@hyperlane-xyz/sdk": "^3.6.1", + "@hyperlane-xyz/utils": "^3.6.1", "@hyperlane-xyz/widgets": "^3.1.4", "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6", "@rainbow-me/rainbowkit": "1.3.0", @@ -89,10 +89,12 @@ }, "types": "dist/src/index.d.ts", "resolutions": { - "ethers": "^5.7", - "zustand": "^4.4", + "axios": "0.27.2", "bn.js": "^5.2", + "cosmjs-types": "0.9", + "ethers": "^5.7", + "lit-html": "2.8.0", "viem": "1.20.0", - "lit-html": "2.8.0" + "zustand": "^4.4" } } diff --git a/public/browserconfig.xml b/public/browserconfig.xml index f4a9f372..d416bc53 100644 --- a/public/browserconfig.xml +++ b/public/browserconfig.xml @@ -3,7 +3,7 @@ - #025aa1 + #ffffff diff --git a/public/icon.png b/public/icon.png deleted file mode 100644 index 2f14c8d6..00000000 Binary files a/public/icon.png and /dev/null differ diff --git a/public/logo-with-text.png b/public/logo-with-text.png deleted file mode 100644 index c944efa3..00000000 Binary files a/public/logo-with-text.png and /dev/null differ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 00000000..774c5ce5 Binary files /dev/null and b/public/logo.png differ diff --git a/public/logo.svg b/public/logo.svg deleted file mode 100644 index 39b16cad..00000000 --- a/public/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/layout/AppLayout.tsx b/src/components/layout/AppLayout.tsx index ca467468..5f4c283d 100644 --- a/src/components/layout/AppLayout.tsx +++ b/src/components/layout/AppLayout.tsx @@ -2,6 +2,7 @@ import Head from 'next/head'; import Image from 'next/image'; import { PropsWithChildren } from 'react'; +import { APP_NAME } from '../../consts/app'; import Planet1 from '../../images/planets/planet-1.webp'; import Planet2 from '../../images/planets/planet-2.webp'; import { Footer } from '../nav/Footer'; @@ -13,7 +14,7 @@ export function AppLayout({ children }: PropsWithChildren) { {/* https://nextjs.org/docs/messages/no-document-viewport-meta */} - Hyperlane Nexus Bridge + {APP_NAME}
; // Optional map of API keys for block explorer showTipBox: boolean; // Show/Hide the blue tip box above the transfer form @@ -21,7 +21,7 @@ interface Config { } export const config: Config = Object.freeze({ - debug: isDevMode, + isDevMode, version, explorerApiKeys, showTipBox: true, diff --git a/src/consts/igpQuotes.ts b/src/consts/igpQuotes.ts new file mode 100644 index 00000000..85650c43 --- /dev/null +++ b/src/consts/igpQuotes.ts @@ -0,0 +1,11 @@ +import { ProtocolType } from '@hyperlane-xyz/utils'; + +// IGP Quote overrides can be set here +// If specified, this value will be used instead of querying the token adapter +// Protocol to value | map +export const DEFAULT_IGP_QUOTES: Partial< + Record> +> = { + [ProtocolType.Sealevel]: '10000', + [ProtocolType.Cosmos]: '270000', +}; diff --git a/src/consts/values.ts b/src/consts/values.ts index 17a28d8b..b7c66e66 100644 --- a/src/consts/values.ts +++ b/src/consts/values.ts @@ -3,7 +3,5 @@ export const SOL_ZERO_ADDRESS = '00000000000000000000000000000000000000000000'; export const COSMOS_ZERO_ADDRESS = 'cosmos100000000000000000000000000000000000000'; // Strangely, this is not included in any of the Solana packages export const SOL_SPL_NOOP_ADDRESS = 'noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV'; -export const SOL_IGP_QUOTE = '10000'; -export const COSM_IGP_QUOTE = '270000'; // Placeholder chain for use with cosmos-kit wallet hooks that require a chain name export const PLACEHOLDER_COSMOS_CHAIN = 'cosmoshub'; diff --git a/src/features/chains/cosmosDefault.ts b/src/features/chains/cosmosDefault.ts index 20c85568..03906fe1 100644 --- a/src/features/chains/cosmosDefault.ts +++ b/src/features/chains/cosmosDefault.ts @@ -9,6 +9,7 @@ export const cosmosDefaultChain: ChainMetadata = { domainId: 1234, // TODO bech32Prefix: 'cosmos', slip44: 118, + grpcUrls: [{ http: 'grpc-cosmoshub-ia.cosmosia.notional.ventures:443' }], rpcUrls: [{ http: 'https://rpc-cosmoshub.blockapsis.com' }], restUrls: [{ http: 'https://lcd-cosmoshub.blockapsis.com' }], nativeToken: { diff --git a/src/features/chains/utils.ts b/src/features/chains/utils.ts index b3605316..85d54404 100644 --- a/src/features/chains/utils.ts +++ b/src/features/chains/utils.ts @@ -10,7 +10,7 @@ export function getChainDisplayName(id: ChainCaip2Id, shortName = false) { const metadata = getMultiProvider().tryGetChainMetadata(reference || 0); if (!metadata) return 'Unknown'; const displayName = shortName ? metadata.displayNameShort : metadata.displayName; - return toTitleCase(displayName || metadata.displayName || metadata.name); + return displayName || metadata.displayName || toTitleCase(metadata.name); } export function isPermissionlessChain(id: ChainCaip2Id) { diff --git a/src/features/tokens/AdapterFactory.ts b/src/features/tokens/AdapterFactory.ts index dde892fc..b514b1bb 100644 --- a/src/features/tokens/AdapterFactory.ts +++ b/src/features/tokens/AdapterFactory.ts @@ -240,7 +240,7 @@ export class AdapterFactory { token: convertToProtocolAddress(baseTokenAddress, protocol, bech32Prefix), warpRouter: convertToProtocolAddress(routerAddress, protocol, bech32Prefix), }, - tokenMetadata.igpTokenAddress || baseTokenAddress, + tokenMetadata.igpTokenAddressOrDenom || baseTokenAddress, ); } else { throw new Error(`Unsupported protocol: ${protocol}`); diff --git a/src/features/tokens/types.ts b/src/features/tokens/types.ts index 43eef6ad..8733550f 100644 --- a/src/features/tokens/types.ts +++ b/src/features/tokens/types.ts @@ -18,7 +18,7 @@ const commonTokenFields = z.object({ symbol: z.string().optional(), decimals: z.number().nonnegative().optional(), // decimals == 0 for NFTs logoURI: z.string().optional(), - igpTokenAddress: z.string().optional(), + igpTokenAddressOrDenom: z.string().optional(), }); type CommonTokenFields = z.infer; @@ -91,7 +91,7 @@ interface BaseTokenMetadata extends MinimalTokenMetadata { type: ExtendedTokenType; tokenCaip19Id: TokenCaip19Id; routerAddress: Address; // Shared name for hypCollateralAddr or hypNativeAddr - igpTokenAddress?: Address; + igpTokenAddressOrDenom?: Address; logoURI?: string; } diff --git a/src/features/transfer/useIgpQuote.ts b/src/features/transfer/useIgpQuote.ts index 355e2fca..feebe80e 100644 --- a/src/features/transfer/useIgpQuote.ts +++ b/src/features/transfer/useIgpQuote.ts @@ -2,11 +2,11 @@ import { useQuery } from '@tanstack/react-query'; import { useEffect } from 'react'; import { IHypTokenAdapter } from '@hyperlane-xyz/sdk'; -import { ProtocolType, fromWei } from '@hyperlane-xyz/utils'; +import { ProtocolType, fromWei, isAddress } from '@hyperlane-xyz/utils'; import { useToastError } from '../../components/toast/useToastError'; -import { COSM_IGP_QUOTE, SOL_IGP_QUOTE } from '../../consts/values'; -import { getChainReference, getProtocolType } from '../caip/chains'; +import { DEFAULT_IGP_QUOTES } from '../../consts/igpQuotes'; +import { getChainReference, parseCaip2Id } from '../caip/chains'; import { AssetNamespace, getCaip19Id, getNativeTokenAddress } from '../caip/tokens'; import { getChainMetadata, getMultiProvider } from '../multiProvider'; import { Route } from '../routes/types'; @@ -22,11 +22,6 @@ import { findTokensByAddress, getToken } from '../tokens/metadata'; import { IgpQuote, IgpTokenType } from './types'; -const DEFAULT_IGP_QUOTES = { - [ProtocolType.Sealevel]: SOL_IGP_QUOTE, - [ProtocolType.Cosmos]: COSM_IGP_QUOTE, -}; - export function useIgpQuote(route?: Route) { const setIgpQuote = useStore((state) => state.setIgpQuote); @@ -49,14 +44,16 @@ export function useIgpQuote(route?: Route) { export async function fetchIgpQuote(route: Route, adapter?: IHypTokenAdapter): Promise { const { baseTokenCaip19Id, originCaip2Id, destCaip2Id: destinationCaip2Id } = route; - const originProtocol = getProtocolType(originCaip2Id); + const { protocol: originProtocol, reference: originChainId } = parseCaip2Id(originCaip2Id); const baseToken = getToken(baseTokenCaip19Id); if (!baseToken) throw new Error(`No base token found for ${baseTokenCaip19Id}`); let weiAmount: string; - if (DEFAULT_IGP_QUOTES[originProtocol]) { - // If a default is set for the origin protocol, use that - weiAmount = DEFAULT_IGP_QUOTES[originProtocol]; + const defaultQuotes = DEFAULT_IGP_QUOTES[originProtocol]; + if (typeof defaultQuotes === 'string') { + weiAmount = defaultQuotes; + } else if (defaultQuotes?.[originChainId]) { + weiAmount = defaultQuotes[originChainId]; } else { // Otherwise, compute IGP quote via the adapter adapter ||= AdapterFactory.HypTokenAdapterFromRouteOrigin(route); @@ -73,9 +70,13 @@ export async function fetchIgpQuote(route: Route, adapter?: IHypTokenAdapter): P let tokenDecimals: number; // If the token has an explicit IGP token address set, use that // Custom igpTokenAddress configs are supported only from the base (i.e. collateral) token is supported atm - if (isRouteFromBase && baseToken.igpTokenAddress) { + if ( + isRouteFromBase && + baseToken.igpTokenAddressOrDenom && + isAddress(baseToken.igpTokenAddressOrDenom) + ) { type = IgpTokenType.TokenSeparate; - const igpToken = findTokensByAddress(baseToken.igpTokenAddress)[0]; + const igpToken = findTokensByAddress(baseToken.igpTokenAddressOrDenom)[0]; tokenCaip19Id = igpToken.tokenCaip19Id; // Note this assumes the u prefix because only cosmos tokens use this case tokenSymbol = igpToken.symbol; diff --git a/src/features/transfer/useTokenTransfer.ts b/src/features/transfer/useTokenTransfer.ts index 3a195375..b1668795 100644 --- a/src/features/transfer/useTokenTransfer.ts +++ b/src/features/transfer/useTokenTransfer.ts @@ -17,7 +17,6 @@ import { import { ProtocolType, toWei } from '@hyperlane-xyz/utils'; import { toastTxSuccess } from '../../components/toast/TxSuccessToast'; -import { COSM_IGP_QUOTE } from '../../consts/values'; import { logger } from '../../utils/logger'; import { parseCaip2Id } from '../caip/chains'; import { isNonFungibleToken } from '../caip/tokens'; @@ -179,7 +178,7 @@ async function executeTransfer({ logger.debug('Transfer transaction confirmed, hash:', transferTxHash); toastTxSuccess('Remote transfer started!', transferTxHash, originCaip2Id); } catch (error) { - logger.error(`Error at stage ${status} `, error); + logger.error(`Error at stage ${status}`, error); updateTransferStatus(transferIndex, TransferStatus.Failed); if (JSON.stringify(error).includes('ChainMismatchError')) { // Wagmi switchNetwork call helps prevent this but isn't foolproof @@ -399,6 +398,7 @@ async function executeIbcTransfer({ }; let adapter: IHypTokenAdapter; + let txValue: string | undefined = undefined; if (isIbcOnlyRoute(tokenRoute)) { adapter = new CosmIbcTokenAdapter(chainName, multiProvider, {}, adapterProperties); } else { @@ -416,6 +416,8 @@ async function executeIbcTransfer({ intermediateChainName, }, ); + const igpQuote = await fetchIgpQuote(tokenRoute, adapter); + txValue = igpQuote.weiAmount; } const transferTxRequest = (await adapter.populateTransferRemoteTx({ @@ -423,9 +425,7 @@ async function executeIbcTransfer({ recipient: recipientAddress, fromAccountOwner: activeAccountAddress, destination: destinationDomainId, - // TODO have this use fetchIgpQuote? - // Will be required if/when cosmos uses dynamic IGP fees - txValue: COSM_IGP_QUOTE, + txValue, })) as MsgTransferEncodeObject; updateStatus(TransferStatus.SigningTransfer); diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index cd5298fa..fabed210 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,5 +1,7 @@ import { Head, Html, Main, NextScript } from 'next/document'; +import { APP_BRAND_COLOR, APP_DESCRIPTION, APP_NAME, APP_URL } from '../consts/app'; + export default function Document() { return ( @@ -10,33 +12,24 @@ export default function Document() { - + - + - - - + + + - + - - + + - - + +
diff --git a/src/scripts/buildConfigs/routes.ts b/src/scripts/buildConfigs/routes.ts index 9816fca8..b26c9739 100644 --- a/src/scripts/buildConfigs/routes.ts +++ b/src/scripts/buildConfigs/routes.ts @@ -54,25 +54,49 @@ export async function fetchRemoteHypTokens( const chain = getCaip2Id(protocol, context.multiProvider.getChainId(router.domain)); const formattedAddress = bytesToProtocolAddress(router.address, protocol); if (isNft) return { chain, router: formattedAddress, decimals: 0 }; - // Attempt to find the decimals from the token list - const routerMetadata = context.tokens.find((token) => - eqAddress(formattedAddress, token.routerAddress), - ); - if (routerMetadata) - return { chain, router: formattedAddress, decimals: routerMetadata.decimals }; - // Otherwise try to query the contract - const remoteAdapter = AdapterFactory.HypSyntheticTokenAdapterFromAddress( - baseTokenCaip19Id, - chain, + + const routerDecimals = await getRemoteRouterDecimals( + context, formattedAddress, + chain, + baseTokenCaip19Id, + baseToken.decimals, ); - const metadata = await remoteAdapter.getMetadata(); - return { chain, router: formattedAddress, decimals: metadata.decimals }; + return { chain, router: formattedAddress, decimals: routerDecimals }; }), ); return { ...baseToken, hypTokens }; } +async function getRemoteRouterDecimals( + context: WarpContext, + router: Address, + chain: ChainCaip2Id, + baseToken: TokenCaip19Id, + originDecimals: number, +) { + // Attempt to find the decimals from the token list + const routerMetadata = context.tokens.find((token) => eqAddress(router, token.routerAddress)); + if (routerMetadata) return routerMetadata.decimals; + + // Otherwise try to query the contract + try { + const remoteAdapter = AdapterFactory.HypSyntheticTokenAdapterFromAddress( + baseToken, + chain, + router, + ); + const metadata = await remoteAdapter.getMetadata(); + return metadata.decimals; + } catch (error) { + logger.warn(`Failed to get metadata for router ${router} on chain ${chain}`); + } + + // Fallback to using origin router's decimals + logger.warn('Falling back to origin decimals', originDecimals); + return originDecimals; +} + // Process token list to populates routesCache with all possible token routes (e.g. router pairs) export function computeTokenRoutes(tokens: TokenMetadataWithHypTokens[]): RoutesMap { const tokenRoutes: RoutesMap = {}; diff --git a/src/scripts/buildConfigs/tokens.ts b/src/scripts/buildConfigs/tokens.ts index 2a18d4d0..86a37978 100644 --- a/src/scripts/buildConfigs/tokens.ts +++ b/src/scripts/buildConfigs/tokens.ts @@ -49,7 +49,7 @@ async function parseTokenConfigs( const parsedConfig = result.data; const tokenMetadata: TokenMetadata[] = []; for (const config of parsedConfig) { - const { type, chainId, logoURI, igpTokenAddress } = config; + const { type, chainId, logoURI, igpTokenAddressOrDenom } = config; const protocol = multiProvider.getChainMetadata(chainId).protocol || ProtocolType.Ethereum; const chainCaip2Id = getCaip2Id(protocol, chainId); @@ -83,7 +83,7 @@ async function parseTokenConfigs( type, tokenCaip19Id, routerAddress, - igpTokenAddress, + igpTokenAddressOrDenom, }); } return tokenMetadata; diff --git a/src/utils/logger.ts b/src/utils/logger.ts index d159b924..1a6bdcd6 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,16 +1,20 @@ /* eslint-disable no-console */ import { captureException } from '@sentry/nextjs'; +import { config } from '../consts/config'; + export const logger = { debug: (...args: any[]) => console.debug(...args), info: (...args: any[]) => console.info(...args), warn: (...args: any[]) => console.warn(...args), error: (message: string, err: any, ...args: any[]) => { - console.error(...args); - const filteredArgs = args.filter(isSafeSentryArg); - const extra = filteredArgs.reduce((acc, arg, i) => ({ ...acc, [`arg${i}`]: arg }), {}); - extra['message'] = message; - captureException(err, { extra }); + console.error(message, err, ...args); + if (!config.isDevMode) { + const filteredArgs = args.filter(isSafeSentryArg); + const extra = filteredArgs.reduce((acc, arg, i) => ({ ...acc, [`arg${i}`]: arg }), {}); + extra['message'] = message; + captureException(err, { extra }); + } }, }; diff --git a/yarn.lock b/yarn.lock index de250fd3..08b57095 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2995,30 +2995,30 @@ __metadata: languageName: node linkType: hard -"@hyperlane-xyz/core@npm:3.5.1": - version: 3.5.1 - resolution: "@hyperlane-xyz/core@npm:3.5.1" +"@hyperlane-xyz/core@npm:3.6.1": + version: 3.6.1 + resolution: "@hyperlane-xyz/core@npm:3.6.1" dependencies: "@eth-optimism/contracts": "npm:^0.6.0" - "@hyperlane-xyz/utils": "npm:3.5.1" + "@hyperlane-xyz/utils": "npm:3.6.1" "@openzeppelin/contracts": "npm:^4.9.3" "@openzeppelin/contracts-upgradeable": "npm:^v4.9.3" peerDependencies: "@ethersproject/abi": "*" "@ethersproject/providers": "*" "@types/sinon-chai": "*" - checksum: ed32e9fc9055dd5f11c3ad8fd319cd0b9440ea5c9fd390f45ea4f1a1619cff570d038c13a36cfb95fcab2b4174e474829624b8e2a828cb69614a6fea9bb1e9ab + checksum: 15cf69663a6f80ef8c656f283a2af84c9be58cb2a84f88820cda5b6233157aaac69557b97983ad4138078b0dc0a77cb37f6bc992d4ba8bf4b5e512cbf942526f languageName: node linkType: hard -"@hyperlane-xyz/sdk@npm:^3.5.1": - version: 3.5.1 - resolution: "@hyperlane-xyz/sdk@npm:3.5.1" +"@hyperlane-xyz/sdk@npm:^3.6.1": + version: 3.6.1 + resolution: "@hyperlane-xyz/sdk@npm:3.6.1" dependencies: "@cosmjs/cosmwasm-stargate": "npm:^0.31.3" "@cosmjs/stargate": "npm:^0.31.3" - "@hyperlane-xyz/core": "npm:3.5.1" - "@hyperlane-xyz/utils": "npm:3.5.1" + "@hyperlane-xyz/core": "npm:3.6.1" + "@hyperlane-xyz/utils": "npm:3.6.1" "@solana/spl-token": "npm:^0.3.8" "@solana/web3.js": "npm:^1.78.0" "@types/coingecko-api": "npm:^1.0.10" @@ -3035,19 +3035,19 @@ __metadata: peerDependencies: "@ethersproject/abi": "*" "@ethersproject/providers": "*" - checksum: 59bac962050ea59ed98fad0369309fcbb8c83af4add7a0c5f043e5bfd4b1abd9e2ae91ec615b6b4bd295c4cfa098965de996c4fc6e65d170e499a2d6be35cc38 + checksum: 9c5b0cd9c44ff8f8193740cd895a87c84990d9466ffd695a35f1a0f71dafb8dee2ac294295df3be2849f520ef4ec236cc641f98eb93369a67d2727a75249c7cb languageName: node linkType: hard -"@hyperlane-xyz/utils@npm:3.5.1, @hyperlane-xyz/utils@npm:^3.5.1": - version: 3.5.1 - resolution: "@hyperlane-xyz/utils@npm:3.5.1" +"@hyperlane-xyz/utils@npm:3.6.1, @hyperlane-xyz/utils@npm:^3.6.1": + version: 3.6.1 + resolution: "@hyperlane-xyz/utils@npm:3.6.1" dependencies: "@cosmjs/encoding": "npm:^0.31.3" "@solana/web3.js": "npm:^1.78.0" bignumber.js: "npm:^9.1.1" ethers: "npm:^5.7.2" - checksum: a9f6f716dc4d4638d328fcae156169e7b0f341fea41a45d4f7deaa9eebe56fbf8f4aac1a1cb03ccdde7bfd83fed1eb33a50473240f69cb55333c7819ac343075 + checksum: dca6656ba047fac0ab8e8e9cc4687cdc1784d2245efa57bf4826f35eac6fa0f2c6fb9834f1dc3b699ce3cb0b5ccfd02940d7eb3b574204d8c2b4f4778aa6d301 languageName: node linkType: hard @@ -3067,8 +3067,8 @@ __metadata: "@emotion/react": "npm:^11.11.1" "@emotion/styled": "npm:^11.11.0" "@headlessui/react": "npm:^1.7.14" - "@hyperlane-xyz/sdk": "npm:^3.5.1" - "@hyperlane-xyz/utils": "npm:^3.5.1" + "@hyperlane-xyz/sdk": "npm:^3.6.1" + "@hyperlane-xyz/utils": "npm:^3.6.1" "@hyperlane-xyz/widgets": "npm:^3.1.4" "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6" "@next/bundle-analyzer": "npm:^14.0.4" @@ -7913,6 +7913,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 3ce727cbc78f69d6a4722517a58ee926c8c21083633b1d3fdf66fd688f6c127a53a592141bd4866f9b63240a86e9d8e974b13919450bd17fa33c2d22c4558ad8 + languageName: node + linkType: hard + "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -7952,12 +7959,13 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.21.0, axios@npm:^0.21.2": - version: 0.21.4 - resolution: "axios@npm:0.21.4" +"axios@npm:0.27.2": + version: 0.27.2 + resolution: "axios@npm:0.27.2" dependencies: - follow-redirects: "npm:^1.14.0" - checksum: da644592cb6f8f9f8c64fdabd7e1396d6769d7a4c1ea5f8ae8beb5c2eb90a823e3a574352b0b934ac62edc762c0f52647753dc54f7d07279127a7e5c4cd20272 + follow-redirects: "npm:^1.14.9" + form-data: "npm:^4.0.0" + checksum: 2efaf18dd0805f7bc772882bc86f004abd92d51007b54c5081f74db0d08ce3593e2c010261896d25a14318eeaa2e966fd825e34f810e8a3339dc64b9d177cf70 languageName: node linkType: hard @@ -8780,6 +8788,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 2e969e637d05d09fa50b02d74c83a1186f6914aae89e6653b62595cc75a221464f884f55f231b8f4df7a49537fba60bdc0427acd2bf324c09a1dbb84837e36e4 + languageName: node + linkType: hard + "commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -8893,17 +8910,7 @@ __metadata: languageName: node linkType: hard -"cosmjs-types@npm:^0.8.0": - version: 0.8.0 - resolution: "cosmjs-types@npm:0.8.0" - dependencies: - long: "npm:^4.0.0" - protobufjs: "npm:~6.11.2" - checksum: 9a6ac37a77349416bf5e3abab21b1084da4d293e76a77d11bb9fbaeef27c6f36b64b47b92ee587a0a5b66a543bfcd62078820dc0d14f9e39bd037a4801013dc1 - languageName: node - linkType: hard - -"cosmjs-types@npm:^0.9.0": +"cosmjs-types@npm:0.9": version: 0.9.0 resolution: "cosmjs-types@npm:0.9.0" checksum: c61137bf0aba5c4b73f5191590472e6de61203c3e3dc0081643ac388c9f27f65de052298a0c6b239543adaba7829f5ff9c9fb95ab44d7b4186b080b8478e3b27 @@ -9186,6 +9193,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -10240,13 +10254,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.0": - version: 1.15.1 - resolution: "follow-redirects@npm:1.15.1" +"follow-redirects@npm:^1.14.9": + version: 1.15.5 + resolution: "follow-redirects@npm:1.15.5" peerDependenciesMeta: debug: optional: true - checksum: a57f93ce566d4602fe7b2f6cef8f8d3d053891b3d8f2feae7e97eec18aa0003d23aeec8e857801d93887eee27e1617276a16f6a3d5c9d78e45882346612462d5 + checksum: d467f13c1c6aa734599b8b369cd7a625b20081af358f6204ff515f6f4116eb440de9c4e0c49f10798eeb0df26c95dd05d5e0d9ddc5786ab1a8a8abefe92929b4 languageName: node linkType: hard @@ -10259,6 +10273,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 7264aa760a8cf09482816d8300f1b6e2423de1b02bba612a136857413fdc96d7178298ced106817655facc6b89036c6e12ae31c9eb5bdc16aabf502ae8a5d805 + languageName: node + linkType: hard + "formik@npm:^2.4.5": version: 2.4.5 resolution: "formik@npm:2.4.5" @@ -12557,6 +12582,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 89aa9651b67644035de2784a6e665fc685d79aba61857e02b9c8758da874a754aed4a9aced9265f5ed1171fd934331e5516b84a7f0218031b6fa0270eca1e51a + languageName: node + linkType: hard + "mime@npm:^3.0.0": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -13735,7 +13776,7 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^6.11.2, protobufjs@npm:^6.8.8, protobufjs@npm:~6.11.2, protobufjs@npm:~6.11.3": +"protobufjs@npm:^6.11.2, protobufjs@npm:^6.8.8, protobufjs@npm:~6.11.3": version: 6.11.4 resolution: "protobufjs@npm:6.11.4" dependencies: