Setup Error Monitoring and Analytics (#114)

* Add Sentry error capture
* Add Vercel analytics
* Setup bundle analyzer
* Capture errors from logger
pull/127/head
J M Rossy 10 months ago committed by GitHub
parent f2f5e989cd
commit 7ac7dcc127
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .eslintignore
  2. 51
      next.config.js
  3. 3
      package.json
  4. 22
      sentry.client.config.js
  5. 13
      sentry.default.config.js
  6. 6
      sentry.edge.config.js
  7. 6
      sentry.server.config.js
  8. 15
      src/components/toast/useToastError.tsx
  9. 4
      src/consts/config.ts
  10. 2
      src/features/caip/chains.ts
  11. 2
      src/features/caip/tokens.ts
  12. 11
      src/features/tokens/approval.ts
  13. 42
      src/features/tokens/balances.ts
  14. 3
      src/features/tokens/routes/hooks.ts
  15. 2
      src/features/transfer/TransferTokenCard.tsx
  16. 8
      src/features/transfer/TransfersDetailsModal.tsx
  17. 11
      src/features/transfer/useIgpQuote.ts
  18. 2
      src/pages/_app.tsx
  19. 19
      src/styles/globals.css
  20. 16
      src/utils/logger.ts
  21. 507
      yarn.lock

@ -6,3 +6,4 @@ postcss.config.js
next.config.js next.config.js
tailwind.config.js tailwind.config.js
jest.config.js jest.config.js
sentry.*

@ -1,9 +1,34 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const { version } = require('./package.json') const { version } = require('./package.json')
const { withSentryConfig } = require("@sentry/nextjs");
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
})
const isDev = process.env.NODE_ENV !== 'production' const isDev = process.env.NODE_ENV !== 'production'
// Sometimes useful to disable this during development
const ENABLE_CSP_HEADER = true;
const FRAME_SRC_HOSTS = ['https://*.walletconnect.com', 'https://*.walletconnect.org','https://*.solflare.com'];
const STYLE_SRC_HOSTS = ['https://*.googleapis.com']
const IMG_SRC_HOSTS = ['https://*.walletconnect.com'];
const cspHeader = `
default-src 'self';
script-src 'self'${isDev ? " 'unsafe-eval'" : ''};
style-src 'self' 'unsafe-inline' ${STYLE_SRC_HOSTS.join(' ')};
connect-src *;
img-src 'self' blob: data: ${IMG_SRC_HOSTS.join(' ')};
font-src 'self' data:;
object-src 'none';
base-uri 'self';
form-action 'self';
frame-src 'self' ${FRAME_SRC_HOSTS.join(' ')};
frame-ancestors 'none';
${!isDev ? 'block-all-mixed-content;' : ''}
${!isDev ? 'upgrade-insecure-requests;' : ''}
`.replace(/\s{2,}/g, ' ').trim();
const securityHeaders = [ const securityHeaders = [
{ {
key: 'X-XSS-Protection', key: 'X-XSS-Protection',
@ -22,12 +47,14 @@ const securityHeaders = [
value: 'strict-origin-when-cross-origin', value: 'strict-origin-when-cross-origin',
}, },
// Note, causes a problem for firefox: https://github.com/MetaMask/metamask-extension/issues/3133 // Note, causes a problem for firefox: https://github.com/MetaMask/metamask-extension/issues/3133
...(ENABLE_CSP_HEADER
? [
{ {
key: 'Content-Security-Policy', key: 'Content-Security-Policy',
value: `default-src 'self'; script-src 'self'${ value: cspHeader,
isDev ? " 'unsafe-eval'" : ''
}; connect-src *; img-src 'self' data: https://*.walletconnect.com; style-src 'self' 'unsafe-inline' https://*.googleapis.com; font-src 'self' data:; base-uri 'self'; form-action 'self'; frame-src 'self' https://*.solflare.com https://*.walletconnect.com https://*.walletconnect.org;`,
}, },
]
: [])
] ]
const nextConfig = { const nextConfig = {
@ -64,6 +91,22 @@ const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
swcMinify: true, swcMinify: true,
sentry: {
hideSourceMaps: true,
tunnelRoute: "/monitoring-tunnel",
},
} }
module.exports = nextConfig const sentryWebpackPluginOptions = {
org: "hyperlane",
project: "warp-ui",
authToken: process.env.SENTRY_AUTH_TOKEN,
bundleSizeOptimizations: {
excludeDebugStatements: true,
excludeReplayIframe: true,
excludeReplayShadowDom: true,
},
};
module.exports = withBundleAnalyzer(withSentryConfig(nextConfig, sentryWebpackPluginOptions));

@ -21,6 +21,7 @@
"@hyperlane-xyz/widgets": "^3.1.4", "@hyperlane-xyz/widgets": "^3.1.4",
"@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6", "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6",
"@rainbow-me/rainbowkit": "1.3.0", "@rainbow-me/rainbowkit": "1.3.0",
"@sentry/nextjs": "^7.93.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/wallet-adapter-base": "^0.9.22", "@solana/wallet-adapter-base": "^0.9.22",
"@solana/wallet-adapter-react": "^0.15.32", "@solana/wallet-adapter-react": "^0.15.32",
@ -28,6 +29,7 @@
"@solana/wallet-adapter-wallets": "^0.19.16", "@solana/wallet-adapter-wallets": "^0.19.16",
"@solana/web3.js": "^1.77.0", "@solana/web3.js": "^1.77.0",
"@tanstack/react-query": "^4.29.7", "@tanstack/react-query": "^4.29.7",
"@vercel/analytics": "^1.1.1",
"bignumber.js": "^9.1.1", "bignumber.js": "^9.1.1",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"cosmjs-types": "^0.9.0", "cosmjs-types": "^0.9.0",
@ -43,6 +45,7 @@
"zustand": "^4.3.9" "zustand": "^4.3.9"
}, },
"devDependencies": { "devDependencies": {
"@next/bundle-analyzer": "^14.0.4",
"@trivago/prettier-plugin-sort-imports": "^4.1.1", "@trivago/prettier-plugin-sort-imports": "^4.1.1",
"@types/jest": "^29.5.3", "@types/jest": "^29.5.3",
"@types/node": "^18.11.18", "@types/node": "^18.11.18",

@ -0,0 +1,22 @@
import { sentryDefaultConfig } from './sentry.default.config';
import * as Sentry from '@sentry/nextjs';
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
Sentry.init({
...sentryDefaultConfig,
integrations: [
new Sentry.Integrations.Breadcrumbs({
console: false,
dom: false,
fetch: false,
history: false,
sentry: false,
xhr: false,
}),
new Sentry.Integrations.Dedupe(),
new Sentry.Integrations.FunctionToString(),
new Sentry.Integrations.GlobalHandlers(),
new Sentry.Integrations.HttpContext(),
],
});
}

@ -0,0 +1,13 @@
export const sentryDefaultConfig = {
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 1.0,
maxBreadcrumbs: 1,
sendClientReports: false,
attachStacktrace: false,
defaultIntegrations: false,
integrations: [],
beforeSend(event) {
delete event.user;
return event;
},
};

@ -0,0 +1,6 @@
import { sentryDefaultConfig } from './sentry.default.config';
import * as Sentry from '@sentry/nextjs';
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
Sentry.init(sentryDefaultConfig)
}

@ -0,0 +1,6 @@
import { sentryDefaultConfig } from './sentry.default.config';
import * as Sentry from '@sentry/nextjs';
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
Sentry.init(sentryDefaultConfig)
}

@ -0,0 +1,15 @@
import { useEffect } from 'react';
import { toast } from 'react-toastify';
import { errorToString } from '@hyperlane-xyz/utils';
import { logger } from '../../utils/logger';
export function useToastError(error: any, errorMsg?: string) {
useEffect(() => {
if (!error) return;
const message = errorMsg || errorToString(error, 500);
logger.error(message, error);
toast.error(errorMsg);
}, [error, errorMsg]);
}

@ -1,7 +1,7 @@
import { ADDRESS_BLACKLIST } from './blacklist'; import { ADDRESS_BLACKLIST } from './blacklist';
const isDevMode = process?.env?.NODE_ENV === 'development'; const isDevMode = process?.env?.NODE_ENV === 'development';
const version = process?.env?.NEXT_PUBLIC_VERSION ?? null; const version = process?.env?.NEXT_PUBLIC_VERSION || '0.0.0';
const explorerApiKeys = JSON.parse(process?.env?.EXPLORER_API_KEYS || '{}'); const explorerApiKeys = JSON.parse(process?.env?.EXPLORER_API_KEYS || '{}');
const walletConnectProjectId = process?.env?.NEXT_PUBLIC_WALLET_CONNECT_ID || ''; const walletConnectProjectId = process?.env?.NEXT_PUBLIC_WALLET_CONNECT_ID || '';
const withdrawalWhitelist = process?.env?.NEXT_PUBLIC_BLOCK_WITHDRAWAL_WHITELIST || ''; const withdrawalWhitelist = process?.env?.NEXT_PUBLIC_BLOCK_WITHDRAWAL_WHITELIST || '';
@ -9,7 +9,7 @@ const transferBlacklist = process?.env?.NEXT_PUBLIC_TRANSFER_BLACKLIST || '';
interface Config { interface Config {
debug: boolean; // Enables some debug features in the app debug: boolean; // Enables some debug features in the app
version: string | null; // Matches version number in package.json version: string; // Matches version number in package.json
explorerApiKeys: Record<string, string>; // Optional map of API keys for block explorer explorerApiKeys: Record<string, string>; // Optional map of API keys for block explorer
showTipBox: boolean; // Show/Hide the blue tip box above the transfer form showTipBox: boolean; // Show/Hide the blue tip box above the transfer form
showDisabledTokens: boolean; // Show/Hide invalid token options in the selection modal showDisabledTokens: boolean; // Show/Hide invalid token options in the selection modal

@ -35,7 +35,7 @@ export function tryParseCaip2Id(id?: ChainCaip2Id) {
try { try {
return parseCaip2Id(id); return parseCaip2Id(id);
} catch (err) { } catch (err) {
logger.error('Error parsing caip2 id', err); logger.error(`Error parsing caip2 id ${id}`, err);
return undefined; return undefined;
} }
} }

@ -65,7 +65,7 @@ export function tryParseCaip19Id(id?: TokenCaip19Id) {
try { try {
return parseCaip19Id(id); return parseCaip19Id(id);
} catch (err) { } catch (err) {
logger.error('Error parsing caip2 id', err); logger.error(`Error parsing caip2 id ${id}`, err);
return undefined; return undefined;
} }
} }

@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query';
import { ProtocolType, eqAddress } from '@hyperlane-xyz/utils'; import { ProtocolType, eqAddress } from '@hyperlane-xyz/utils';
import { useToastError } from '../../components/toast/useToastError';
import { logger } from '../../utils/logger'; import { logger } from '../../utils/logger';
import { getProtocolType } from '../caip/chains'; import { getProtocolType } from '../caip/chains';
import { getTokenAddress, isNativeToken, isNonFungibleToken } from '../caip/tokens'; import { getTokenAddress, isNativeToken, isNonFungibleToken } from '../caip/tokens';
@ -20,11 +21,7 @@ export function useIsApproveRequired(
) { ) {
const owner = useAccountAddressForChain(route?.originCaip2Id); const owner = useAccountAddressForChain(route?.originCaip2Id);
const { const { isLoading, isError, error, data } = useQuery({
isLoading,
isError: hasError,
data,
} = useQuery({
queryKey: ['useIsApproveRequired', route, tokenCaip19Id, owner, amount], queryKey: ['useIsApproveRequired', route, tokenCaip19Id, owner, amount],
queryFn: async () => { queryFn: async () => {
if (!route || !tokenCaip19Id || !owner || !amount) return false; if (!route || !tokenCaip19Id || !owner || !amount) return false;
@ -33,7 +30,9 @@ export function useIsApproveRequired(
enabled, enabled,
}); });
return { isLoading, hasError, isApproveRequired: !!data }; useToastError(error, 'Error fetching approval status');
return { isLoading, isError, isApproveRequired: !!data };
} }
export async function isApproveRequired( export async function isApproveRequired(

@ -3,6 +3,7 @@ import { useEffect } from 'react';
import { eqAddress, isValidAddress } from '@hyperlane-xyz/utils'; import { eqAddress, isValidAddress } from '@hyperlane-xyz/utils';
import { useToastError } from '../../components/toast/useToastError';
import { logger } from '../../utils/logger'; import { logger } from '../../utils/logger';
import { getProtocolType } from '../caip/chains'; import { getProtocolType } from '../caip/chains';
import { parseCaip19Id, tryGetChainIdFromToken } from '../caip/tokens'; import { parseCaip19Id, tryGetChainIdFromToken } from '../caip/tokens';
@ -23,11 +24,7 @@ export function useOriginBalance(
const address = useAccountAddressForChain(originCaip2Id); const address = useAccountAddressForChain(originCaip2Id);
const setSenderBalances = useStore((state) => state.setSenderBalances); const setSenderBalances = useStore((state) => state.setSenderBalances);
const { const { isLoading, isError, error, data } = useQuery({
isLoading,
isError: hasError,
data,
} = useQuery({
queryKey: [ queryKey: [
'useOriginBalance', 'useOriginBalance',
address, address,
@ -58,13 +55,15 @@ export function useOriginBalance(
refetchInterval: 5000, refetchInterval: 5000,
}); });
useToastError(error, 'Error fetching origin balance');
useEffect(() => { useEffect(() => {
setSenderBalances(data?.tokenBalance || '0', data?.nativeBalance || '0'); setSenderBalances(data?.tokenBalance || '0', data?.nativeBalance || '0');
}, [data, setSenderBalances]); }, [data, setSenderBalances]);
return { return {
isLoading, isLoading,
hasError, isError,
tokenBalance: data?.tokenBalance, tokenBalance: data?.tokenBalance,
tokenDecimals: data?.tokenDecimals, tokenDecimals: data?.tokenDecimals,
nativeBalance: data?.nativeBalance, nativeBalance: data?.nativeBalance,
@ -75,11 +74,7 @@ export function useDestinationBalance(
{ originCaip2Id, destinationCaip2Id, tokenCaip19Id, recipientAddress }: TransferFormValues, { originCaip2Id, destinationCaip2Id, tokenCaip19Id, recipientAddress }: TransferFormValues,
tokenRoutes: RoutesMap, tokenRoutes: RoutesMap,
) { ) {
const { const { isLoading, isError, error, data } = useQuery({
isLoading,
isError: hasError,
data,
} = useQuery({
queryKey: [ queryKey: [
'useDestinationBalance', 'useDestinationBalance',
recipientAddress, recipientAddress,
@ -101,7 +96,9 @@ export function useDestinationBalance(
refetchInterval: 5000, refetchInterval: 5000,
}); });
return { isLoading, hasError, balance: data?.balance, decimals: data?.decimals }; useToastError(error, 'Error fetching destination balance');
return { isLoading, isError, balance: data?.balance, decimals: data?.decimals };
} }
// TODO solana support // TODO solana support
@ -112,7 +109,8 @@ export function useOriginTokenIdBalance(tokenCaip19Id: TokenCaip19Id) {
const { const {
isLoading, isLoading,
isError: hasError, isError,
error,
data: tokenIds, data: tokenIds,
} = useQuery({ } = useQuery({
queryKey: ['useOriginTokenIdBalance', tokenCaip19Id, accountAddress], queryKey: ['useOriginTokenIdBalance', tokenCaip19Id, accountAddress],
@ -123,11 +121,13 @@ export function useOriginTokenIdBalance(tokenCaip19Id: TokenCaip19Id) {
refetchInterval: 5000, refetchInterval: 5000,
}); });
useToastError(error, 'Error fetching origin token IDs');
useEffect(() => { useEffect(() => {
setSenderNftIds(tokenIds && Array.isArray(tokenIds) ? tokenIds : null); setSenderNftIds(tokenIds && Array.isArray(tokenIds) ? tokenIds : null);
}, [tokenIds, setSenderNftIds]); }, [tokenIds, setSenderNftIds]);
return { isLoading, hasError, tokenIds }; return { isLoading, isError, tokenIds };
} }
// TODO solana support // TODO solana support
@ -159,7 +159,8 @@ export function useContractSupportsTokenByOwner(
) { ) {
const { const {
isLoading, isLoading,
isError: hasError, isError,
error,
data: isContractAllowToGetTokenIds, data: isContractAllowToGetTokenIds,
} = useQuery({ } = useQuery({
queryKey: ['useContractSupportsTokenByOwner', tokenCaip19Id, accountAddress], queryKey: ['useContractSupportsTokenByOwner', tokenCaip19Id, accountAddress],
@ -169,7 +170,9 @@ export function useContractSupportsTokenByOwner(
}, },
}); });
return { isLoading, hasError, isContractAllowToGetTokenIds }; useToastError(error, 'Error ERC721 contract details');
return { isLoading, isError, isContractAllowToGetTokenIds };
} }
// TODO solana support // TODO solana support
@ -195,7 +198,8 @@ export function useIsSenderNftOwner(tokenCaip19Id: TokenCaip19Id, tokenId: strin
const { const {
isLoading, isLoading,
isError: hasError, isError,
error,
data: owner, data: owner,
} = useQuery({ } = useQuery({
queryKey: ['useOwnerOfErc721', tokenCaip19Id, tokenId], queryKey: ['useOwnerOfErc721', tokenCaip19Id, tokenId],
@ -205,12 +209,14 @@ export function useIsSenderNftOwner(tokenCaip19Id: TokenCaip19Id, tokenId: strin
}, },
}); });
useToastError(error, 'Error ERC721 owner');
useEffect(() => { useEffect(() => {
if (!senderAddress || !owner) setIsSenderNftOwner(null); if (!senderAddress || !owner) setIsSenderNftOwner(null);
else setIsSenderNftOwner(eqAddress(senderAddress, owner)); else setIsSenderNftOwner(eqAddress(senderAddress, owner));
}, [owner, senderAddress, setIsSenderNftOwner]); }, [owner, senderAddress, setIsSenderNftOwner]);
return { isLoading, hasError, owner }; return { isLoading, isError, owner };
} }
// TODO solana support // TODO solana support

@ -1,6 +1,7 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useToastError } from '../../../components/toast/useToastError';
import { ibcRoutes } from '../../../consts/ibcRoutes'; import { ibcRoutes } from '../../../consts/ibcRoutes';
import { logger } from '../../../utils/logger'; import { logger } from '../../../utils/logger';
import { getChainIdFromToken } from '../../caip/tokens'; import { getChainIdFromToken } from '../../caip/tokens';
@ -41,6 +42,8 @@ export function useTokenRoutes() {
{ retry: false }, { retry: false },
); );
useToastError(error, 'Error fetching token routes');
return { isLoading, error, tokenRoutes }; return { isLoading, error, tokenRoutes };
} }

@ -33,7 +33,7 @@ export function TransferTokenCard() {
<div className="my-32 flex flex-col items-center text-center"> <div className="my-32 flex flex-col items-center text-center">
<h3 className="text-red-500">Error searching for token routes.</h3> <h3 className="text-red-500">Error searching for token routes.</h3>
<div className="mt-3 text-sm text-red-500"> <div className="mt-3 text-sm text-red-500">
Please ensure chain and token configs are valid. Please ensure token configs are valid and RPCs are healthy.
</div> </div>
<div className="mt-4 text-xs text-gray-500">{routesError.toString()}</div> <div className="mt-4 text-xs text-gray-500">{routesError.toString()}</div>
</div> </div>

@ -54,7 +54,7 @@ export function TransfersDetailsModal({
const { address: tokenAddress, namespace: tokenNamespace } = parseCaip19Id(tokenCaip19Id); const { address: tokenAddress, namespace: tokenNamespace } = parseCaip19Id(tokenCaip19Id);
const isNative = tokenNamespace === AssetNamespace.native || isZeroishAddress(tokenAddress); const isNative = tokenNamespace === AssetNamespace.native || isZeroishAddress(tokenAddress);
const getFormUrls = useCallback(async () => { const getMessageUrls = useCallback(async () => {
try { try {
if (originTxHash) { if (originTxHash) {
const originTxUrl = multiProvider.tryGetExplorerTxUrl(originChain, { hash: originTxHash }); const originTxUrl = multiProvider.tryGetExplorerTxUrl(originChain, { hash: originTxHash });
@ -73,8 +73,10 @@ export function TransfersDetailsModal({
useEffect(() => { useEffect(() => {
if (!transfer) return; if (!transfer) return;
getFormUrls().catch((err) => logger.error(err)); getMessageUrls().catch((err) =>
}, [transfer, getFormUrls]); logger.error('Error getting message URLs for details modal', err),
);
}, [transfer, getMessageUrls]);
const isAccountReady = !!account?.isReady; const isAccountReady = !!account?.isReady;
const connectorName = account?.connectorName || 'wallet'; const connectorName = account?.connectorName || 'wallet';

@ -4,6 +4,7 @@ import { useEffect } from 'react';
import { IHypTokenAdapter } from '@hyperlane-xyz/sdk'; import { IHypTokenAdapter } from '@hyperlane-xyz/sdk';
import { ProtocolType, fromWei } from '@hyperlane-xyz/utils'; import { ProtocolType, fromWei } from '@hyperlane-xyz/utils';
import { useToastError } from '../../components/toast/useToastError';
import { COSM_IGP_QUOTE, SOL_IGP_QUOTE } from '../../consts/values'; import { COSM_IGP_QUOTE, SOL_IGP_QUOTE } from '../../consts/values';
import { getChainReference, getProtocolType } from '../caip/chains'; import { getChainReference, getProtocolType } from '../caip/chains';
import { AssetNamespace, getCaip19Id, getNativeTokenAddress } from '../caip/tokens'; import { AssetNamespace, getCaip19Id, getNativeTokenAddress } from '../caip/tokens';
@ -29,11 +30,7 @@ const DEFAULT_IGP_QUOTES = {
export function useIgpQuote(route?: Route) { export function useIgpQuote(route?: Route) {
const setIgpQuote = useStore((state) => state.setIgpQuote); const setIgpQuote = useStore((state) => state.setIgpQuote);
const { const { isLoading, isError, error, data } = useQuery({
isLoading,
isError: hasError,
data,
} = useQuery({
queryKey: ['useIgpQuote', route], queryKey: ['useIgpQuote', route],
queryFn: () => { queryFn: () => {
if (!route || isIbcOnlyRoute(route)) return null; if (!route || isIbcOnlyRoute(route)) return null;
@ -45,7 +42,9 @@ export function useIgpQuote(route?: Route) {
setIgpQuote(data || null); setIgpQuote(data || null);
}, [data, setIgpQuote]); }, [data, setIgpQuote]);
return { isLoading, hasError, igpQuote: data }; useToastError(error, 'Error fetching IGP quote');
return { isLoading, isError, igpQuote: data };
} }
export async function fetchIgpQuote(route: Route, adapter?: IHypTokenAdapter): Promise<IgpQuote> { export async function fetchIgpQuote(route: Route, adapter?: IHypTokenAdapter): Promise<IgpQuote> {

@ -1,4 +1,5 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { Analytics } from '@vercel/analytics/react';
import type { AppProps } from 'next/app'; import type { AppProps } from 'next/app';
import { ToastContainer, Zoom, toast } from 'react-toastify'; import { ToastContainer, Zoom, toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css'; import 'react-toastify/dist/ReactToastify.css';
@ -38,6 +39,7 @@ export default function App({ Component, pageProps }: AppProps) {
<QueryClientProvider client={reactQueryClient}> <QueryClientProvider client={reactQueryClient}>
<AppLayout> <AppLayout>
<Component {...pageProps} /> <Component {...pageProps} />
<Analytics />
</AppLayout> </AppLayout>
</QueryClientProvider> </QueryClientProvider>
<ToastContainer transition={Zoom} position={toast.POSITION.BOTTOM_RIGHT} limit={2} /> <ToastContainer transition={Zoom} position={toast.POSITION.BOTTOM_RIGHT} limit={2} />

@ -48,28 +48,11 @@ Scrollbar Overrides
=================== ===================
*/ */
html {
--scrollbarBG: rgba(255, 255, 255, 0);
--thumbBG: #dddddd;
}
body { body {
scroll-behavior: smooth; scroll-behavior: smooth;
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
}
::-webkit-scrollbar {
width: 8px;
height: 8px;
background-color: var(--scrollbarBG);
}
::-webkit-scrollbar-track {
background-color: var(--scrollbarBG);
}
::-webkit-scrollbar-thumb {
background-color: var(--thumbBG);
border-radius: 6px;
border: 3px solid var(--scrollbarBG);
} }
/* phones */ /* phones */
@media only screen and (max-width: 767px) { @media only screen and (max-width: 767px) {
::-webkit-scrollbar { ::-webkit-scrollbar {

@ -1,8 +1,22 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { captureException } from '@sentry/nextjs';
export const logger = { export const logger = {
debug: (...args: any[]) => console.debug(...args), debug: (...args: any[]) => console.debug(...args),
info: (...args: any[]) => console.info(...args), info: (...args: any[]) => console.info(...args),
warn: (...args: any[]) => console.warn(...args), warn: (...args: any[]) => console.warn(...args),
error: (...args: any[]) => console.error(...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 });
},
}; };
// First line of defense. Scrubbing is also configured in sentry.config.* files
function isSafeSentryArg(arg: any) {
if (typeof arg == 'number') return true;
if (typeof arg == 'string') return arg.length < 1000;
return false;
}

@ -3071,7 +3071,9 @@ __metadata:
"@hyperlane-xyz/utils": "npm:^3.5.1" "@hyperlane-xyz/utils": "npm:^3.5.1"
"@hyperlane-xyz/widgets": "npm:^3.1.4" "@hyperlane-xyz/widgets": "npm:^3.1.4"
"@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6" "@metamask/jazzicon": "https://github.com/jmrossy/jazzicon#7a8df28974b4e81129bfbe3cab76308b889032a6"
"@next/bundle-analyzer": "npm:^14.0.4"
"@rainbow-me/rainbowkit": "npm:1.3.0" "@rainbow-me/rainbowkit": "npm:1.3.0"
"@sentry/nextjs": "npm:^7.93.0"
"@solana/spl-token": "npm:^0.3.8" "@solana/spl-token": "npm:^0.3.8"
"@solana/wallet-adapter-base": "npm:^0.9.22" "@solana/wallet-adapter-base": "npm:^0.9.22"
"@solana/wallet-adapter-react": "npm:^0.15.32" "@solana/wallet-adapter-react": "npm:^0.15.32"
@ -3086,6 +3088,7 @@ __metadata:
"@types/react-dom": "npm:^18.2.4" "@types/react-dom": "npm:^18.2.4"
"@typescript-eslint/eslint-plugin": "npm:^6.14.0" "@typescript-eslint/eslint-plugin": "npm:^6.14.0"
"@typescript-eslint/parser": "npm:^6.14.0" "@typescript-eslint/parser": "npm:^6.14.0"
"@vercel/analytics": "npm:^1.1.1"
autoprefixer: "npm:^10.4.14" autoprefixer: "npm:^10.4.14"
bignumber.js: "npm:^9.1.1" bignumber.js: "npm:^9.1.1"
buffer: "npm:^6.0.3" buffer: "npm:^6.0.3"
@ -3460,7 +3463,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14":
version: 1.4.15 version: 1.4.15
resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
checksum: 89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 checksum: 89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09
@ -3905,6 +3908,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@next/bundle-analyzer@npm:^14.0.4":
version: 14.0.4
resolution: "@next/bundle-analyzer@npm:14.0.4"
dependencies:
webpack-bundle-analyzer: "npm:4.7.0"
checksum: 46224e08b20dffd0ff02d210ed527deddc189f054fb1501bca6d861f30c2bbcf5ede50f50c61401e2e865aede6ee736c1ce4ca0094ac14c839c2860cb13251ab
languageName: node
linkType: hard
"@next/env@npm:13.2.4": "@next/env@npm:13.2.4":
version: 13.2.4 version: 13.2.4
resolution: "@next/env@npm:13.2.4" resolution: "@next/env@npm:13.2.4"
@ -4308,6 +4320,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@polka/url@npm:^1.0.0-next.20":
version: 1.0.0-next.24
resolution: "@polka/url@npm:1.0.0-next.24"
checksum: 00baec4458ac86ca27edf7ce807ccfad97cd1d4b67bdedaf3401a9e755757588f3331e891290d1deea52d88df2bf2387caf8d94a6835b614d5b37b638a688273
languageName: node
linkType: hard
"@popperjs/core@npm:^2.9.3": "@popperjs/core@npm:^2.9.3":
version: 2.11.8 version: 2.11.8
resolution: "@popperjs/core@npm:2.11.8" resolution: "@popperjs/core@npm:2.11.8"
@ -4453,6 +4472,41 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/plugin-commonjs@npm:24.0.0":
version: 24.0.0
resolution: "@rollup/plugin-commonjs@npm:24.0.0"
dependencies:
"@rollup/pluginutils": "npm:^5.0.1"
commondir: "npm:^1.0.1"
estree-walker: "npm:^2.0.2"
glob: "npm:^8.0.3"
is-reference: "npm:1.2.1"
magic-string: "npm:^0.27.0"
peerDependencies:
rollup: ^2.68.0||^3.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: 0e29a5ed5cb7a1af15dad5df64b706168327dda696c072316fdb381ebeaec8aab0a84548c19a3ca39a61bcf2436055ea7f714edbe762f489a8aed4a0551c4bd7
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^5.0.1":
version: 5.1.0
resolution: "@rollup/pluginutils@npm:5.1.0"
dependencies:
"@types/estree": "npm:^1.0.0"
estree-walker: "npm:^2.0.2"
picomatch: "npm:^2.3.1"
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: abb15eaec5b36f159ec351b48578401bedcefdfa371d24a914cfdbb1e27d0ebfbf895299ec18ccc343d247e71f2502cba21202bc1362d7ef27d5ded699e5c2b2
languageName: node
linkType: hard
"@rushstack/eslint-patch@npm:^1.1.3": "@rushstack/eslint-patch@npm:^1.1.3":
version: 1.1.4 version: 1.1.4
resolution: "@rushstack/eslint-patch@npm:1.1.4" resolution: "@rushstack/eslint-patch@npm:1.1.4"
@ -4538,6 +4592,186 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry-internal/feedback@npm:7.93.0":
version: 7.93.0
resolution: "@sentry-internal/feedback@npm:7.93.0"
dependencies:
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: f266f8374c7039ddb6fe4d50edaad7e4c27a6004e0ca4df181b9d359b3cb97cea59f8dd097e13eb2228877ef252beccf5d2433cde35f788f637ed074d0f9b5f8
languageName: node
linkType: hard
"@sentry-internal/tracing@npm:7.93.0":
version: 7.93.0
resolution: "@sentry-internal/tracing@npm:7.93.0"
dependencies:
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: 26efc18b072b015fdea6606ad58a657e5dc3cdcc5b18ab320e34844c25d717a69b706a4ed4415373f6b71b22f22a7bf877d607e79836fcc3e115c33d23b50577
languageName: node
linkType: hard
"@sentry/browser@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/browser@npm:7.93.0"
dependencies:
"@sentry-internal/feedback": "npm:7.93.0"
"@sentry-internal/tracing": "npm:7.93.0"
"@sentry/core": "npm:7.93.0"
"@sentry/replay": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: 8cc27d219ca3ebf5c904535bb2a1b8807f04d99cfb7b8a13bf22930531488b0de66d45ee1dd2772e37112dd5cbc58f099e8334a6ab4712133baaad756c6ae9ce
languageName: node
linkType: hard
"@sentry/cli@npm:^1.77.1":
version: 1.77.1
resolution: "@sentry/cli@npm:1.77.1"
dependencies:
https-proxy-agent: "npm:^5.0.0"
mkdirp: "npm:^0.5.5"
node-fetch: "npm:^2.6.7"
progress: "npm:^2.0.3"
proxy-from-env: "npm:^1.1.0"
which: "npm:^2.0.2"
bin:
sentry-cli: bin/sentry-cli
checksum: 1fc951c9c2886f9e359d429c25e9f27eaf9c7df02f1bc9b0cc353dca4158de4832af1bdfc28e31ba69f93adc82d548572aa1b76fbae599df9d7d28cd6205f989
languageName: node
linkType: hard
"@sentry/core@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/core@npm:7.93.0"
dependencies:
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: 8604fa49dd3e82f7f40e537c4ea15ecf945efa36ed25cb65ee7868d6c7691b9639c5b76ea90987423ab0ab2ad5baa75397bf434f4a75535a1bd08e0f10442f01
languageName: node
linkType: hard
"@sentry/integrations@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/integrations@npm:7.93.0"
dependencies:
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
localforage: "npm:^1.8.1"
checksum: 0ca677fcae67c474f0927eef21950ccb26fc7a5790692acc9963c8eccaa6d464a9c6988bda6602de7739387f78e78ff0d3bcbff3244168578cb7549de6dddcbd
languageName: node
linkType: hard
"@sentry/nextjs@npm:^7.93.0":
version: 7.93.0
resolution: "@sentry/nextjs@npm:7.93.0"
dependencies:
"@rollup/plugin-commonjs": "npm:24.0.0"
"@sentry/core": "npm:7.93.0"
"@sentry/integrations": "npm:7.93.0"
"@sentry/node": "npm:7.93.0"
"@sentry/react": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
"@sentry/vercel-edge": "npm:7.93.0"
"@sentry/webpack-plugin": "npm:1.21.0"
chalk: "npm:3.0.0"
resolve: "npm:1.22.8"
rollup: "npm:2.78.0"
stacktrace-parser: "npm:^0.1.10"
peerDependencies:
next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0
react: 16.x || 17.x || 18.x
webpack: ">= 4.0.0"
peerDependenciesMeta:
webpack:
optional: true
checksum: f2ea02cee84058f9c617ca0fda5645e925a77591b7343ab9b2f11164719eb871657ce19d9060879e1a7c303ecc5fa3b72c2587ae6a656500038f307e0041c91d
languageName: node
linkType: hard
"@sentry/node@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/node@npm:7.93.0"
dependencies:
"@sentry-internal/tracing": "npm:7.93.0"
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
https-proxy-agent: "npm:^5.0.0"
checksum: a777838e5e6bdaadd6c00ec3964190349d9040fb4b5bffc95c1f7214a959c2972bbb4c3951f903df28ec26198a7fcb308fcaf13c4201d20b843c956133635017
languageName: node
linkType: hard
"@sentry/react@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/react@npm:7.93.0"
dependencies:
"@sentry/browser": "npm:7.93.0"
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
hoist-non-react-statics: "npm:^3.3.2"
peerDependencies:
react: 15.x || 16.x || 17.x || 18.x
checksum: 9a371b2ec980b60dce5ad9fdba8978cadd4b982ac7d39e9c60b91d074996f2e08567fe6f0dcce6ba59f6712f0e6b905d83279b31501f932e38ac7747f465cc98
languageName: node
linkType: hard
"@sentry/replay@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/replay@npm:7.93.0"
dependencies:
"@sentry-internal/tracing": "npm:7.93.0"
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: 54700f3ae869fca65610fea4752fced09cf76e63eb836f8291ad66dae2ca70b762d7c1ff584028606c8a7dea2edbe0c88c0fca04b74eaebc7357b3e966cfcff6
languageName: node
linkType: hard
"@sentry/types@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/types@npm:7.93.0"
checksum: 851480468ebe35f05b402fa954040bdc12f08bb5f820c149988c9108328c54a43e685bf85e8f94fc3a2c729ce41079bb3d7a78e757586b2cf2ac49e727b89669
languageName: node
linkType: hard
"@sentry/utils@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/utils@npm:7.93.0"
dependencies:
"@sentry/types": "npm:7.93.0"
checksum: 12442644235c797d787b28c2b8fbfa907806bbf31b42e50214d44d055fbbd218562f1bf12ac520eaea609c30594764860e2c117cbd9a5f2e2d03f0a74e4b9cda
languageName: node
linkType: hard
"@sentry/vercel-edge@npm:7.93.0":
version: 7.93.0
resolution: "@sentry/vercel-edge@npm:7.93.0"
dependencies:
"@sentry-internal/tracing": "npm:7.93.0"
"@sentry/core": "npm:7.93.0"
"@sentry/types": "npm:7.93.0"
"@sentry/utils": "npm:7.93.0"
checksum: a575423d586e79ff5432a9c522342d66da25fc1ec975497f28dfcb4f75c8b2b43b50d3cd2d53bcf823065c9cbe7d1e66799485ae77b67e270ed931400527e7a0
languageName: node
linkType: hard
"@sentry/webpack-plugin@npm:1.21.0":
version: 1.21.0
resolution: "@sentry/webpack-plugin@npm:1.21.0"
dependencies:
"@sentry/cli": "npm:^1.77.1"
webpack-sources: "npm:^2.0.0 || ^3.0.0"
checksum: fc28506d72ae6eeddd9b2e1eb3e79fc7d186d902c0193cdab3367c8f10bd29ff23a50c6117d34652eb6bd35812469f2a5a2ba5180c62a4ea9b9e36f3075b3ee1
languageName: node
linkType: hard
"@sinclair/typebox@npm:^0.27.8": "@sinclair/typebox@npm:^0.27.8":
version: 0.27.8 version: 0.27.8
resolution: "@sinclair/typebox@npm:0.27.8" resolution: "@sinclair/typebox@npm:0.27.8"
@ -5885,6 +6119,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:*, @types/estree@npm:^1.0.0":
version: 1.0.5
resolution: "@types/estree@npm:1.0.5"
checksum: 7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408
languageName: node
linkType: hard
"@types/graceful-fs@npm:^4.1.3": "@types/graceful-fs@npm:^4.1.3":
version: 4.1.6 version: 4.1.6
resolution: "@types/graceful-fs@npm:4.1.6" resolution: "@types/graceful-fs@npm:4.1.6"
@ -6372,6 +6613,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@vercel/analytics@npm:^1.1.1":
version: 1.1.1
resolution: "@vercel/analytics@npm:1.1.1"
dependencies:
server-only: "npm:^0.0.1"
checksum: fece944678360085a5deaea3afdade16cab67097dca6585e02a1c4c67ac3ba91b8e0bb848b7ec686b87757aad763df5bae41ce103bdc16c6e586b9390d0b4c11
languageName: node
linkType: hard
"@wagmi/chains@npm:^1.8.0": "@wagmi/chains@npm:^1.8.0":
version: 1.8.0 version: 1.8.0
resolution: "@wagmi/chains@npm:1.8.0" resolution: "@wagmi/chains@npm:1.8.0"
@ -7316,6 +7566,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"acorn-walk@npm:^8.0.0":
version: 8.3.2
resolution: "acorn-walk@npm:8.3.2"
checksum: 57dbe2fd8cf744f562431775741c5c087196cd7a65ce4ccb3f3981cdfad25cd24ad2bad404997b88464ac01e789a0a61e5e355b2a84876f13deef39fb39686ca
languageName: node
linkType: hard
"acorn-walk@npm:^8.1.1": "acorn-walk@npm:^8.1.1":
version: 8.2.0 version: 8.2.0
resolution: "acorn-walk@npm:8.2.0" resolution: "acorn-walk@npm:8.2.0"
@ -7323,6 +7580,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"acorn@npm:^8.0.4":
version: 8.11.3
resolution: "acorn@npm:8.11.3"
bin:
acorn: bin/acorn
checksum: b688e7e3c64d9bfb17b596e1b35e4da9d50553713b3b3630cf5690f2b023a84eac90c56851e6912b483fe60e8b4ea28b254c07e92f17ef83d72d78745a8352dd
languageName: node
linkType: hard
"acorn@npm:^8.10.0": "acorn@npm:^8.10.0":
version: 8.11.2 version: 8.11.2
resolution: "acorn@npm:8.11.2" resolution: "acorn@npm:8.11.2"
@ -8262,6 +8528,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chalk@npm:3.0.0":
version: 3.0.0
resolution: "chalk@npm:3.0.0"
dependencies:
ansi-styles: "npm:^4.1.0"
supports-color: "npm:^7.1.0"
checksum: 37f90b31fd655fb49c2bd8e2a68aebefddd64522655d001ef417e6f955def0ed9110a867ffc878a533f2dafea5f2032433a37c8a7614969baa7f8a1cd424ddfc
languageName: node
linkType: hard
"chalk@npm:^2.4.2": "chalk@npm:^2.4.2":
version: 2.4.2 version: 2.4.2
resolution: "chalk@npm:2.4.2" resolution: "chalk@npm:2.4.2"
@ -8273,7 +8549,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chalk@npm:^4.0.0, chalk@npm:^4.1.1": "chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1":
version: 4.1.2 version: 4.1.2
resolution: "chalk@npm:4.1.2" resolution: "chalk@npm:4.1.2"
dependencies: dependencies:
@ -8518,6 +8794,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"commander@npm:^7.2.0":
version: 7.2.0
resolution: "commander@npm:7.2.0"
checksum: 9973af10727ad4b44f26703bf3e9fdc323528660a7590efe3aa9ad5042b4584c0deed84ba443f61c9d6f02dade54a5a5d3c95e306a1e1630f8374ae6db16c06d
languageName: node
linkType: hard
"commondir@npm:^1.0.1":
version: 1.0.1
resolution: "commondir@npm:1.0.1"
checksum: 4620bc4936a4ef12ce7dfcd272bb23a99f2ad68889a4e4ad766c9f8ad21af982511934d6f7050d4a8bde90011b1c15d56e61a1b4576d9913efbf697a20172d6c
languageName: node
linkType: hard
"compute-scroll-into-view@npm:3.0.3": "compute-scroll-into-view@npm:3.0.3":
version: 3.0.3 version: 3.0.3
resolution: "compute-scroll-into-view@npm:3.0.3" resolution: "compute-scroll-into-view@npm:3.0.3"
@ -9037,6 +9327,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"duplexer@npm:^0.1.2":
version: 0.1.2
resolution: "duplexer@npm:0.1.2"
checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0
languageName: node
linkType: hard
"duplexify@npm:^4.1.2": "duplexify@npm:^4.1.2":
version: 4.1.2 version: 4.1.2
resolution: "duplexify@npm:4.1.2" resolution: "duplexify@npm:4.1.2"
@ -9558,6 +9855,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"estree-walker@npm:^2.0.2":
version: 2.0.2
resolution: "estree-walker@npm:2.0.2"
checksum: b02109c5d46bc2ed47de4990eef770f7457b1159a229f0999a09224d2b85ffeed2d7679cffcff90aeb4448e94b0168feb5265b209cdec29aad50a3d6e93d21e2
languageName: node
linkType: hard
"esutils@npm:^2.0.2": "esutils@npm:^2.0.2":
version: 2.0.3 version: 2.0.3
resolution: "esutils@npm:2.0.3" resolution: "esutils@npm:2.0.3"
@ -10237,6 +10541,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^8.0.3":
version: 8.1.0
resolution: "glob@npm:8.1.0"
dependencies:
fs.realpath: "npm:^1.0.0"
inflight: "npm:^1.0.4"
inherits: "npm:2"
minimatch: "npm:^5.0.1"
once: "npm:^1.3.0"
checksum: 9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e
languageName: node
linkType: hard
"globals@npm:^11.1.0": "globals@npm:^11.1.0":
version: 11.12.0 version: 11.12.0
resolution: "globals@npm:11.12.0" resolution: "globals@npm:11.12.0"
@ -10317,6 +10634,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"gzip-size@npm:^6.0.0":
version: 6.0.0
resolution: "gzip-size@npm:6.0.0"
dependencies:
duplexer: "npm:^0.1.2"
checksum: 2df97f359696ad154fc171dcb55bc883fe6e833bca7a65e457b9358f3cb6312405ed70a8da24a77c1baac0639906cd52358dc0ce2ec1a937eaa631b934c94194
languageName: node
linkType: hard
"h3@npm:^1.8.1, h3@npm:^1.8.2": "h3@npm:^1.8.1, h3@npm:^1.8.2":
version: 1.9.0 version: 1.9.0
resolution: "h3@npm:1.9.0" resolution: "h3@npm:1.9.0"
@ -10443,7 +10769,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": "hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2":
version: 3.3.2 version: 3.3.2
resolution: "hoist-non-react-statics@npm:3.3.2" resolution: "hoist-non-react-statics@npm:3.3.2"
dependencies: dependencies:
@ -10558,6 +10884,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"immediate@npm:~3.0.5":
version: 3.0.6
resolution: "immediate@npm:3.0.6"
checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62
languageName: node
linkType: hard
"immer@npm:^9.0.19": "immer@npm:^9.0.19":
version: 9.0.21 version: 9.0.21
resolution: "immer@npm:9.0.21" resolution: "immer@npm:9.0.21"
@ -10855,6 +11188,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-reference@npm:1.2.1":
version: 1.2.1
resolution: "is-reference@npm:1.2.1"
dependencies:
"@types/estree": "npm:*"
checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc
languageName: node
linkType: hard
"is-regex@npm:^1.1.4": "is-regex@npm:^1.1.4":
version: 1.1.4 version: 1.1.4
resolution: "is-regex@npm:1.1.4" resolution: "is-regex@npm:1.1.4"
@ -11809,6 +12151,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"lie@npm:3.1.1":
version: 3.1.1
resolution: "lie@npm:3.1.1"
dependencies:
immediate: "npm:~3.0.5"
checksum: c2c7d9dcc3a9aae641f41cde4e2e2cd571e4426b1f5915862781d77776672dcbca43461e16f4d382c9a300825c15e1a4923f1def3a5568d97577e077a3cecb44
languageName: node
linkType: hard
"lilconfig@npm:^2.0.5, lilconfig@npm:^2.1.0": "lilconfig@npm:^2.0.5, lilconfig@npm:^2.1.0":
version: 2.1.0 version: 2.1.0
resolution: "lilconfig@npm:2.1.0" resolution: "lilconfig@npm:2.1.0"
@ -11893,6 +12244,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"localforage@npm:^1.8.1":
version: 1.10.0
resolution: "localforage@npm:1.10.0"
dependencies:
lie: "npm:3.1.1"
checksum: d5c44be3a09169b013a3ebe252e678aaeb6938ffe72e9e12c199fd4307c1ec9d1a057ac2dfdfbb1379dfeec467a34ad0fc3ecd27489a2c43a154fb72b2822542
languageName: node
linkType: hard
"locate-path@npm:^2.0.0": "locate-path@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "locate-path@npm:2.0.0" resolution: "locate-path@npm:2.0.0"
@ -11973,7 +12333,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"lodash@npm:*, lodash@npm:^4.17.21": "lodash@npm:*, lodash@npm:^4.17.20, lodash@npm:^4.17.21":
version: 4.17.21 version: 4.17.21
resolution: "lodash@npm:4.17.21" resolution: "lodash@npm:4.17.21"
checksum: c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 checksum: c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532
@ -12053,6 +12413,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"magic-string@npm:^0.27.0":
version: 0.27.0
resolution: "magic-string@npm:0.27.0"
dependencies:
"@jridgewell/sourcemap-codec": "npm:^1.4.13"
checksum: 10a18a48d22fb14467d6cb4204aba58d6790ae7ba023835dc7a65e310cf216f042a17fab1155ba43e47117310a9b7c3fd3bb79f40be40f5124d6b1af9e96399b
languageName: node
linkType: hard
"make-dir@npm:^4.0.0": "make-dir@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "make-dir@npm:4.0.0" resolution: "make-dir@npm:4.0.0"
@ -12313,6 +12682,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"mkdirp@npm:^0.5.5":
version: 0.5.6
resolution: "mkdirp@npm:0.5.6"
dependencies:
minimist: "npm:^1.2.6"
bin:
mkdirp: bin/cmd.js
checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2
languageName: node
linkType: hard
"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
version: 1.0.4 version: 1.0.4
resolution: "mkdirp@npm:1.0.4" resolution: "mkdirp@npm:1.0.4"
@ -12362,6 +12742,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"mrmime@npm:^1.0.0":
version: 1.0.1
resolution: "mrmime@npm:1.0.1"
checksum: a157e833ffe76648ab2107319deeff024b80b136ec66c60fae9d339009a1bb72c57ec1feecfd6a905dfd3df29e2299e850bff84b69cad790cc9bd9ab075834d1
languageName: node
linkType: hard
"ms@npm:2.0.0": "ms@npm:2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "ms@npm:2.0.0" resolution: "ms@npm:2.0.0"
@ -12550,7 +12937,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-fetch@npm:^2.6.12": "node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7":
version: 2.7.0 version: 2.7.0
resolution: "node-fetch@npm:2.7.0" resolution: "node-fetch@npm:2.7.0"
dependencies: dependencies:
@ -12809,6 +13196,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"opener@npm:^1.5.2":
version: 1.5.2
resolution: "opener@npm:1.5.2"
bin:
opener: bin/opener-bin.js
checksum: 0504efcd6546e14c016a261f58a68acf9f2e5c23d84865d7d5470d5169788327ceaa5386253682f533b3fba4821748aa37ecb395f3dae7acb3261b9b22e36814
languageName: node
linkType: hard
"optionator@npm:^0.9.1": "optionator@npm:^0.9.1":
version: 0.9.1 version: 0.9.1
resolution: "optionator@npm:0.9.1" resolution: "optionator@npm:0.9.1"
@ -13294,6 +13690,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"progress@npm:^2.0.3":
version: 2.0.3
resolution: "progress@npm:2.0.3"
checksum: e6f0bcb71f716eee9dfac0fe8a2606e3704d6a64dd93baaf49fbadbc8499989a610fe14cf1bc6f61b6d6653c49408d94f4a94e124538084efd8e4cf525e0293d
languageName: node
linkType: hard
"promise-inflight@npm:^1.0.1": "promise-inflight@npm:^1.0.1":
version: 1.0.1 version: 1.0.1
resolution: "promise-inflight@npm:1.0.1" resolution: "promise-inflight@npm:1.0.1"
@ -13363,6 +13766,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
checksum: f0bb4a87cfd18f77bc2fba23ae49c3b378fb35143af16cc478171c623eebe181678f09439707ad80081d340d1593cd54a33a0113f3ccb3f4bc9451488780ee23
languageName: node
linkType: hard
"public-encrypt@npm:^4.0.0": "public-encrypt@npm:^4.0.0":
version: 4.0.3 version: 4.0.3
resolution: "public-encrypt@npm:4.0.3" resolution: "public-encrypt@npm:4.0.3"
@ -13928,7 +14338,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.2": "resolve@npm:1.22.8, resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.2":
version: 1.22.8 version: 1.22.8
resolution: "resolve@npm:1.22.8" resolution: "resolve@npm:1.22.8"
dependencies: dependencies:
@ -13954,7 +14364,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin<compat/resolve>": "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin<compat/resolve>":
version: 1.22.8 version: 1.22.8
resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d" resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
dependencies: dependencies:
@ -14015,6 +14425,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"rollup@npm:2.78.0":
version: 2.78.0
resolution: "rollup@npm:2.78.0"
dependencies:
fsevents: "npm:~2.3.2"
dependenciesMeta:
fsevents:
optional: true
bin:
rollup: dist/bin/rollup
checksum: 04034ced9df4681649302487bdafc2cac1391ccb38cdd42aa610508840762730d3fdcefddb333c3babe2dc70668392800b7493c282656b1fe883ba9137907930
languageName: node
linkType: hard
"rpc-websockets@npm:^7.5.1": "rpc-websockets@npm:^7.5.1":
version: 7.5.1 version: 7.5.1
resolution: "rpc-websockets@npm:7.5.1" resolution: "rpc-websockets@npm:7.5.1"
@ -14161,6 +14585,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"server-only@npm:^0.0.1":
version: 0.0.1
resolution: "server-only@npm:0.0.1"
checksum: c432348956641ea3f460af8dc3765f3a1bdbcf7a1e0205b0756d868e6e6fe8934cdee6bff68401a1dd49ba4a831c75916517a877446d54b334f7de36fa273e53
languageName: node
linkType: hard
"set-blocking@npm:^2.0.0": "set-blocking@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "set-blocking@npm:2.0.0" resolution: "set-blocking@npm:2.0.0"
@ -14214,6 +14645,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"sirv@npm:^1.0.7":
version: 1.0.19
resolution: "sirv@npm:1.0.19"
dependencies:
"@polka/url": "npm:^1.0.0-next.20"
mrmime: "npm:^1.0.0"
totalist: "npm:^1.0.0"
checksum: b6833ab4d41f5e449ffcb4d89caac45d97de4b246f984f9b9fa86a0107689562c22d24788b533a58a10cf2cfcebb7e6c678ffa84ac7d3392fca9d18b1bd7ee05
languageName: node
linkType: hard
"sisteransi@npm:^1.0.5": "sisteransi@npm:^1.0.5":
version: 1.0.5 version: 1.0.5
resolution: "sisteransi@npm:1.0.5" resolution: "sisteransi@npm:1.0.5"
@ -14364,6 +14806,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"stacktrace-parser@npm:^0.1.10":
version: 0.1.10
resolution: "stacktrace-parser@npm:0.1.10"
dependencies:
type-fest: "npm:^0.7.1"
checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee
languageName: node
linkType: hard
"standard-as-callback@npm:^2.1.0": "standard-as-callback@npm:^2.1.0":
version: 2.1.0 version: 2.1.0
resolution: "standard-as-callback@npm:2.1.0" resolution: "standard-as-callback@npm:2.1.0"
@ -14831,6 +15282,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"totalist@npm:^1.0.0":
version: 1.1.0
resolution: "totalist@npm:1.1.0"
checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc
languageName: node
linkType: hard
"tr46@npm:~0.0.3": "tr46@npm:~0.0.3":
version: 0.0.3 version: 0.0.3
resolution: "tr46@npm:0.0.3" resolution: "tr46@npm:0.0.3"
@ -14966,6 +15424,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"type-fest@npm:^0.7.1":
version: 0.7.1
resolution: "type-fest@npm:0.7.1"
checksum: 0699b6011bb3f7fac5fd5385e2e09432cde08fa89283f24084f29db00ec69a5445cd3aa976438ec74fc552a9a96f4a04ed390b5cb62eb7483aa4b6e5b935e059
languageName: node
linkType: hard
"typedarray-to-buffer@npm:3.1.5": "typedarray-to-buffer@npm:3.1.5":
version: 3.1.5 version: 3.1.5
resolution: "typedarray-to-buffer@npm:3.1.5" resolution: "typedarray-to-buffer@npm:3.1.5"
@ -15414,6 +15879,32 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"webpack-bundle-analyzer@npm:4.7.0":
version: 4.7.0
resolution: "webpack-bundle-analyzer@npm:4.7.0"
dependencies:
acorn: "npm:^8.0.4"
acorn-walk: "npm:^8.0.0"
chalk: "npm:^4.1.0"
commander: "npm:^7.2.0"
gzip-size: "npm:^6.0.0"
lodash: "npm:^4.17.20"
opener: "npm:^1.5.2"
sirv: "npm:^1.0.7"
ws: "npm:^7.3.1"
bin:
webpack-bundle-analyzer: lib/bin/analyzer.js
checksum: 761ffbe721be89f4c2951b04b5d8634cf2bea6edfed6d81d801f4fdbb60dfd271d9d2ba6781ea01697d4e6f4054e3d0a0a940eee947ffba22c69d180f16fb118
languageName: node
linkType: hard
"webpack-sources@npm:^2.0.0 || ^3.0.0":
version: 3.2.3
resolution: "webpack-sources@npm:3.2.3"
checksum: a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d
languageName: node
linkType: hard
"webrtc-adapter@npm:^7.2.1": "webrtc-adapter@npm:^7.2.1":
version: 7.7.1 version: 7.7.1
resolution: "webrtc-adapter@npm:7.7.1" resolution: "webrtc-adapter@npm:7.7.1"
@ -15584,7 +16075,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ws@npm:^7, ws@npm:^7.4.0, ws@npm:^7.4.5, ws@npm:^7.5.1": "ws@npm:^7, ws@npm:^7.3.1, ws@npm:^7.4.0, ws@npm:^7.4.5, ws@npm:^7.5.1":
version: 7.5.9 version: 7.5.9
resolution: "ws@npm:7.5.9" resolution: "ws@npm:7.5.9"
peerDependencies: peerDependencies:

Loading…
Cancel
Save