diff --git a/.changeset/hip-windows-whisper.md b/.changeset/hip-windows-whisper.md new file mode 100644 index 0000000000..71f17bb6fd --- /dev/null +++ b/.changeset/hip-windows-whisper.md @@ -0,0 +1,5 @@ +--- +"@talismn/balances": minor +--- + +update to new tokenRates shape diff --git a/.changeset/old-gorillas-compete.md b/.changeset/old-gorillas-compete.md new file mode 100644 index 0000000000..c7206fea18 --- /dev/null +++ b/.changeset/old-gorillas-compete.md @@ -0,0 +1,5 @@ +--- +"@talismn/token-rates": major +--- + +BREAKING - add market cap and 24h change diff --git a/.changeset/thirty-elephants-breathe.md b/.changeset/thirty-elephants-breathe.md new file mode 100644 index 0000000000..c74903ab26 --- /dev/null +++ b/.changeset/thirty-elephants-breathe.md @@ -0,0 +1,5 @@ +--- +"@talismn/util": minor +--- + +formatPrice utility diff --git a/apps/extension/package.json b/apps/extension/package.json index beac77566d..004c002487 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -71,6 +71,7 @@ "bignumber.js": "^9.1.2", "blueimp-md5": "2.19.0", "buffer": "^6.0.3", + "chart.js": "^4.4.7", "check-password-strength": "^2.0.10", "date-fns": "^4.1.0", "dcent-web-connector": "^0.16.0", diff --git a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/PortfolioAsset.tsx b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/PortfolioAsset.tsx index dc05d5e595..8ce56a98d3 100644 --- a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/PortfolioAsset.tsx +++ b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/PortfolioAsset.tsx @@ -1,17 +1,17 @@ -import { Token } from "@talismn/chaindata-provider" +import { Token, TokenId } from "@talismn/chaindata-provider" import { SendIcon } from "@talismn/icons" import { t } from "i18next" +import { uniq } from "lodash" import { FC, useEffect, useMemo } from "react" import { useTranslation } from "react-i18next" import { useParams } from "react-router-dom" import { Tooltip, TooltipContent, TooltipTrigger } from "talisman-ui" -import { Balances } from "@extension/core" import { Breadcrumb } from "@talisman/components/Breadcrumb" import { NavigateWithQuery } from "@talisman/components/NavigateWithQuery" -import { Fiat } from "@ui/domains/Asset/Fiat" -import { TokenLogo } from "@ui/domains/Asset/TokenLogo" +import { AssetPriceChart } from "@ui/domains/Asset/AssetPriceChart" import { DashboardAssetDetails } from "@ui/domains/Portfolio/AssetDetails" +import { DashboardPortfolioHeader } from "@ui/domains/Portfolio/DashboardPortfolioHeader" import { PortfolioToolbarButton } from "@ui/domains/Portfolio/PortfolioToolbarButton" import { Statistics } from "@ui/domains/Portfolio/Statistics" import { useDisplayBalances } from "@ui/domains/Portfolio/useDisplayBalances" @@ -23,7 +23,6 @@ import { import { useAnalytics } from "@ui/hooks/useAnalytics" import { useNavigateWithQuery } from "@ui/hooks/useNavigateWithQuery" import { useSendFundsPopup } from "@ui/hooks/useSendFundsPopup" -import { useUniswapV2LpTokenTotalValueLocked } from "@ui/hooks/useUniswapV2LpTokenTotalValueLocked" import { usePortfolio, useSetting } from "@ui/state" const HeaderRow: FC<{ @@ -33,6 +32,8 @@ const HeaderRow: FC<{ const { t } = useTranslation() const canHaveLockedState = Boolean(token?.chain?.id) + if (summary.totalTokens.isZero()) return null + return (
@@ -103,18 +104,12 @@ const SendFundsButton: FC<{ symbol: string }> = ({ symbol }) => { } const TokenBreadcrumb: FC<{ - balances: Balances symbol: string - token: Token | undefined - rate: number | null | undefined -}> = ({ balances, symbol, token, rate }) => { +}> = ({ symbol }) => { const { t } = useTranslation() const navigate = useNavigateWithQuery() - const isUniswapV2LpToken = token?.type === "evm-uniswapv2" - const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances) - const items = useMemo(() => { return [ { @@ -122,24 +117,11 @@ const TokenBreadcrumb: FC<{ onClick: () => navigate("/portfolio/tokens"), }, { - label: ( -
- -
{token?.symbol ?? symbol}
- {isUniswapV2LpToken && typeof tvl === "number" && ( -
- TVL -
- )} - {!isUniswapV2LpToken && typeof rate === "number" && ( - - )} -
- ), + label:
{symbol}
, onClick: undefined, }, ] - }, [t, token?.id, token?.symbol, symbol, isUniswapV2LpToken, tvl, rate, navigate]) + }, [t, symbol, navigate]) return (
@@ -149,10 +131,9 @@ const TokenBreadcrumb: FC<{ ) } -export const PortfolioAsset = () => { +const usePortfolioAsset = () => { const { symbol } = useParams() const { allBalances } = usePortfolio() - const { pageOpenEvent } = useAnalytics() const [isTestnet] = useSetting("useTestnets") const balances = useMemo( @@ -165,6 +146,13 @@ export const PortfolioAsset = () => { const { token, rate, summary } = useTokenBalancesSummary(balances) const balancesToDisplay = useDisplayBalances(balances) + return { symbol, token, rate, balances, balancesToDisplay, summary } +} + +export const PortfolioAsset = () => { + const { symbol, token, balancesToDisplay, summary } = usePortfolioAsset() + const { pageOpenEvent } = useAnalytics() + useEffect(() => { pageOpenEvent("portfolio asset", { symbol }) }, [pageOpenEvent, symbol]) @@ -173,9 +161,25 @@ export const PortfolioAsset = () => { return ( <> - + ) } + +export const PortfolioAssetHeader = () => { + const { balances } = usePortfolioAsset() + + // all tokenIds that match the symbol and have a coingeckoId + const tokenIds = useMemo(() => { + return uniq(balances.each.filter((b) => !!b.token?.coingeckoId).map((b) => b.token?.id)).filter( + Boolean, + ) as TokenId[] + }, [balances]) + + // no chart to display, use default header + if (!tokenIds.length) return + + return +} diff --git a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/Shared/PortfolioLayout.tsx b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/Shared/PortfolioLayout.tsx index 158274d07e..02e4229291 100644 --- a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/Shared/PortfolioLayout.tsx +++ b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/Shared/PortfolioLayout.tsx @@ -49,16 +49,15 @@ const PortfolioAccountCheck: FC = ({ children }) => { return <>{children} } -export const PortfolioLayout: FC = ({ - toolbar, - children, -}) => { +export const PortfolioLayout: FC< + PropsWithChildren & { toolbar?: ReactNode; header?: ReactNode } +> = ({ header, toolbar, children }) => { return (
} > - + {header ?? }
diff --git a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/index.tsx b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/index.tsx index 79dd24e2c0..90f2b11460 100644 --- a/apps/extension/src/ui/apps/dashboard/routes/Portfolio/index.tsx +++ b/apps/extension/src/ui/apps/dashboard/routes/Portfolio/index.tsx @@ -3,12 +3,13 @@ import { Route, Routes, useSearchParams } from "react-router-dom" import { NavigateWithQuery } from "@talisman/components/NavigateWithQuery" import { useBuyTokensModal } from "@ui/domains/Asset/Buy/useBuyTokensModal" +import { DashboardPortfolioHeader } from "@ui/domains/Portfolio/DashboardPortfolioHeader" import { PortfolioContainer } from "@ui/domains/Portfolio/PortfolioContainer" import { PortfolioToolbarNfts } from "@ui/domains/Portfolio/PortfolioToolbarNfts" import { PortfolioToolbarTokens } from "@ui/domains/Portfolio/PortfolioToolbarTokens" import { DashboardLayout } from "../../layout" -import { PortfolioAsset } from "./PortfolioAsset" +import { PortfolioAsset, PortfolioAssetHeader } from "./PortfolioAsset" import { PortfolioAssets } from "./PortfolioAssets" import { PortfolioNftCollection } from "./PortfolioNftCollection" import { PortfolioNfts } from "./PortfolioNfts" @@ -36,7 +37,7 @@ export const PortfolioRoutes = () => ( {/* share layout to prevent tabs flickering */} - }> + } header={}> } /> } /> @@ -55,3 +56,10 @@ const PortfolioToolbar = () => ( } /> ) + +const PortfolioHeader = () => ( + + } /> + } /> + +) diff --git a/apps/extension/src/ui/apps/popup/pages/Portfolio/PortfolioAsset.tsx b/apps/extension/src/ui/apps/popup/pages/Portfolio/PortfolioAsset.tsx index 6ea0584983..29902487da 100644 --- a/apps/extension/src/ui/apps/popup/pages/Portfolio/PortfolioAsset.tsx +++ b/apps/extension/src/ui/apps/popup/pages/Portfolio/PortfolioAsset.tsx @@ -1,25 +1,24 @@ +import { TokenId } from "@talismn/chaindata-provider" import { ChevronLeftIcon } from "@talismn/icons" +import { uniq } from "lodash" import { useCallback, useEffect, useMemo } from "react" import { useTranslation } from "react-i18next" import { Navigate, useNavigate, useParams } from "react-router-dom" import { IconButton } from "talisman-ui" import { Balances } from "@extension/core" +import { AssetPriceChart } from "@ui/domains/Asset/AssetPriceChart" import { Fiat } from "@ui/domains/Asset/Fiat" -import { TokenLogo } from "@ui/domains/Asset/TokenLogo" import { PopupAssetDetails } from "@ui/domains/Portfolio/AssetDetails" import { useDisplayBalances } from "@ui/domains/Portfolio/useDisplayBalances" import { usePortfolioNavigation } from "@ui/domains/Portfolio/usePortfolioNavigation" -import { useTokenBalancesSummary } from "@ui/domains/Portfolio/useTokenBalancesSummary" import { useAnalytics } from "@ui/hooks/useAnalytics" -import { useUniswapV2LpTokenTotalValueLocked } from "@ui/hooks/useUniswapV2LpTokenTotalValueLocked" import { useBalances, usePortfolio, useSelectedCurrency, useSetting } from "@ui/state" const PageContent = ({ balances, symbol }: { balances: Balances; symbol: string }) => { const navigate = useNavigate() const balancesToDisplay = useDisplayBalances(balances) const currency = useSelectedCurrency() - const { token, rate } = useTokenBalancesSummary(balancesToDisplay) const handleBackBtnClick = useCallback(() => navigate(-1), [navigate]) @@ -28,39 +27,28 @@ const PageContent = ({ balances, symbol }: { balances: Balances; symbol: string [balancesToDisplay.sum, currency], ) - const { t } = useTranslation() + const tokenIds = useMemo( + () => uniq(balancesToDisplay.each.map((b) => b.token?.id)).filter(Boolean) as TokenId[], + [balancesToDisplay], + ) - const isUniswapV2LpToken = token?.type === "evm-uniswapv2" - const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances) + const { t } = useTranslation() return ( <> -
+
-
- -
-
-
-
{symbol}
-
{t("Total")}
-
-
- {isUniswapV2LpToken && typeof tvl === "number" && ( - - )} - {!isUniswapV2LpToken && typeof rate === "number" && ( - - )} -
- -
-
+
{symbol}
+
+
{t("Total")}
+
-
+ +
+
diff --git a/apps/extension/src/ui/domains/Asset/AssetPrice.tsx b/apps/extension/src/ui/domains/Asset/AssetPrice.tsx new file mode 100644 index 0000000000..c0976ccafb --- /dev/null +++ b/apps/extension/src/ui/domains/Asset/AssetPrice.tsx @@ -0,0 +1,86 @@ +import { bind } from "@react-rxjs/core" +import { TokenId } from "@talismn/chaindata-provider" +import { classNames, formatPrice } from "@talismn/util" +import { FC } from "react" +import { combineLatest, map } from "rxjs" +import { Tooltip, TooltipContent, TooltipTrigger } from "talisman-ui" + +import { getTokenRates$, selectedCurrency$ } from "@ui/state" + +const [useDisplayAssetPrice] = bind((tokenId: TokenId | null | undefined) => + combineLatest([getTokenRates$(tokenId), selectedCurrency$]).pipe( + map(([rates, currency]) => { + const rate = rates?.[currency] + if (!rate) return null + + const compact = formatPrice(rate.price, currency, true) + + const full = formatPrice(rate.price, currency, false) + + const rawChange24h = rate.change24h + ? new Intl.NumberFormat(undefined, { + minimumFractionDigits: 1, + style: "percent", + signDisplay: "always", + }).format(rate.change24h / 100) + : undefined + + // we dont want a sign (which is used for color check) if change displays as +0.0% or -0.0% + const change24h = rawChange24h?.length + ? rawChange24h.slice(1) === "0.0%" + ? "0.0%" + : rawChange24h + : undefined + + return { + compact, + full, + change24h, + } + }), + ), +) + +export const AssetPrice: FC<{ + tokenId: TokenId | null | undefined + as?: "div" | "span" + className?: string + priceClassName?: string + changeClassName?: string + noTooltip?: boolean + noChange?: boolean +}> = ({ + as: Container = "div", + tokenId, + noTooltip, + noChange, + className, + priceClassName, + changeClassName, +}) => { + const price = useDisplayAssetPrice(tokenId) + + if (!price) return null + + return ( + + + + {price.compact} + {!noChange && price.change24h ? ( + + {price.change24h} + + ) : null} + + + {!noTooltip && {price.full}} + + ) +} diff --git a/apps/extension/src/ui/domains/Asset/AssetPriceChart.tsx b/apps/extension/src/ui/domains/Asset/AssetPriceChart.tsx new file mode 100644 index 0000000000..19e37a1e5a --- /dev/null +++ b/apps/extension/src/ui/domains/Asset/AssetPriceChart.tsx @@ -0,0 +1,584 @@ +import { Token, TokenId } from "@talismn/chaindata-provider" +import { CheckIcon, ChevronDownIcon, ExternalLinkIcon } from "@talismn/icons" +import { TokenRateCurrency } from "@talismn/token-rates" +import { classNames, formatPrice } from "@talismn/util" +import { useQuery } from "@tanstack/react-query" +import ChartJs, { ActiveElement, ChartComponentLike, ChartEvent } from "chart.js/auto" +import { fetchFromCoingecko } from "extension-core" +import { log } from "extension-shared" +import { uniq } from "lodash" +import { FC, useCallback, useEffect, useMemo, useRef, useState } from "react" +import { useTranslation } from "react-i18next" +import { IconButton, Popover, PopoverContent, PopoverTrigger, usePopoverContext } from "talisman-ui" + +import { useSelectedCurrency, useTokenRates, useTokenRatesMap, useTokensMap } from "@ui/state" + +import { AssetPrice } from "./AssetPrice" +import { TokenLogo } from "./TokenLogo" + +type ChartVariant = "small" | "large" + +export const AssetPriceChart: FC<{ + tokenIds: TokenId[] + variant: ChartVariant + className?: string +}> = ({ tokenIds, variant, className }) => { + const { t } = useTranslation() + const currency = useSelectedCurrency() + const tokensMap = useTokensMap() + const tokensWithCoingeckoId = useMemo( + () => tokenIds.map((id) => tokensMap[id]).filter((t) => !!t?.coingeckoId), + [tokenIds, tokensMap], + ) + + const selectedCurrency = useSelectedCurrency() + const tokenRates = useTokenRatesMap() + + // we want user to select a coingecko token, but we dont have this kind of object, so select a token and make sure each one is mapped to a unique coingeckoId + const selectableTokens = useMemo(() => { + if (!tokenRates) return [] + + const tokens = uniq((tokensWithCoingeckoId || []).map((t) => t.coingeckoId)) + .filter(Boolean) + .map((coingeckoId) => tokensWithCoingeckoId.find((t) => t.coingeckoId === coingeckoId)) + .filter(Boolean) as Token[] + + return tokens.sort((a, b) => { + // sort by descending market cap + const mc1 = tokenRates[a.id]?.[selectedCurrency]?.marketCap ?? 0 + const mc2 = tokenRates[b.id]?.[selectedCurrency]?.marketCap ?? 0 + return mc2 - mc1 + }) + }, [selectedCurrency, tokenRates, tokensWithCoingeckoId]) + + const [selectedTokenId, setSelectedTokenId] = useState( + selectableTokens[0]?.id ?? null, + ) + useEffect(() => { + // workaround empty button when changing account to one that doesnt have balance for the selecte done + if (!selectableTokens.find((t) => t.id === selectedTokenId) && selectableTokens.length) + setSelectedTokenId(selectableTokens[0].id) + }, [selectedTokenId, selectableTokens]) + + const coingeckoId = useMemo( + () => tokensWithCoingeckoId.find((t) => t.id === selectedTokenId)?.coingeckoId ?? null, + [selectedTokenId, tokensWithCoingeckoId], + ) + + const [timespan, setTimespan] = useState("D") + + const { data: prices, refetch } = useMarketChart(coingeckoId, currency, timespan) + + useEffect(() => { + // update graph if tokenRates data changes + log.debug("AssetPriceGraph refetch") + refetch() + }, [tokenRates, refetch]) + + const handleCoingeckoClick = useCallback(() => { + if (!coingeckoId) return + + window.open( + `https://www.coingecko.com/en/coins/${coingeckoId}`, + "_blank", + "noopener noreferrer", + ) + }, [coingeckoId]) + + const [hoveredValue, setHoveredValue] = useState(null) + const formattedHoveredValue = useMemo(() => { + return typeof hoveredValue === "number" ? formatPrice(hoveredValue, currency, true) : null + }, [hoveredValue, currency]) + + // Note : if prices array has only 1 entry, the token is in preview mode and we should not render the chart nor the price + const isValid = useMemo(() => !prices || prices.length > 1, [prices]) + + if (!selectedTokenId || !selectableTokens.length) return null + + return ( +
+
+ +
+ {isValid && ( +
+ {formattedHoveredValue ?? } +
+ )} + + + +
+
+ + {isValid && ( + <> +
+ {!!prices && ( + + )} + {/* use absolute position for buttons, above the graph, to not break the gradient */} +
+
+ +
+ + )} + {!isValid && ( +
+ {t("No price history")} +
+ )} +
+ ) +} + +type ChartSpan = "H" | "D" | "W" | "M" | "Y" | "A" + +type ChartSpanConfig = { + label: string + days: string // number as string, also supports "max" + time: boolean +} + +const CHART_TIMESPANS: Record = { + H: { + label: "1H", + days: "1", + time: true, + }, + D: { + label: "1D", + days: "2", + time: true, + }, + W: { + label: "1W", + days: "7", + time: true, + }, + M: { + label: "1M", + days: "30", + time: false, + }, + Y: { + label: "1Y", + days: "365", + time: false, + }, + A: { + label: "ALL", + days: "max", + time: false, + }, +} + +const useMarketChart = ( + coingeckoId: string | null, + currency: TokenRateCurrency, + timespan: ChartSpan, +) => { + return useQuery({ + queryKey: ["priceChart", coingeckoId, currency, timespan], + queryFn: async () => { + if (!coingeckoId) return null + const config = CHART_TIMESPANS[timespan] + + const query = new URLSearchParams({ + vs_currency: currency, + days: config.days, + }) + + const result = await fetchFromCoingecko( + `/api/v3/coins/${coingeckoId}/market_chart?${query.toString()}`, + ) + if (!result.ok) throw new Error("Failed to fetch market chart for " + coingeckoId) + + return result.json() as Promise<{ prices: [number, number][] }> + }, + select: (data) => { + switch (timespan) { + case "H": + return data?.prices.slice(-13) // interval is 5m, keep last 12 entries + current price + case "D": + return data?.prices.slice(-25) // interval is 1h, keep list 24 entries + current price + default: + return data?.prices // interval is 1d + } + }, + }) +} + +const verticalLinePlugin: ChartComponentLike = { + id: "verticalLine", + afterDatasetsDraw(chart) { + const { ctx, tooltip, chartArea } = chart + + if (tooltip && tooltip.opacity !== 0) { + ctx.save() + ctx.beginPath() + ctx.setLineDash([5, 5]) + ctx.strokeStyle = "rgba(213, 255, 92, 0.5)" + ctx.lineWidth = 1 + ctx.moveTo(tooltip.caretX, tooltip.y + tooltip.height + 5) // start below the tooltip + ctx.lineTo(tooltip.caretX, chartArea.bottom) + ctx.stroke() + ctx.restore() + } + }, +} + +ChartJs.register(verticalLinePlugin) + +const Chart: FC<{ + prices: [number, number][] + timespan: ChartSpan + variant: ChartVariant + onHoverValueChange: (price: number | null) => void +}> = ({ prices, timespan, variant, onHoverValueChange }) => { + const refChart = useRef(null) + const currency = useSelectedCurrency() + + useEffect(() => { + const canvas = refChart.current + if (!canvas) return + + const ctx = canvas.getContext("2d") + if (!ctx) return + + // set min boundaries for y axis to ensure that timespan selector isn't drawn on the price line + const allPrices = prices.map(([, price]) => price) + const minPrice = Math.min(...allPrices) + const maxPrice = Math.max(...allPrices) + const suggestedMin = minPrice - (maxPrice - minPrice) * 0.25 + + // sometimes chart's onHover is called after mouse has left the canvas, so we need to track this + let isHovering = false + + const onMouseEnter = () => { + isHovering = true + } + const onMouseLeave = () => { + isHovering = false + onHoverValueChange(null) + } + + canvas.addEventListener("mouseenter", onMouseEnter) + canvas.addEventListener("mouseleave", onMouseLeave) + + const onHover = (event: ChartEvent, elements: ActiveElement[]) => { + if (!isHovering || !elements.length) return + try { + const element = elements[0] + const price = allPrices[element.index] + onHoverValueChange(price) + } catch (e) { + log.warn("Failed to read hovered price", { event, elements }) + onHoverValueChange(null) + } + } + + // Create a gradient + const gradient = ctx.createLinearGradient(0, 0, 0, ctx.canvas.height) + gradient.addColorStop(0, "rgba(213, 255, 92, 0.2)") // Start color (top) + gradient.addColorStop(1, "rgba(213, 255, 92, 0)") // End color (bottom) + + const chart = new ChartJs(canvas, { + type: "line", + options: { + onHover, + maintainAspectRatio: false, + responsive: true, + animation: false, + layout: { + padding: { + top: 0, + bottom: 0, + left: 0, + right: 0, + }, + }, + interaction: { + // controls activeElements for onHover + mode: "index", + intersect: false, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + enabled: true, + mode: "index", + intersect: false, + displayColors: false, + backgroundColor: "#2E3221", + titleColor: "#d5ff5c", + titleFont: { + size: variant === "large" ? 14 : 12, + weight: 400, + }, + titleMarginBottom: 0, + caretSize: 0, + caretPadding: 40, + yAlign: "bottom", + callbacks: { + title: function (tooltipItems) { + const date = new Date(tooltipItems[0].label) + return CHART_TIMESPANS[timespan].time + ? `${date.toLocaleDateString(undefined, { dateStyle: "short" })} ${date.toLocaleTimeString(undefined, { timeStyle: "short" })}` + : date.toLocaleDateString(undefined, { dateStyle: "short" }) + }, + label: function () { + return "" + }, + }, + }, + }, + scales: { + x: { + ticks: { + display: false, + align: "start", + }, + grid: { + display: false, + drawTicks: false, + }, + }, + y: { + suggestedMin, + ticks: { + display: false, + align: "start", + }, + grid: { + display: false, + drawTicks: false, + }, + }, + }, + }, + + data: { + labels: prices.map(([timestamp]) => new Date(timestamp)), + datasets: [ + { + label: "Price", + data: allPrices, + borderColor: "#d5ff5c", + pointRadius: 0, + tension: 0.1, + fill: true, + backgroundColor: gradient, + borderWidth: 2, + }, + ], + }, + }) + + return () => { + canvas.removeEventListener("mouseenter", onMouseEnter) + canvas.removeEventListener("mouseleave", onMouseLeave) + chart.destroy() + } + }, [currency, onHoverValueChange, prices, refChart, timespan, variant]) + + return +} + +const TimespanSelect: FC<{ + value: ChartSpan + variant: ChartVariant + onChange: (value: ChartSpan) => void + className?: string +}> = ({ value, variant, onChange, className }) => { + return ( +
+ {Object.entries(CHART_TIMESPANS).map(([key, { label }]) => ( + + ))} +
+ ) +} + +const TokenSelect: FC<{ + tokens: Token[] + value: TokenId + variant: ChartVariant + onChange: (tokenId: TokenId) => void +}> = ({ tokens, value, variant, onChange }) => { + const token = useMemo(() => tokens.find((t) => t.id === value), [tokens, value]) + + if (!token || !tokens.length) return null + + if (tokens.length === 1) + return ( +
+
+ +
+ {token.symbol} +
+ ) + + return ( + + + + + +
+ {tokens.map((t) => ( + onChange(t.id)} + /> + ))} +
+
+
+ ) +} + +const TokenSelectOption: FC<{ token: Token; selected: boolean; onClick: () => void }> = ({ + token, + selected, + onClick, +}) => { + const { t } = useTranslation() + const { setOpen } = usePopoverContext() + + const handleClick = useCallback(() => { + onClick() + setOpen(false) + }, [setOpen, onClick]) + + return ( + + ) +} + +const MarketCap: FC<{ tokenId: TokenId }> = ({ tokenId }) => { + const { t } = useTranslation() + const tokenRates = useTokenRates(tokenId) + const currency = useSelectedCurrency() + + const display = useMemo( + () => + tokenRates?.[currency]?.marketCap + ? new Intl.NumberFormat(undefined, { + maximumSignificantDigits: 4, + style: "currency", + currency, + currencyDisplay: currency === "usd" ? "narrowSymbol" : "symbol", + notation: "compact", + }).format(tokenRates[currency].marketCap) + : t("unknown"), + [tokenRates, currency, t], + ) + + return {display} +} diff --git a/apps/extension/src/ui/domains/Portfolio/AssetDetails/DashboardAssetDetails.tsx b/apps/extension/src/ui/domains/Portfolio/AssetDetails/DashboardAssetDetails.tsx index 4c22041eb3..9de4ab6091 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetDetails/DashboardAssetDetails.tsx +++ b/apps/extension/src/ui/domains/Portfolio/AssetDetails/DashboardAssetDetails.tsx @@ -1,4 +1,4 @@ -import { ChainId, EvmNetworkId, TokenId } from "@talismn/chaindata-provider" +import { TokenId } from "@talismn/chaindata-provider" import { ZapOffIcon } from "@talismn/icons" import { classNames } from "@talismn/util" import { formatDuration, intervalToDuration } from "date-fns" @@ -27,7 +27,7 @@ import { PortfolioAccount } from "./PortfolioAccount" import { SendFundsButton } from "./SendFundsIconButton" import { TokenContextMenu } from "./TokenContextMenu" import { useAssetDetails } from "./useAssetDetails" -import { DetailRow, useChainTokenBalances } from "./useChainTokenBalances" +import { BalanceDetailRow, useTokenBalances } from "./useTokenBalances" import { useUniswapV2BalancePair } from "./useUniswapV2BalancePair" const AssetState = ({ @@ -72,18 +72,15 @@ const AssetState = ({ ) } -type AssetRowProps = { - chainId: ChainId | EvmNetworkId - balances: Balances -} - -const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { +const TokenBalances: FC<{ tokenId: TokenId; balances: Balances }> = ({ tokenId, balances }) => { const { t } = useTranslation() - const { chainOrNetwork, summary, symbol, tokenId, detailRows, status, networkType } = - useChainTokenBalances({ chainId, balances }) + const { chainOrNetwork, summary, token, detailRows, status, networkType } = useTokenBalances({ + tokenId, + balances, + }) // wait for data to load - if (!chainOrNetwork || !summary || !symbol || balances.count === 0) return null + if (!chainOrNetwork || !summary || !token || balances.count === 0) return null const isUniswapV2LpToken = balances.sorted[0]?.source === "evm-uniswapv2" @@ -105,7 +102,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { {chainOrNetwork.name} }> - + {tokenId && ( { render={summary.lockedTokens.gt(0)} tokens={summary.lockedTokens} fiat={summary.lockedFiat} - symbol={symbol} + symbol={token.symbol} tooltip={t("Total Locked Balance")} balancesStatus={status} className={classNames( @@ -138,7 +135,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { render tokens={summary.availableTokens} fiat={summary.availableFiat} - symbol={symbol} + symbol={token.symbol} tooltip={t("Total Available Balance")} balancesStatus={status} className={classNames( @@ -166,7 +163,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { key={row.key} row={row} isLastRow={rows.length === i + 1} - symbol={symbol} + symbol={token.symbol} status={status} tokenId={tokenId} /> @@ -251,7 +248,7 @@ const ChainTokenBalancesDetailRow = ({ symbol, tokenId, }: { - row: DetailRow + row: BalanceDetailRow isLastRow?: boolean status: BalancesStatus symbol: string @@ -358,20 +355,18 @@ const LockedExtra: FC<{ ) } -type AssetsTableProps = { - balances: Balances - symbol: string -} - -export const DashboardAssetDetails = ({ balances, symbol }: AssetsTableProps) => { - const { balancesByChain: rows } = useAssetDetails(balances) +export const DashboardAssetDetails: FC<{ balances: Balances; symbol: string }> = ({ + balances, + symbol, +}) => { + const { balancesByToken } = useAssetDetails(balances) - if (rows.length === 0) return + if (balancesByToken.length === 0) return return (
- {rows.map(([chainId, bal]) => ( - + {balancesByToken.map(([tokenId, bal]) => ( + ))}
) diff --git a/apps/extension/src/ui/domains/Portfolio/AssetDetails/PopupAssetDetails.tsx b/apps/extension/src/ui/domains/Portfolio/AssetDetails/PopupAssetDetails.tsx index 80e0b7cb09..813301bb4e 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetDetails/PopupAssetDetails.tsx +++ b/apps/extension/src/ui/domains/Portfolio/AssetDetails/PopupAssetDetails.tsx @@ -6,7 +6,7 @@ import { FC, Suspense, useCallback, useMemo } from "react" import { useTranslation } from "react-i18next" import { PillButton, Tooltip, TooltipContent, TooltipTrigger } from "talisman-ui" -import { Balance, Balances, ChainId, EvmNetworkId } from "@extension/core" +import { Balance, Balances } from "@extension/core" import { FadeIn } from "@talisman/components/FadeIn" import { SuspenseTracker } from "@talisman/components/SuspenseTracker" import { api } from "@ui/api" @@ -30,20 +30,17 @@ import { PortfolioAccount } from "./PortfolioAccount" import { SendFundsButton } from "./SendFundsIconButton" import { TokenContextMenu } from "./TokenContextMenu" import { useAssetDetails } from "./useAssetDetails" -import { DetailRow, useChainTokenBalances } from "./useChainTokenBalances" +import { BalanceDetailRow, useTokenBalances } from "./useTokenBalances" import { useUniswapV2BalancePair } from "./useUniswapV2BalancePair" -type AssetRowProps = { - chainId: ChainId | EvmNetworkId - balances: Balances -} - -const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { - const { chainOrNetwork, summary, symbol, tokenId, detailRows, status, networkType } = - useChainTokenBalances({ chainId, balances }) +const TokenBalances: FC<{ tokenId: TokenId; balances: Balances }> = ({ tokenId, balances }) => { + const { chainOrNetwork, summary, token, detailRows, status, networkType } = useTokenBalances({ + tokenId, + balances, + }) // wait for data to load - if (!chainOrNetwork || !summary || !symbol || balances.count === 0) return null + if (!chainOrNetwork || !summary || !token || balances.count === 0) return null const isUniswapV2LpToken = balances.sorted[0]?.source === "evm-uniswapv2" @@ -65,7 +62,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { {chainOrNetwork.name} }> - +
@@ -91,7 +88,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { balances.sorted .filter((balance) => balance.total.planck > 0n) .map((balance, i, balances) => ( - { detailRows .filter((row) => row.tokens.gt(0)) .map((row, i, rows) => ( - @@ -115,7 +112,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => { ) } -const ChainTokenBalancesUniswapV2Row = ({ +const TokenBalancesUniswapV2Row = ({ balance, isLastBalance, status, @@ -184,18 +181,18 @@ const ChainTokenBalancesUniswapV2Row = ({ ) } -const ChainTokenBalancesDetailRow = ({ +const TokenBalancesDetailRow = ({ row, isLastRow, status, symbol, tokenId, }: { - row: DetailRow + row: BalanceDetailRow isLastRow?: boolean status: BalancesStatus symbol: string - tokenId?: TokenId // unsafe, there could be multiple aggregated here + tokenId?: TokenId }) => (
{ const { t } = useTranslation() const { selectedAccount, selectedFolder } = usePortfolioNavigation() @@ -370,8 +362,11 @@ const NoTokens = ({ symbol }: { symbol: string }) => { ) } -export const PopupAssetDetails = ({ balances, symbol }: AssetsTableProps) => { - const { balancesByChain: rows } = useAssetDetails(balances) +export const PopupAssetDetails: FC<{ + balances: Balances + symbol: string +}> = ({ balances, symbol }) => { + const { balancesByToken: rows } = useAssetDetails(balances) const hasBalance = useMemo( () => rows.some(([, balances]) => balances.each.some((b) => b.total.planck > 0n)), [rows], @@ -382,8 +377,8 @@ export const PopupAssetDetails = ({ balances, symbol }: AssetsTableProps) => { return (
- {rows.map(([chainId, bal]) => ( - + {rows.map(([tokenId, bal]) => ( + ))}
diff --git a/apps/extension/src/ui/domains/Portfolio/AssetDetails/useAssetDetails.ts b/apps/extension/src/ui/domains/Portfolio/AssetDetails/useAssetDetails.ts index 3500163ac9..3e837000e0 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetDetails/useAssetDetails.ts +++ b/apps/extension/src/ui/domains/Portfolio/AssetDetails/useAssetDetails.ts @@ -1,30 +1,33 @@ +import { TokenId } from "@talismn/chaindata-provider" +import { uniq } from "lodash" import { useMemo } from "react" -import { Balances, ChainId, EvmNetworkId } from "@extension/core" -import { usePortfolio } from "@ui/state" +import { Balances } from "@extension/core" +import { usePortfolio, useSelectedCurrency } from "@ui/state" export const useAssetDetails = (balances: Balances) => { const { hydrate } = usePortfolio() + const currency = useSelectedCurrency() - const chainIds = useMemo>( - () => [...new Set(balances.each.flatMap((b) => b.chainId ?? b.evmNetworkId ?? []))], + const tokenIds = useMemo( + () => uniq(balances.each.map((b) => b.tokenId)), [balances.each], ) - const balancesByChain = useMemo( + const balancesByToken = useMemo( () => - chainIds - .map<[ChainId | EvmNetworkId, Balances]>((chainId) => [ - chainId, - new Balances( - balances.find((b) => b.chainId === chainId || b.evmNetworkId === chainId), - hydrate, - ), + tokenIds + .map<[TokenId, Balances]>((tokenId) => [ + tokenId, + new Balances(balances.find({ tokenId }), hydrate), ]) - .sort(([aChainId, aBalances], [bChainId, bBalances]) => { - // sort by planck value (in asset details all values are of the same token) - if (aBalances.sum.planck.total > bBalances.sum.planck.total) return -1 - if (aBalances.sum.planck.total < bBalances.sum.planck.total) return 1 + .sort(([aTokenId, aBalances], [bTokenId, bBalances]) => { + const aTotal = aBalances.sum.fiat(currency).total + const bTotal = bBalances.sum.fiat(currency).total + + // sort by fiat value + if (aTotal > bTotal) return -1 + if (aTotal < bTotal) return 1 // sort by "has a balance or not" (values don't matter) const aHasBalance = !!aBalances.each.find((b) => b.transferable.planck > 0n) @@ -33,16 +36,16 @@ export const useAssetDetails = (balances: Balances) => { if (!aHasBalance && bHasBalance) return 1 // polkadot and kusama should appear first - if (aChainId.toLowerCase() === "polkadot") return -1 - if (bChainId.toLowerCase() === "polkadot") return 1 - if (aChainId.toLowerCase() === "kusama") return -1 - if (bChainId.toLowerCase() === "kusama") return 1 + if (aTokenId.toLowerCase() === "polkadot-substrate-native") return -1 + if (bTokenId.toLowerCase() === "polkadot-substrate-native") return 1 + if (aTokenId.toLowerCase() === "kusama-substrate-native") return -1 + if (bTokenId.toLowerCase() === "kusama-substrate-native") return 1 // keep alphabetical sort return 0 }), - [balances, chainIds, hydrate], + [balances, currency, hydrate, tokenIds], ) - return { balancesByChain } + return { balancesByToken } } diff --git a/apps/extension/src/ui/domains/Portfolio/AssetDetails/useChainTokenBalances.ts b/apps/extension/src/ui/domains/Portfolio/AssetDetails/useTokenBalances.ts similarity index 90% rename from apps/extension/src/ui/domains/Portfolio/AssetDetails/useChainTokenBalances.ts rename to apps/extension/src/ui/domains/Portfolio/AssetDetails/useTokenBalances.ts index b08ac072fb..cd3615947f 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetDetails/useChainTokenBalances.ts +++ b/apps/extension/src/ui/domains/Portfolio/AssetDetails/useTokenBalances.ts @@ -1,5 +1,5 @@ import { BalanceLockType, filterBaseLocks, getLockTitle } from "@talismn/balances" -import { ChainId, EvmNetworkId } from "@talismn/chaindata-provider" +import { TokenId } from "@talismn/chaindata-provider" import BigNumber from "bignumber.js" import { useMemo } from "react" import { useTranslation } from "react-i18next" @@ -10,12 +10,12 @@ import { cleanupNomPoolName } from "@ui/domains/Staking/helpers" import { useGetBittensorValidators } from "@ui/domains/Staking/hooks/bittensor/useGetBittensorValidator" import { useBalancesStatus } from "@ui/hooks/useBalancesStatus" import { useNetworkCategory } from "@ui/hooks/useNetworkCategory" -import { useChain, useSelectedCurrency } from "@ui/state" +import { useChain, useSelectedCurrency, useToken } from "@ui/state" import { usePortfolioNavigation } from "../usePortfolioNavigation" import { useTokenBalancesSummary } from "../useTokenBalancesSummary" -export type DetailRow = { +export type BalanceDetailRow = { key: string | BalanceLockType title: string description?: string @@ -27,20 +27,22 @@ export type DetailRow = { isLoading?: boolean } -type ChainTokenBalancesParams = { - chainId: ChainId | EvmNetworkId +type TokenBalancesParams = { + tokenId: TokenId balances: Balances } -export const useChainTokenBalances = ({ chainId, balances }: ChainTokenBalancesParams) => { - const { t } = useTranslation() - const currency = useSelectedCurrency() - const chain = useChain(chainId) +export const useTokenBalances = ({ tokenId, balances }: TokenBalancesParams) => { + const token = useToken(tokenId) + const chain = useChain(token?.chain?.id) const { selectedAccount: account } = usePortfolioNavigation() - const { summary, tokenBalances, token } = useTokenBalancesSummary(balances) + const { summary, tokenBalances } = useTokenBalancesSummary(balances) + const { t } = useTranslation() + + const currency = useSelectedCurrency() - const rawDetailRows = useMemo((): DetailRow[] => { + const rawDetailRows = useMemo((): BalanceDetailRow[] => { if (!summary) return [] // AVAILABLE @@ -156,8 +158,7 @@ export const useChainTokenBalances = ({ chainId, balances }: ChainTokenBalancesP return { summary, - tokenId: token?.id, // there could be more than one token with same symbol, use this only for icon - symbol: token?.symbol, + token, detailRows, evmNetwork, chain, @@ -167,7 +168,7 @@ export const useChainTokenBalances = ({ chainId, balances }: ChainTokenBalancesP } } -const useEnhanceDetailRows = (detailRows: DetailRow[]) => { +const useEnhanceDetailRows = (detailRows: BalanceDetailRow[]) => { // fetch the validator name for each subtensor staking lock, so we can display it in the description const hotkeys = useMemo(() => { return detailRows @@ -187,7 +188,7 @@ const useEnhanceDetailRows = (detailRows: DetailRow[]) => { ...row, description: validators?.find((v) => v?.hotkey.ss58 === row.meta.hotkey)?.name, isLoading: isLoadingValidators, - } as DetailRow + } as BalanceDetailRow return row }) diff --git a/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetRow.tsx b/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetRow.tsx index 704a8d20a4..b634230f05 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetRow.tsx +++ b/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetRow.tsx @@ -4,6 +4,7 @@ import { FC, useCallback } from "react" import { useTranslation } from "react-i18next" import { Balances } from "@extension/core" +import { AssetPrice } from "@ui/domains/Asset/AssetPrice" import { Fiat } from "@ui/domains/Asset/Fiat" import { BondPillButton } from "@ui/domains/Staking/Bond/BondPillButton" import { useBondButton } from "@ui/domains/Staking/Bond/useBondButton" @@ -37,7 +38,7 @@ export const AssetRow: FC<{ balances: Balances; noCountUp?: boolean }> = ({ }, [genericEvent, navigate, token]) const isUniswapV2LpToken = token?.type === "evm-uniswapv2" - const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances) + const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate?.price, balances) const { canBondNomPool } = useBondButton({ tokenId: token?.id, balances }) @@ -77,8 +78,8 @@ export const AssetRow: FC<{ balances: Balances; noCountUp?: boolean }> = ({ TVL
)} - {!isUniswapV2LpToken && typeof rate === "number" && ( - + {!isUniswapV2LpToken && !!rate && ( + )}
diff --git a/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetsTable.tsx b/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetsTable.tsx index 569018b6dc..a8bd7add24 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetsTable.tsx +++ b/apps/extension/src/ui/domains/Portfolio/AssetsTable/DashboardAssetsTable.tsx @@ -54,6 +54,8 @@ const HeaderRow = () => { unavailable: locked, } = useMemo(() => balances.sum.fiat(currency), [balances.sum, currency]) + if (!balances.count) return null + return (
diff --git a/apps/extension/src/ui/domains/Portfolio/AssetsTable/PopupAssetsTable.tsx b/apps/extension/src/ui/domains/Portfolio/AssetsTable/PopupAssetsTable.tsx index 926535a522..2a5d06cab1 100644 --- a/apps/extension/src/ui/domains/Portfolio/AssetsTable/PopupAssetsTable.tsx +++ b/apps/extension/src/ui/domains/Portfolio/AssetsTable/PopupAssetsTable.tsx @@ -9,6 +9,7 @@ import { Accordion, AccordionIcon } from "@talisman/components/Accordion" import { FadeIn } from "@talisman/components/FadeIn" import { useScrollContainer } from "@talisman/components/ScrollContainer" import { useOpenClose } from "@talisman/hooks/useOpenClose" +import { AssetPrice } from "@ui/domains/Asset/AssetPrice" import { Fiat } from "@ui/domains/Asset/Fiat" import Tokens from "@ui/domains/Asset/Tokens" import { BondPillButton } from "@ui/domains/Staking/Bond/BondPillButton" @@ -87,7 +88,7 @@ const AssetRow: FC<{ const { t } = useTranslation() const isUniswapV2LpToken = token?.type === "evm-uniswapv2" - const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances) + const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate?.price, balances) const { canBondNomPool } = useBondButton({ tokenId: token?.id, balances }) const showStakingButton = canBondNomPool && !locked @@ -126,9 +127,7 @@ const AssetRow: FC<{ TVL
)} - {!isUniswapV2LpToken && typeof rate === "number" && ( - - )} + {!isUniswapV2LpToken && }
{ - const tokenIds = balances.each.map((t) => t.tokenId) - const matches = tokens?.filter((t) => tokenIds.includes(t.id)) +const useBestTokenForSymbol = (balances: Balances) => { + const { tokens, chains } = usePortfolio() + const currency = useSelectedCurrency() - return ( - // priority to token from a relay chain - // mainnet relay native - matches?.find( - (t) => - !t.isTestnet && - ["substrate-native", "evm-native"].includes(t.type) && - chains?.find((c) => !c.relay && c.id === t.chain?.id), - ) ?? - // mainnet solo/para native - matches?.find((t) => !t.isTestnet && ["substrate-native", "evm-native"].includes(t.type)) ?? - // mainnet which has an image - matches?.find((t) => !t.isTestnet && t.logo) ?? - // testnet relay - matches?.find( - (t) => - t.isTestnet && - ["substrate-native", "evm-native"].includes(t.type) && - chains?.find((c) => !c.relay && c.id === t.chain?.id), - ) ?? - // testnet solo/para native - matches?.find((t) => t.isTestnet && ["substrate-native", "evm-native"].includes(t.type)) ?? - // testnet which has an image - matches?.find((t) => t.isTestnet && t.logo) ?? - // fallback - matches?.[0] - ) + return useMemo(() => { + // use best token by market cap, if any + const balancesByMarketCap = balances.each + .filter((b) => !!b.rates?.[currency]?.marketCap) + .sort((a, b) => (b.rates?.[currency]?.marketCap ?? 0) - (a.rates?.[currency]?.marketCap ?? 0)) + + if (balancesByMarketCap.length) { + const token = tokens?.find((t) => t.id === balancesByMarketCap[0].tokenId) + if (token) return token + } + + const tokenIds = balances.each.map((t) => t.tokenId) + const matches = tokens?.filter((t) => tokenIds.includes(t.id)) + + return ( + // priority to token from a relay chain + // mainnet relay native + matches?.find( + (t) => + !t.isTestnet && + ["substrate-native", "evm-native"].includes(t.type) && + chains?.find((c) => !c.relay && c.id === t.chain?.id), + ) ?? + // mainnet solo/para native + matches?.find((t) => !t.isTestnet && ["substrate-native", "evm-native"].includes(t.type)) ?? + // mainnet which has an image + matches?.find((t) => !t.isTestnet && t.logo) ?? + // testnet relay + matches?.find( + (t) => + t.isTestnet && + ["substrate-native", "evm-native"].includes(t.type) && + chains?.find((c) => !c.relay && c.id === t.chain?.id), + ) ?? + // testnet solo/para native + matches?.find((t) => t.isTestnet && ["substrate-native", "evm-native"].includes(t.type)) ?? + // testnet which has an image + matches?.find((t) => t.isTestnet && t.logo) ?? + // fallback + matches?.[0] + ) + }, [balances.each, chains, currency, tokens]) } export const useTokenBalancesSummary = (balances: Balances) => { const tokenBalances = useMemo(() => balances.filterMirrorTokens(), [balances]) - const { tokens, chains } = usePortfolio() - // find the most appropriate token (for the icon) - const token = useMemo( - () => getBestTokenForSymbol(tokenBalances, tokens, chains), - [chains, tokenBalances, tokens], - ) + const token = useBestTokenForSymbol(tokenBalances) const currency = useSelectedCurrency() const tokenBalanceRates = useMemo( diff --git a/apps/extension/src/ui/domains/SendFunds/SendFundsAmountForm/AmountEdit.tsx b/apps/extension/src/ui/domains/SendFunds/SendFundsAmountForm/AmountEdit.tsx index 56b8a6fafd..dd95ee42f0 100644 --- a/apps/extension/src/ui/domains/SendFunds/SendFundsAmountForm/AmountEdit.tsx +++ b/apps/extension/src/ui/domains/SendFunds/SendFundsAmountForm/AmountEdit.tsx @@ -152,7 +152,7 @@ const FiatInput = () => { if (token && tokenRate && text.length && !isNaN(num)) { const fiat = parseFloat(text) - const tokens = (fiat / tokenRate).toFixed(Math.ceil(token.decimals / 3)) + const tokens = (fiat / tokenRate.price).toFixed(Math.ceil(token.decimals / 3)) set("amount", tokensToPlanck(tokens, token.decimals)) } else remove("amount") }, 250), diff --git a/apps/extension/src/ui/domains/Staking/Bond/BondForm.tsx b/apps/extension/src/ui/domains/Staking/Bond/BondForm.tsx index cc7706722f..03154acea3 100644 --- a/apps/extension/src/ui/domains/Staking/Bond/BondForm.tsx +++ b/apps/extension/src/ui/domains/Staking/Bond/BondForm.tsx @@ -176,10 +176,10 @@ const FiatInput = () => { const handleChange: ChangeEventHandler = useCallback( (e) => { - if (token && tokenRates?.[currency] && e.target.value) { + if (token && tokenRates?.[currency]?.price && e.target.value) { try { const fiat = parseFloat(e.target.value) - const tokens = (fiat / tokenRates[currency]!).toFixed(Math.ceil(token.decimals / 3)) + const tokens = (fiat / tokenRates[currency].price).toFixed(Math.ceil(token.decimals / 3)) const plancks = tokensToPlanck(tokens, token.decimals) return setPlancks(BigInt(plancks)) } catch (err) { diff --git a/apps/extension/src/ui/hooks/useCoingeckoTokenRates.ts b/apps/extension/src/ui/hooks/useCoingeckoTokenRates.ts index 14b568c089..dcb4442ebf 100644 --- a/apps/extension/src/ui/hooks/useCoingeckoTokenRates.ts +++ b/apps/extension/src/ui/hooks/useCoingeckoTokenRates.ts @@ -1,10 +1,10 @@ import { TokenId } from "@talismn/chaindata-provider" -import { NewTokenRates, TokenRates } from "@talismn/token-rates" +import { newTokenRates, TokenRates } from "@talismn/token-rates" import { useQuery } from "@tanstack/react-query" import { fetchFromCoingecko } from "@extension/core" -const CURRENCIES = Object.keys(NewTokenRates()).join(",") +const CURRENCIES = Object.keys(newTokenRates()).join(",") const getCoinGeckoTokenRates = async (coingeckoId?: string) => { if (!coingeckoId) return null diff --git a/apps/extension/src/ui/hooks/useUniswapV2LpTokenTotalValueLocked.ts b/apps/extension/src/ui/hooks/useUniswapV2LpTokenTotalValueLocked.ts index 18b154593c..1225a5fbb6 100644 --- a/apps/extension/src/ui/hooks/useUniswapV2LpTokenTotalValueLocked.ts +++ b/apps/extension/src/ui/hooks/useUniswapV2LpTokenTotalValueLocked.ts @@ -5,7 +5,7 @@ import groupBy from "lodash/groupBy" export const useUniswapV2LpTokenTotalValueLocked = ( token?: Token, - tokenRate?: number | null, + tokenPrice?: number | null, balances?: Balances, ) => { if (token?.type !== "evm-uniswapv2") return null @@ -15,7 +15,7 @@ export const useUniswapV2LpTokenTotalValueLocked = ( extractTvlFromBalance( chainBalances?.find?.((b) => b.isSource("evm-uniswapv2")), token, - tokenRate, + tokenPrice, ), ) @@ -24,7 +24,7 @@ export const useUniswapV2LpTokenTotalValueLocked = ( return BigNumber.sum(...chainTvls).toNumber() } -const extractTvlFromBalance = (balance?: Balance, token?: Token, tokenRate?: number | null) => { +const extractTvlFromBalance = (balance?: Balance, token?: Token, tokenPrice?: number | null) => { const extra = balance?.extra const extras = Array.isArray(extra) ? extra : extra !== undefined ? [extra] : [] const totalSupply = BigNumber( @@ -32,5 +32,5 @@ const extractTvlFromBalance = (balance?: Balance, token?: Token, tokenRate?: num ) const totalSupplyTokens = BigNumber(totalSupply).times(Math.pow(10, -1 * (token?.decimals ?? 0))) - return BigNumber(tokenRate ?? 0).times(totalSupplyTokens) + return BigNumber(tokenPrice ?? 0).times(totalSupplyTokens) } diff --git a/apps/extension/tests/mocks/api.ts b/apps/extension/tests/mocks/api.ts index 2d95bd472e..d402dd205d 100644 --- a/apps/extension/tests/mocks/api.ts +++ b/apps/extension/tests/mocks/api.ts @@ -141,178 +141,633 @@ export const mockedApi = new Proxy(jest.requireActual("@ui/api"), { function getMockTokenRates(cb: (rates: DbTokenRates[]) => void) { cb([ { - tokenId: "1-evm-erc20-0xe41d2489571d322189246dafa5ebde1f4699f498", + tokenId: "1284-evm-erc20-0xffffffffa922fef94566104a6e5a35a4fcddaa9f", rates: { - btc: 0.00000511, - eth: 0.00013481, - dot: 0.08141978, - usd: 0.344325, - cny: 2.45, - eur: 0.319054, - gbp: 0.266336, - cad: 0.475965, - aud: 0.518206, - nzd: 0.57251, - jpy: 52.44, - rub: 33, - krw: 474.86, - idr: 5365.94, - php: 19.96, - thb: 11.62, - vnd: 8754.46, - inr: 28.95, - try: 11.8, - sgd: 0.45462, + btc: { + price: 9.8376e-7, + marketCap: 1120.291917858449, + change24h: -0.6995739004825059, + }, + eth: { + price: 0.00002615, + marketCap: 29771.48035827377, + change24h: -3.309408176133055, + }, + dot: { + price: 0.01146351, + marketCap: 13053350.4089089, + change24h: 1.7226176666370996, + }, + usd: { + price: 0.093924, + marketCap: 106977510.82556757, + change24h: 1.2827026300241688, + }, + cny: { + price: 0.681135, + marketCap: 775800908.5070157, + change24h: 1.3700665180188427, + }, + eur: { + price: 0.089166, + marketCap: 101558351.05967677, + change24h: 0.9894178793142621, + }, + gbp: { + price: 0.074262, + marketCap: 84583480.57440819, + change24h: 0.8703754861087402, + }, + cad: { + price: 0.131739, + marketCap: 150048796.23415765, + change24h: 1.0912043411544499, + }, + aud: { + price: 0.144875, + marketCap: 165009815.0781347, + change24h: 1.4041268258911828, + }, + nzd: { + price: 0.159614, + marketCap: 181797260.96443695, + change24h: 1.3370862865171955, + }, + jpy: { + price: 14.25, + marketCap: 16232553537.649935, + change24h: 1.1933386777987982, + }, + rub: { + price: 10.4, + marketCap: 11847593615.767365, + change24h: 6.321813624674142, + }, + krw: { + price: 131.09, + marketCap: 149308654567.2437, + change24h: 1.2979167540541081, + }, + idr: { + price: 1490.26, + marketCap: 1697383312755.538, + change24h: 1.2339330636094297, + }, + php: { + price: 5.52, + marketCap: 6281612993.054057, + change24h: 5.710493732541172, + }, + thb: { + price: 3.24, + marketCap: 3688584573.265565, + change24h: 0.819249871767915, + }, + vnd: { + price: 2380.53, + marketCap: 2711380719469.433, + change24h: 1.0516686450883532, + }, + inr: { + price: 7.94, + marketCap: 9039499319.855299, + change24h: 1.3648414521559307, + }, + try: { + price: 3.25, + marketCap: 3706321658.5154734, + change24h: 1.231727082952439, + }, + sgd: { + price: 0.12622, + marketCap: 143762797.6980469, + change24h: 1.2578376244311116, + }, }, }, { tokenId: "137-evm-erc20-0xd6df932a45c0f255f85145f286ea0b292b21c90b", rates: { - btc: 0.00224703, - eth: 0.05928282, - dot: 35.802329, - usd: 151.41, - cny: 1076.7, - eur: 140.3, - gbp: 117.11, - cad: 209.29, - aud: 227.87, - nzd: 251.75, - jpy: 23057, - rub: 14513, - krw: 208807, - idr: 2359523, - php: 8778.44, - thb: 5111.13, - vnd: 3849528, - inr: 12728.42, - try: 5189.3, - sgd: 199.91, + btc: { + price: 0.00212008, + marketCap: 31775.19704539381, + change24h: 3.0416906531575365, + }, + eth: { + price: 0.05634936, + marketCap: 844268.3967884398, + change24h: 0.3147547196030105, + }, + dot: { + price: 24.704724, + marketCap: 370137151.7035932, + change24h: 5.494559000037312, + }, + usd: { + price: 202.41, + marketCap: 3036386874.996101, + change24h: 5.128124801622068, + }, + cny: { + price: 1467.9, + marketCap: 22020484894.84674, + change24h: 5.218805653157145, + }, + eur: { + price: 192.16, + marketCap: 2882150567.2938, + change24h: 4.823704845653175, + }, + gbp: { + price: 160.04, + marketCap: 2400367061.838167, + change24h: 4.700142744281283, + }, + cad: { + price: 283.91, + marketCap: 4258010333.639529, + change24h: 4.929355855999569, + }, + aud: { + price: 312.22, + marketCap: 4682081233.762118, + change24h: 5.254159136070262, + }, + nzd: { + price: 343.98, + marketCap: 5159009556.604628, + change24h: 5.184573254107144, + }, + jpy: { + price: 30714, + marketCap: 460539930759.3232, + change24h: 5.035367948987518, + }, + rub: { + price: 22417, + marketCap: 336255467255.5981, + change24h: 10.3585568080618, + }, + krw: { + price: 282508, + marketCap: 4237382417747.995, + change24h: 5.143916563573157, + }, + idr: { + price: 3211630, + marketCap: 48177928566733.72, + change24h: 5.0775035905821575, + }, + php: { + price: 11885.48, + marketCap: 178282979631.60733, + change24h: 9.724026801999118, + }, + thb: { + price: 6979.19, + marketCap: 104641482679.55305, + change24h: 4.64707603273604, + }, + vnd: { + price: 5130221, + marketCap: 76958238850205.73, + change24h: 4.888319099650895, + }, + inr: { + price: 17103.7, + marketCap: 256555270206.718, + change24h: 5.21338220609387, + }, + try: { + price: 7012.76, + marketCap: 105201999696.67741, + change24h: 5.075213854982348, + }, + sgd: { + price: 272.01, + marketCap: 4079191437.797253, + change24h: 5.10231574100985, + }, }, }, { tokenId: "592-evm-erc20-0xfcde4a87b8b6fa58326bb462882f1778158b02f1", rates: { - btc: 0.00224703, - eth: 0.05928282, - dot: 35.802329, - usd: 151.41, - cny: 1076.7, - eur: 140.3, - gbp: 117.11, - cad: 209.29, - aud: 227.87, - nzd: 251.75, - jpy: 23057, - rub: 14513, - krw: 208807, - idr: 2359523, - php: 8778.44, - thb: 5111.13, - vnd: 3849528, - inr: 12728.42, - try: 5189.3, - sgd: 199.91, - }, - }, - { - tokenId: "1284-evm-erc20-0xffffffffa922fef94566104a6e5a35a4fcddaa9f", - rates: { - btc: 8.77778e-7, - eth: 0.00002316, - dot: 0.01398629, - usd: 0.059148, - cny: 0.42062, - eur: 0.054807, - gbp: 0.04575122, - cad: 0.081761, - aud: 0.089017, - nzd: 0.098346, - jpy: 9.01, - rub: 5.67, - krw: 81.57, - idr: 921.76, - php: 3.43, - thb: 2, - vnd: 1503.84, - inr: 4.97, - try: 2.03, - sgd: 0.078095, + btc: { + price: 0.00212008, + marketCap: 31775.19704539381, + change24h: 3.0416906531575365, + }, + eth: { + price: 0.05634936, + marketCap: 844268.3967884398, + change24h: 0.3147547196030105, + }, + dot: { + price: 24.704724, + marketCap: 370137151.7035932, + change24h: 5.494559000037312, + }, + usd: { + price: 202.41, + marketCap: 3036386874.996101, + change24h: 5.128124801622068, + }, + cny: { + price: 1467.9, + marketCap: 22020484894.84674, + change24h: 5.218805653157145, + }, + eur: { + price: 192.16, + marketCap: 2882150567.2938, + change24h: 4.823704845653175, + }, + gbp: { + price: 160.04, + marketCap: 2400367061.838167, + change24h: 4.700142744281283, + }, + cad: { + price: 283.91, + marketCap: 4258010333.639529, + change24h: 4.929355855999569, + }, + aud: { + price: 312.22, + marketCap: 4682081233.762118, + change24h: 5.254159136070262, + }, + nzd: { + price: 343.98, + marketCap: 5159009556.604628, + change24h: 5.184573254107144, + }, + jpy: { + price: 30714, + marketCap: 460539930759.3232, + change24h: 5.035367948987518, + }, + rub: { + price: 22417, + marketCap: 336255467255.5981, + change24h: 10.3585568080618, + }, + krw: { + price: 282508, + marketCap: 4237382417747.995, + change24h: 5.143916563573157, + }, + idr: { + price: 3211630, + marketCap: 48177928566733.72, + change24h: 5.0775035905821575, + }, + php: { + price: 11885.48, + marketCap: 178282979631.60733, + change24h: 9.724026801999118, + }, + thb: { + price: 6979.19, + marketCap: 104641482679.55305, + change24h: 4.64707603273604, + }, + vnd: { + price: 5130221, + marketCap: 76958238850205.73, + change24h: 4.888319099650895, + }, + inr: { + price: 17103.7, + marketCap: 256555270206.718, + change24h: 5.21338220609387, + }, + try: { + price: 7012.76, + marketCap: 105201999696.67741, + change24h: 5.075213854982348, + }, + sgd: { + price: 272.01, + marketCap: 4079191437.797253, + change24h: 5.10231574100985, + }, }, }, { tokenId: "787-evm-native", rates: { - btc: 8.77778e-7, - eth: 0.00002316, - dot: 0.01398629, - usd: 0.059148, - cny: 0.42062, - eur: 0.054807, - gbp: 0.04575122, - cad: 0.081761, - aud: 0.089017, - nzd: 0.098346, - jpy: 9.01, - rub: 5.67, - krw: 81.57, - idr: 921.76, - php: 3.43, - thb: 2, - vnd: 1503.84, - inr: 4.97, - try: 2.03, - sgd: 0.078095, + btc: { + price: 9.8376e-7, + marketCap: 1120.291917858449, + change24h: -0.6995739004825059, + }, + eth: { + price: 0.00002615, + marketCap: 29771.48035827377, + change24h: -3.309408176133055, + }, + dot: { + price: 0.01146351, + marketCap: 13053350.4089089, + change24h: 1.7226176666370996, + }, + usd: { + price: 0.093924, + marketCap: 106977510.82556757, + change24h: 1.2827026300241688, + }, + cny: { + price: 0.681135, + marketCap: 775800908.5070157, + change24h: 1.3700665180188427, + }, + eur: { + price: 0.089166, + marketCap: 101558351.05967677, + change24h: 0.9894178793142621, + }, + gbp: { + price: 0.074262, + marketCap: 84583480.57440819, + change24h: 0.8703754861087402, + }, + cad: { + price: 0.131739, + marketCap: 150048796.23415765, + change24h: 1.0912043411544499, + }, + aud: { + price: 0.144875, + marketCap: 165009815.0781347, + change24h: 1.4041268258911828, + }, + nzd: { + price: 0.159614, + marketCap: 181797260.96443695, + change24h: 1.3370862865171955, + }, + jpy: { + price: 14.25, + marketCap: 16232553537.649935, + change24h: 1.1933386777987982, + }, + rub: { + price: 10.4, + marketCap: 11847593615.767365, + change24h: 6.321813624674142, + }, + krw: { + price: 131.09, + marketCap: 149308654567.2437, + change24h: 1.2979167540541081, + }, + idr: { + price: 1490.26, + marketCap: 1697383312755.538, + change24h: 1.2339330636094297, + }, + php: { + price: 5.52, + marketCap: 6281612993.054057, + change24h: 5.710493732541172, + }, + thb: { + price: 3.24, + marketCap: 3688584573.265565, + change24h: 0.819249871767915, + }, + vnd: { + price: 2380.53, + marketCap: 2711380719469.433, + change24h: 1.0516686450883532, + }, + inr: { + price: 7.94, + marketCap: 9039499319.855299, + change24h: 1.3648414521559307, + }, + try: { + price: 3.25, + marketCap: 3706321658.5154734, + change24h: 1.231727082952439, + }, + sgd: { + price: 0.12622, + marketCap: 143762797.6980469, + change24h: 1.2578376244311116, + }, }, }, { tokenId: "acala-substrate-native", rates: { - btc: 8.77778e-7, - eth: 0.00002316, - dot: 0.01398629, - usd: 0.059148, - cny: 0.42062, - eur: 0.054807, - gbp: 0.04575122, - cad: 0.081761, - aud: 0.089017, - nzd: 0.098346, - jpy: 9.01, - rub: 5.67, - krw: 81.57, - idr: 921.76, - php: 3.43, - thb: 2, - vnd: 1503.84, - inr: 4.97, - try: 2.03, - sgd: 0.078095, + btc: { + price: 9.8376e-7, + marketCap: 1120.291917858449, + change24h: -0.6995739004825059, + }, + eth: { + price: 0.00002615, + marketCap: 29771.48035827377, + change24h: -3.309408176133055, + }, + dot: { + price: 0.01146351, + marketCap: 13053350.4089089, + change24h: 1.7226176666370996, + }, + usd: { + price: 0.093924, + marketCap: 106977510.82556757, + change24h: 1.2827026300241688, + }, + cny: { + price: 0.681135, + marketCap: 775800908.5070157, + change24h: 1.3700665180188427, + }, + eur: { + price: 0.089166, + marketCap: 101558351.05967677, + change24h: 0.9894178793142621, + }, + gbp: { + price: 0.074262, + marketCap: 84583480.57440819, + change24h: 0.8703754861087402, + }, + cad: { + price: 0.131739, + marketCap: 150048796.23415765, + change24h: 1.0912043411544499, + }, + aud: { + price: 0.144875, + marketCap: 165009815.0781347, + change24h: 1.4041268258911828, + }, + nzd: { + price: 0.159614, + marketCap: 181797260.96443695, + change24h: 1.3370862865171955, + }, + jpy: { + price: 14.25, + marketCap: 16232553537.649935, + change24h: 1.1933386777987982, + }, + rub: { + price: 10.4, + marketCap: 11847593615.767365, + change24h: 6.321813624674142, + }, + krw: { + price: 131.09, + marketCap: 149308654567.2437, + change24h: 1.2979167540541081, + }, + idr: { + price: 1490.26, + marketCap: 1697383312755.538, + change24h: 1.2339330636094297, + }, + php: { + price: 5.52, + marketCap: 6281612993.054057, + change24h: 5.710493732541172, + }, + thb: { + price: 3.24, + marketCap: 3688584573.265565, + change24h: 0.819249871767915, + }, + vnd: { + price: 2380.53, + marketCap: 2711380719469.433, + change24h: 1.0516686450883532, + }, + inr: { + price: 7.94, + marketCap: 9039499319.855299, + change24h: 1.3648414521559307, + }, + try: { + price: 3.25, + marketCap: 3706321658.5154734, + change24h: 1.231727082952439, + }, + sgd: { + price: 0.12622, + marketCap: 143762797.6980469, + change24h: 1.2578376244311116, + }, }, }, { tokenId: "astar-substrate-assets-18446744073709551616-aca", rates: { - btc: 8.77778e-7, - eth: 0.00002316, - dot: 0.01398629, - usd: 0.059148, - cny: 0.42062, - eur: 0.054807, - gbp: 0.04575122, - cad: 0.081761, - aud: 0.089017, - nzd: 0.098346, - jpy: 9.01, - rub: 5.67, - krw: 81.57, - idr: 921.76, - php: 3.43, - thb: 2, - vnd: 1503.84, - inr: 4.97, - try: 2.03, - sgd: 0.078095, + btc: { + price: 9.8376e-7, + marketCap: 1120.291917858449, + change24h: -0.6995739004825059, + }, + eth: { + price: 0.00002615, + marketCap: 29771.48035827377, + change24h: -3.309408176133055, + }, + dot: { + price: 0.01146351, + marketCap: 13053350.4089089, + change24h: 1.7226176666370996, + }, + usd: { + price: 0.093924, + marketCap: 106977510.82556757, + change24h: 1.2827026300241688, + }, + cny: { + price: 0.681135, + marketCap: 775800908.5070157, + change24h: 1.3700665180188427, + }, + eur: { + price: 0.089166, + marketCap: 101558351.05967677, + change24h: 0.9894178793142621, + }, + gbp: { + price: 0.074262, + marketCap: 84583480.57440819, + change24h: 0.8703754861087402, + }, + cad: { + price: 0.131739, + marketCap: 150048796.23415765, + change24h: 1.0912043411544499, + }, + aud: { + price: 0.144875, + marketCap: 165009815.0781347, + change24h: 1.4041268258911828, + }, + nzd: { + price: 0.159614, + marketCap: 181797260.96443695, + change24h: 1.3370862865171955, + }, + jpy: { + price: 14.25, + marketCap: 16232553537.649935, + change24h: 1.1933386777987982, + }, + rub: { + price: 10.4, + marketCap: 11847593615.767365, + change24h: 6.321813624674142, + }, + krw: { + price: 131.09, + marketCap: 149308654567.2437, + change24h: 1.2979167540541081, + }, + idr: { + price: 1490.26, + marketCap: 1697383312755.538, + change24h: 1.2339330636094297, + }, + php: { + price: 5.52, + marketCap: 6281612993.054057, + change24h: 5.710493732541172, + }, + thb: { + price: 3.24, + marketCap: 3688584573.265565, + change24h: 0.819249871767915, + }, + vnd: { + price: 2380.53, + marketCap: 2711380719469.433, + change24h: 1.0516686450883532, + }, + inr: { + price: 7.94, + marketCap: 9039499319.855299, + change24h: 1.3648414521559307, + }, + try: { + price: 3.25, + marketCap: 3706321658.5154734, + change24h: 1.231727082952439, + }, + sgd: { + price: 0.12622, + marketCap: 143762797.6980469, + change24h: 1.2578376244311116, + }, }, }, ]) diff --git a/packages/balances/src/types/balances.ts b/packages/balances/src/types/balances.ts index 51e9eb4cb4..3ae69c538c 100644 --- a/packages/balances/src/types/balances.ts +++ b/packages/balances/src/types/balances.ts @@ -1,5 +1,5 @@ import { ChainList, EvmNetworkList, TokenList } from "@talismn/chaindata-provider" -import { NewTokenRates, TokenRateCurrency, TokenRates, TokenRatesList } from "@talismn/token-rates" +import { newTokenRates, TokenRateCurrency, TokenRates, TokenRatesList } from "@talismn/token-rates" import { BigMath, isArrayOf, isBigInt, NonFunctionProperties, planckToTokens } from "@talismn/util" import BigNumber from "bignumber.js" @@ -457,16 +457,17 @@ export class Balance { currency, // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1 BigNumber.sum( - reserve0Tokens.times(rates0[currency] ?? 0), - reserve1Tokens.times(rates1[currency] ?? 0), + reserve0Tokens.times(rates0[currency]?.price ?? 0), + reserve1Tokens.times(rates1[currency]?.price ?? 0), ), ] as const, ) - const lpTokenRates = NewTokenRates() + const lpTokenRates = newTokenRates() totalValueLocked.forEach(([currency, tvl]) => { // divide `the value of all lp tokens` by `the number of lp tokens` to get `the value per token` - if (!totalSupplyTokens.eq(0)) lpTokenRates[currency] = tvl.div(totalSupplyTokens).toNumber() + if (!totalSupplyTokens.eq(0)) + lpTokenRates[currency] = { price: tvl.div(totalSupplyTokens).toNumber() } }) return lpTokenRates @@ -684,7 +685,7 @@ export class BalanceValueGetter { export class BalanceFormatter { #planck: string #decimals: number - #fiatRatios: TokenRates | null + #tokenRates: TokenRates | null constructor( planck: string | bigint | undefined, @@ -693,7 +694,7 @@ export class BalanceFormatter { ) { this.#planck = isBigInt(planck) ? planck.toString() : (planck ?? "0") this.#decimals = decimals || 0 - this.#fiatRatios = fiatRatios || null + this.#tokenRates = fiatRatios || null } toJSON = () => this.#planck @@ -707,12 +708,12 @@ export class BalanceFormatter { } fiat(currency: TokenRateCurrency) { - if (!this.#fiatRatios) return null + if (!this.#tokenRates) return null - const ratio = this.#fiatRatios[currency] + const ratio = this.#tokenRates[currency] if (!ratio) return null - return parseFloat(this.tokens) * ratio + return parseFloat(this.tokens) * ratio.price } } @@ -851,6 +852,75 @@ export class SumBalancesFormatter { fiat(currency: TokenRateCurrency) { return new FiatSumBalancesFormatter(this.#balances, currency) } + + change24h(currency: TokenRateCurrency) { + return new Change24hCurrencyFormatter(this.#balances, currency) + } +} + +export class Change24hCurrencyFormatter { + #balances: Balances + #currency: TokenRateCurrency + + constructor(balances: Balances, currency: TokenRateCurrency) { + this.#balances = balances + this.#currency = currency + } + + #change24h = ( + balanceField: { + [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never + }[keyof Balance], + ) => { + const output = this.#balances.filterMirrorTokens().each.reduce( + // add the total amount to the fiat amount of each balance + (acc, balance) => { + const change24h = balance.rates?.[this.#currency]?.change24h + if (typeof change24h !== "number") return acc + const fiat = balance[balanceField].fiat(this.#currency) + if (!fiat) return acc + + return { + totalFiatDiff: acc.totalFiatDiff + fiat * change24h, + totalFiat: acc.totalFiat + fiat, + } + }, + // start with a total of 0 + { totalFiatDiff: 0, totalFiat: 0 }, + ) + + return output.totalFiat === 0 + ? null + : { + diff: output.totalFiatDiff / 100, + ratio: output.totalFiatDiff / output.totalFiat, + } + } + + get total() { + return this.#change24h("total") + } + get free() { + return this.#change24h("free") + } + get reserved() { + return this.#change24h("reserved") + } + get locked() { + return this.#change24h("locked") + } + get frozen() { + return this.#change24h("frozen") + } + get transferable() { + return this.#change24h("transferable") + } + get unavailable() { + return this.#change24h("unavailable") + } + get feePayable() { + return this.#change24h("feePayable") + } } export const filterMirrorTokens = (balance: Balance, i: number, balances: Balance[]) => { diff --git a/packages/extension-core/src/db/db.ts b/packages/extension-core/src/db/db.ts index ffdc62a62f..11f22537d5 100644 --- a/packages/extension-core/src/db/db.ts +++ b/packages/extension-core/src/db/db.ts @@ -6,6 +6,7 @@ import { DiscoveredBalance } from "../domains/assetDiscovery/types" import { TalismanMetadataDef } from "../domains/substrate/types" import { WalletTransaction } from "../domains/transactions/types" import { upgradeRemoveSymbolFromNativeTokenId } from "./upgrades" +import { upgradeTokenRatesToObjects } from "./upgrades/2024-12-16-upgradeTokenRatesToObjects" export const MIGRATION_ERROR_MSG = "Talisman Dexie Migration Error" @@ -26,28 +27,30 @@ class TalismanDatabase extends Dexie { // https://dexie.org/docs/Tutorial/Design#database-versioning this.version(8).upgrade(upgradeRemoveSymbolFromNativeTokenId) - this.version(9).stores({ - // You only need to specify properties that you wish to index. - // The object store will allow any properties on your stored objects but you can only query them by indexed properties - // https://dexie.org/docs/API-Reference#declare-database - // - // Never index properties containing images, movies or large (huge) strings. Store them in IndexedDB, yes! but just don’t index them! - // https://dexie.org/docs/Version/Version.stores()#warning - assetDiscovery: "id, tokenId, address", - metadata: "genesisHash", - phishing: "source, commitSha", - tokenRates: "tokenId", - transactions: "hash, status, timestamp", - blobs: "id", - - // delete legacy tables - balances: null, - chainMetadataRpc: null, - chains: null, - evmNetworks: null, - metadataRpc: null, - tokens: null, - }) + this.version(10) + .stores({ + // You only need to specify properties that you wish to index. + // The object store will allow any properties on your stored objects but you can only query them by indexed properties + // https://dexie.org/docs/API-Reference#declare-database + // + // Never index properties containing images, movies or large (huge) strings. Store them in IndexedDB, yes! but just don’t index them! + // https://dexie.org/docs/Version/Version.stores()#warning + assetDiscovery: "id, tokenId, address", + metadata: "genesisHash", + phishing: "source, commitSha", + tokenRates: "tokenId", + transactions: "hash, status, timestamp", + blobs: "id", + + // delete legacy tables + balances: null, + chainMetadataRpc: null, + chains: null, + evmNetworks: null, + metadataRpc: null, + tokens: null, + }) + .upgrade(upgradeTokenRatesToObjects) } } diff --git a/packages/extension-core/src/db/upgrades/2024-12-16-upgradeTokenRatesToObjects.ts b/packages/extension-core/src/db/upgrades/2024-12-16-upgradeTokenRatesToObjects.ts new file mode 100644 index 0000000000..59d82c84d8 --- /dev/null +++ b/packages/extension-core/src/db/upgrades/2024-12-16-upgradeTokenRatesToObjects.ts @@ -0,0 +1,29 @@ +import { DbTokenRates, TokenRateCurrency, TokenRates } from "@talismn/token-rates" +import { Transaction as DbTransaction } from "dexie" +import { fromPairs, toPairs } from "lodash" + +type OldDbTokenRates = { + tokenId: string + rates: Record +} + +// For DB version 10, Wallet version 2.3.0 +export const upgradeTokenRatesToObjects = async (tx: DbTransaction) => { + try { + const oldTokenRates = await tx.table("tokenRates").toArray() + + const newTokenRates = oldTokenRates.map( + (oldTokenRate: OldDbTokenRates): DbTokenRates => ({ + tokenId: oldTokenRate.tokenId, + rates: fromPairs( + toPairs(oldTokenRate.rates).map(([currency, price]) => [currency, { price }]), + ) as TokenRates, + }), + ) + + await tx.table("tokenRates").clear() + await tx.table("tokenRates").bulkPut(newTokenRates) + } catch (err) { + // non blocking, table rows will be replaced with fresh data when portfolio is displayed + } +} diff --git a/packages/talisman-ui/src/config/tailwind.config.cjs b/packages/talisman-ui/src/config/tailwind.config.cjs index 90cade4202..c67119f033 100644 --- a/packages/talisman-ui/src/config/tailwind.config.cjs +++ b/packages/talisman-ui/src/config/tailwind.config.cjs @@ -64,6 +64,10 @@ module.exports = { 850: "#1B1B1B", // rgb(27, 27, 27) 900: "#181818", // rgb(24, 24, 24) }, + price: { + up: "#8AEB94", // rgba(138, 235, 148, 1) + down: "#FF5C5F", // rgba(255, 92, 92, 1) + }, }, lineHeight: { 3: "0.6rem", diff --git a/packages/token-rates/src/TokenRates.ts b/packages/token-rates/src/TokenRates.ts index 0063f5276a..fc2612c297 100644 --- a/packages/token-rates/src/TokenRates.ts +++ b/packages/token-rates/src/TokenRates.ts @@ -1,6 +1,6 @@ import { Token, TokenId } from "@talismn/chaindata-provider" -import { NewTokenRates, SUPPORTED_CURRENCIES, TokenRateCurrency, TokenRatesList } from "./types" +import { newTokenRates, SUPPORTED_CURRENCIES, TokenRateCurrency, TokenRatesList } from "./types" export class TokenRatesError extends Error { response?: Response @@ -21,8 +21,8 @@ export type CoingeckoConfig = { } // api returns a 414 error if the url is too long, max length is about 8100 characters -// so use 8000 to be safe -const MAX_COINGECKO_URL_LENGTH = 8000 +// so use 7900 to be safe +const MAX_COINGECKO_URL_LENGTH = 7900 export const DEFAULT_COINGECKO_CONFIG: CoingeckoConfig = { apiUrl: "https://api.coingecko.com", @@ -89,7 +89,7 @@ export async function fetchTokenRates( const safelyGetCoingeckoUrls = (coingeckoIds: string[]): string[] => { const idsSerialized = coingeckoIds.join(",") - const queryUrl = `${config.apiUrl}/api/v3/simple/price?ids=${idsSerialized}&vs_currencies=${currenciesSerialized}` + const queryUrl = `${config.apiUrl}/api/v3/simple/price?ids=${idsSerialized}&vs_currencies=${currenciesSerialized}&include_market_cap=true&include_24hr_change=true` if (queryUrl.length > MAX_COINGECKO_URL_LENGTH) { const half = Math.floor(coingeckoIds.length / 2) return [ @@ -105,6 +105,8 @@ export async function fetchTokenRates( // { // [coingeckoId]: { // [currency]: rate + // [currency_24h_change]: percent + // [currency_market_cap]: value // } // } @@ -128,10 +130,15 @@ export async function fetchTokenRates( const ratesList: TokenRatesList = Object.fromEntries( coingeckoIds.flatMap((coingeckoId) => { const tokenIds = coingeckoIdToTokenIds[coingeckoId] - const rates = NewTokenRates() + const rates = newTokenRates() for (const currency of coingeckoCurrencies) { - rates[currency] = ((coingeckoPrices || {})[coingeckoId] || {})[currency] || null + if (coingeckoPrices[coingeckoId]?.[currency]) + rates[currency] = { + price: coingeckoPrices[coingeckoId][currency], + marketCap: coingeckoPrices[coingeckoId][`${currency}_market_cap`], + change24h: coingeckoPrices[coingeckoId][`${currency}_24h_change`], + } } return tokenIds.map((tokenId) => [tokenId, rates]) diff --git a/packages/token-rates/src/types.ts b/packages/token-rates/src/types.ts index dbd4114e20..90b6a62e3b 100644 --- a/packages/token-rates/src/types.ts +++ b/packages/token-rates/src/types.ts @@ -27,10 +27,12 @@ export const SUPPORTED_CURRENCIES = { } as const export type TokenRateCurrency = keyof typeof SUPPORTED_CURRENCIES -export type TokenRates = Record +export type TokenRateData = { price: number; marketCap?: number; change24h?: number } +export type TokenRates = Record export type TokenRatesList = Record export type DbTokenRates = { tokenId: TokenId; rates: TokenRates } -export const NewTokenRates = (): TokenRates => ({ + +export const newTokenRates = (): TokenRates => ({ btc: null, eth: null, dot: null, diff --git a/packages/util/src/formatPrice.ts b/packages/util/src/formatPrice.ts new file mode 100644 index 0000000000..ba5aa0f61e --- /dev/null +++ b/packages/util/src/formatPrice.ts @@ -0,0 +1,10 @@ +export const formatPrice = (price: number, currency: string, compact: boolean) => { + return Intl.NumberFormat(undefined, { + style: "currency", + currency, + currencyDisplay: currency === "usd" ? "narrowSymbol" : "symbol", + maximumSignificantDigits: compact ? (price < 1 ? 3 : 4) : undefined, + roundingPriority: compact ? "auto" : "morePrecision", + notation: compact && price >= 10_000 ? "compact" : "standard", + }).format(price) +} diff --git a/packages/util/src/index.ts b/packages/util/src/index.ts index a8079a242e..826985672b 100644 --- a/packages/util/src/index.ts +++ b/packages/util/src/index.ts @@ -9,6 +9,7 @@ export * from "./deferred" export * from "./encodeAnyAddress" export * from "./firstThenDebounce" export * from "./formatDecimals" +export * from "./formatPrice" export * from "./FunctionPropertyNames" export * from "./hasOwnProperty" export * from "./isArrayOf" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1e621041b..a87d8187d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -430,6 +430,9 @@ importers: buffer: specifier: ^6.0.3 version: 6.0.3 + chart.js: + specifier: ^4.4.7 + version: 4.4.7 check-password-strength: specifier: ^2.0.10 version: 2.0.10 @@ -553,7 +556,7 @@ importers: devDependencies: '@alectalisman/webpack-ext-reloader': specifier: ^1.1.9-a - version: 1.1.9-a(@swc/core@1.7.39(@swc/helpers@0.5.13))(bufferutil@4.0.8)(esbuild@0.24.0)(utf-8-validate@6.0.4)(webpack-cli@5.1.4)(webpack@5.95.0) + version: 1.1.9-a(@swc/core@1.7.39(@swc/helpers@0.5.13))(bufferutil@4.0.8)(utf-8-validate@6.0.4)(webpack-cli@5.1.4)(webpack@5.95.0) '@babel/core': specifier: ^7.25.8 version: 7.25.9 @@ -712,7 +715,7 @@ importers: version: 4.0.2(webpack@5.95.0) remove-files-webpack-plugin: specifier: ^1.5.0 - version: 1.5.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4)(webpack@5.95.0) + version: 1.5.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4)(webpack@5.95.0) sinon-chrome: specifier: ^3.0.1 version: 3.0.1 @@ -730,10 +733,10 @@ importers: version: 3.4.14(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)) terser-webpack-plugin: specifier: 5.3.10 - version: 5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.95.0) + version: 5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack@5.95.0) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3) ts-loader: specifier: 9.5.1 version: 9.5.1(typescript@5.6.3)(webpack@5.95.0) @@ -748,7 +751,7 @@ importers: version: 1.1.2 webpack: specifier: ^5.95.0 - version: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-bundle-analyzer: specifier: ^4.10.2 version: 4.10.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -808,7 +811,7 @@ importers: version: 2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) wagmi: specifier: ^2.12.25 - version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) + version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) devDependencies: '@openzeppelin/contracts': specifier: ^5.1.0 @@ -1446,7 +1449,7 @@ importers: version: 3.0.1 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -3636,6 +3639,9 @@ packages: peerDependencies: '@polkadot/types': 15.0.1 + '@kurkle/color@0.3.4': + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@laminar/type-definitions@0.3.1': resolution: {integrity: sha512-QWC2qtvbPIxal+gMfUocZmwK0UsD7Sb0RUm4Hallkp+OXXL+3uBLwztYDLS5LtocOn0tfR//sgpnfsEIEb71Lw==} @@ -4588,7 +4594,7 @@ packages: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: - rollup: '>=2.79.2' + rollup: '>=4.22.4' '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -6626,6 +6632,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chart.js@4.4.7: + resolution: {integrity: sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==} + engines: {pnpm: '>=8'} + check-password-strength@2.0.10: resolution: {integrity: sha512-HRM5ICPmtnNtLnTv2QrfVkq1IxI9z3bzYpDJ1k5ixwD9HtJGHuv265R6JmHOV6r8wLhQMlULnIUVpkrC2yaiCw==} @@ -12783,10 +12793,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@alectalisman/webpack-ext-reloader@1.1.9-a(@swc/core@1.7.39(@swc/helpers@0.5.13))(bufferutil@4.0.8)(esbuild@0.24.0)(utf-8-validate@6.0.4)(webpack-cli@5.1.4)(webpack@5.95.0)': + '@alectalisman/webpack-ext-reloader@1.1.9-a(@swc/core@1.7.39(@swc/helpers@0.5.13))(bufferutil@4.0.8)(utf-8-validate@6.0.4)(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: '@types/webextension-polyfill': 0.8.3 - '@types/webpack': 5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + '@types/webpack': 5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) '@types/webpack-sources': 3.2.0 clean-webpack-plugin: 4.0.0(webpack@5.95.0) colors: 1.4.0 @@ -12795,7 +12805,7 @@ snapshots: minimist: 1.2.8 useragent: 2.3.0 webextension-polyfill: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-sources: 3.2.3 ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: @@ -12959,6 +12969,13 @@ snapshots: regexpu-core: 6.1.1 semver: 7.6.3 + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 + semver: 7.6.3 + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -12970,6 +12987,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -12980,6 +13008,18 @@ snapshots: resolve: 1.22.8 transitivePeerDependencies: - supports-color + optional: true + + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color '@babel/helper-member-expression-to-functions@7.25.9': dependencies: @@ -13039,6 +13079,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13118,16 +13167,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13137,6 +13204,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13145,6 +13221,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -13157,6 +13241,12 @@ snapshots: dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + optional: true + + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.0)': dependencies: @@ -13177,6 +13267,10 @@ snapshots: dependencies: '@babel/core': 7.25.9 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13186,7 +13280,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13197,7 +13290,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.9)': dependencies: @@ -13208,7 +13300,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.9)': dependencies: @@ -13219,17 +13310,28 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + optional: true + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + optional: true + + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-flow@7.25.9(@babel/core@7.25.9)': dependencies: @@ -13240,6 +13342,7 @@ snapshots: dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + optional: true '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': dependencies: @@ -13251,6 +13354,11 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-assertions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-attributes@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13260,7 +13368,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.9)': dependencies: @@ -13271,7 +13378,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13282,7 +13388,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.25.9)': dependencies: @@ -13303,7 +13408,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13324,7 +13428,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13335,7 +13438,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13346,7 +13448,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.9)': dependencies: @@ -13367,7 +13468,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.9)': dependencies: @@ -13378,7 +13478,6 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - optional: true '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.25.9)': dependencies: @@ -13396,11 +13495,22 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13410,6 +13520,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13419,16 +13538,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13437,6 +13575,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-static-block@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13445,6 +13591,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-static-block@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13457,39 +13611,84 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/template': 7.25.9 + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13498,16 +13697,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.25.9) + optional: true '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': dependencies: @@ -13523,6 +13736,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13532,26 +13753,55 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13560,6 +13810,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13588,6 +13846,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13596,27 +13864,56 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13624,6 +13921,13 @@ snapshots: '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.9) + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13632,11 +13936,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13645,11 +13962,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13658,6 +13988,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13667,11 +14005,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13682,6 +14034,11 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13694,11 +14051,21 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13710,6 +14077,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13722,11 +14100,22 @@ snapshots: '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13738,15 +14127,41 @@ snapshots: semver: 7.6.3 transitivePeerDependencies: - supports-color + optional: true + + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + semver: 7.6.3 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.25.9)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.25.9)': + dependencies: + '@babel/core': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.9 + '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: @@ -13757,16 +14172,31 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -13794,24 +14224,47 @@ snapshots: '@babel/core': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.9) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/preset-env@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/compat-data': 7.25.9 @@ -13886,6 +14339,80 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-env@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.25.9 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.38.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -13900,6 +14427,13 @@ snapshots: '@babel/types': 7.25.9 esutils: 2.0.3 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.25.9 + esutils: 2.0.3 + '@babel/preset-react@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 @@ -15281,6 +15815,8 @@ snapshots: dependencies: '@polkadot/types': 15.0.1 + '@kurkle/color@0.3.4': {} + '@laminar/type-definitions@0.3.1': dependencies: '@open-web3/orml-type-definitions': 0.8.2-11 @@ -15563,31 +16099,31 @@ snapshots: - supports-color optional: true - '@metamask/sdk-install-modal-web@0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + '@metamask/sdk-install-modal-web@0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)': dependencies: i18next: 23.11.5 qr-code-styling: 1.8.4 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) + optional: true - '@metamask/sdk-install-modal-web@0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)': + '@metamask/sdk-install-modal-web@0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: i18next: 23.11.5 qr-code-styling: 1.8.4 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) - optional: true + react-native: 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - '@metamask/sdk@0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)': + '@metamask/sdk@0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(utf-8-validate@6.0.4)': dependencies: '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.30.0(cross-fetch@4.0.0)(eciesjs@0.4.10)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@metamask/sdk-install-modal-web': 0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@metamask/sdk-communication-layer': 0.30.0(cross-fetch@4.0.0)(eciesjs@0.4.10)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@metamask/sdk-install-modal-web': 0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) bowser: 2.11.0 cross-fetch: 4.0.0 debug: 4.3.7(supports-color@8.1.1) @@ -15599,9 +16135,9 @@ snapshots: obj-multiplex: 1.0.0 pump: 3.0.2 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) readable-stream: 3.6.2 - socket.io-client: 4.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + socket.io-client: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) util: 0.12.5 uuid: 8.3.2 optionalDependencies: @@ -15613,13 +16149,14 @@ snapshots: - react-native - supports-color - utf-8-validate + optional: true - '@metamask/sdk@0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(utf-8-validate@6.0.4)': + '@metamask/sdk@0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.30.0(cross-fetch@4.0.0)(eciesjs@0.4.10)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@metamask/sdk-install-modal-web': 0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) + '@metamask/sdk-communication-layer': 0.30.0(cross-fetch@4.0.0)(eciesjs@0.4.10)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.30.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) bowser: 2.11.0 cross-fetch: 4.0.0 debug: 4.3.7(supports-color@8.1.1) @@ -15631,9 +16168,9 @@ snapshots: obj-multiplex: 1.0.0 pump: 3.0.2 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) readable-stream: 3.6.2 - socket.io-client: 4.8.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + socket.io-client: 4.8.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: @@ -15645,7 +16182,6 @@ snapshots: - react-native - supports-color - utf-8-validate - optional: true '@metamask/superstruct@3.1.0': {} @@ -16753,6 +17289,14 @@ snapshots: transitivePeerDependencies: - '@babel/preset-env' - supports-color + optional: true + + '@react-native/babel-plugin-codegen@0.76.0(@babel/preset-env@7.25.9(@babel/core@7.26.0))': + dependencies: + '@react-native/codegen': 0.76.0(@babel/preset-env@7.25.9(@babel/core@7.26.0)) + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color '@react-native/babel-preset@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))': dependencies: @@ -16804,6 +17348,58 @@ snapshots: transitivePeerDependencies: - '@babel/preset-env' - supports-color + optional: true + + '@react-native/babel-preset@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/template': 7.25.9 + '@react-native/babel-plugin-codegen': 0.76.0(@babel/preset-env@7.25.9(@babel/core@7.26.0)) + babel-plugin-syntax-hermes-parser: 0.23.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.0) + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color '@react-native/codegen@0.76.0(@babel/preset-env@7.25.9(@babel/core@7.25.9))': dependencies: @@ -16818,21 +17414,36 @@ snapshots: yargs: 17.7.2 transitivePeerDependencies: - supports-color + optional: true - '@react-native/community-cli-plugin@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@react-native/codegen@0.76.0(@babel/preset-env@7.25.9(@babel/core@7.26.0))': dependencies: - '@react-native/dev-middleware': 0.76.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@babel/parser': 7.26.2 + '@babel/preset-env': 7.25.9(@babel/core@7.26.0) + glob: 7.2.3 + hermes-parser: 0.23.1 + invariant: 2.2.4 + jscodeshift: 0.14.0(@babel/preset-env@7.25.9(@babel/core@7.26.0)) + mkdirp: 0.5.6 + nullthrows: 1.1.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@react-native/community-cli-plugin@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@react-native/dev-middleware': 0.76.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@react-native/metro-babel-transformer': 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9)) chalk: 4.1.2 execa: 5.1.1 invariant: 2.2.4 - metro: 0.81.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - metro-config: 0.81.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + metro: 0.81.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro-config: 0.81.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) metro-core: 0.81.0 node-fetch: 2.7.0 readline: 1.3.0 optionalDependencies: - '@react-native-community/cli-server-api': 15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@react-native-community/cli-server-api': 15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -16840,21 +17451,22 @@ snapshots: - encoding - supports-color - utf-8-validate + optional: true - '@react-native/community-cli-plugin@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + '@react-native/community-cli-plugin@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@react-native/dev-middleware': 0.76.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) - '@react-native/metro-babel-transformer': 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9)) + '@react-native/dev-middleware': 0.76.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@react-native/metro-babel-transformer': 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0)) chalk: 4.1.2 execa: 5.1.1 invariant: 2.2.4 - metro: 0.81.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) - metro-config: 0.81.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + metro: 0.81.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + metro-config: 0.81.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-core: 0.81.0 node-fetch: 2.7.0 readline: 1.3.0 optionalDependencies: - '@react-native-community/cli-server-api': 15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@react-native-community/cli-server-api': 15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -16862,7 +17474,6 @@ snapshots: - encoding - supports-color - utf-8-validate - optional: true '@react-native/debugger-frontend@0.76.0': {} @@ -16916,27 +17527,38 @@ snapshots: transitivePeerDependencies: - '@babel/preset-env' - supports-color + optional: true + + '@react-native/metro-babel-transformer@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))': + dependencies: + '@babel/core': 7.26.0 + '@react-native/babel-preset': 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0)) + hermes-parser: 0.23.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color '@react-native/normalize-colors@0.76.0': {} - '@react-native/virtualized-lists@0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + '@react-native/virtualized-lists@0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) optionalDependencies: '@types/react': 18.3.12 + optional: true - '@react-native/virtualized-lists@0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)': + '@react-native/virtualized-lists@0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) + react-native: 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 18.3.12 - optional: true '@react-rxjs/core@0.10.7(react@18.3.1)(rxjs@7.8.1)': dependencies: @@ -17404,7 +18026,7 @@ snapshots: '@sentry/bundler-plugin-core': 2.10.2 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) transitivePeerDependencies: - encoding - supports-color @@ -18183,11 +18805,11 @@ snapshots: '@types/source-list-map': 0.1.2 source-map: 0.7.4 - '@types/webpack@5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4)': + '@types/webpack@5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4)': dependencies: '@types/node': 22.9.1 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -18414,10 +19036,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))': + '@wagmi/connectors@5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))': dependencies: '@coinbase/wallet-sdk': 4.1.0 - '@metamask/sdk': 0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + '@metamask/sdk': 0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) @@ -19045,17 +19667,17 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(webpack@5.95.0) '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(webpack@5.95.0) '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.95.0)': dependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(webpack@5.95.0) '@xobotyi/scrollbar-width@1.9.5': {} @@ -19473,7 +20095,6 @@ snapshots: slash: 3.0.0 transitivePeerDependencies: - supports-color - optional: true babel-plugin-istanbul@6.1.1: dependencies: @@ -19510,6 +20131,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.25.9 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.25.9): dependencies: '@babel/compat-data': 7.26.2 @@ -19518,6 +20148,16 @@ snapshots: semver: 7.6.3 transitivePeerDependencies: - supports-color + optional: true + + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + semver: 7.6.3 + transitivePeerDependencies: + - supports-color babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.9): dependencies: @@ -19527,6 +20167,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.38.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.9): dependencies: '@babel/core': 7.25.9 @@ -19534,12 +20182,27 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.25.9): dependencies: '@babel/core': 7.25.9 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.9) transitivePeerDependencies: - supports-color + optional: true + + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color babel-plugin-syntax-hermes-parser@0.23.1: dependencies: @@ -19550,6 +20213,13 @@ snapshots: '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.25.9) transitivePeerDependencies: - '@babel/core' + optional: true + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.26.0): + dependencies: + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) + transitivePeerDependencies: + - '@babel/core' babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.9): dependencies: @@ -19588,7 +20258,6 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) - optional: true babel-preset-jest@29.6.3(@babel/core@7.25.9): dependencies: @@ -19601,7 +20270,6 @@ snapshots: '@babel/core': 7.26.0 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) - optional: true balanced-match@1.0.2: {} @@ -19907,6 +20575,10 @@ snapshots: chardet@0.7.0: {} + chart.js@4.4.7: + dependencies: + '@kurkle/color': 0.3.4 + check-password-strength@2.0.10: {} cheerio-select@2.1.0: @@ -19981,7 +20653,7 @@ snapshots: circular-dependency-plugin@5.2.2(webpack@5.95.0): dependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) citty@0.1.6: dependencies: @@ -19998,7 +20670,7 @@ snapshots: clean-webpack-plugin@4.0.0(webpack@5.95.0): dependencies: del: 4.1.1 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) cli-boxes@2.2.1: {} @@ -20208,7 +20880,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) core-js-compat@3.38.1: dependencies: @@ -20395,7 +21067,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) css-select@4.3.0: dependencies: @@ -20737,7 +21409,7 @@ snapshots: dotenv-webpack@8.1.0(webpack@5.95.0): dependencies: dotenv-defaults: 2.0.2 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) dotenv@16.4.5: {} @@ -21014,7 +21686,7 @@ snapshots: esbuild: 0.21.5 get-tsconfig: 4.7.6 loader-utils: 2.0.4 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-sources: 1.4.3 esbuild@0.21.5: @@ -21262,7 +21934,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -21795,7 +22467,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.6.3 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) form-data@2.3.3: dependencies: @@ -22303,7 +22975,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -23354,6 +24026,32 @@ snapshots: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color + optional: true + + jscodeshift@0.14.0(@babel/preset-env@7.25.9(@babel/core@7.26.0)): + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/preset-env': 7.25.9(@babel/core@7.26.0) + '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/register': 7.25.9(@babel/core@7.26.0) + babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) + chalk: 4.1.2 + flow-parser: 0.255.0 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.21.5 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color jsdom@20.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.4): dependencies: @@ -24843,7 +25541,7 @@ snapshots: postcss: 8.4.47 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -25094,7 +25792,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) react-app-polyfill@3.0.0: dependencies: @@ -25175,31 +25873,31 @@ snapshots: react-is@18.3.1: {} - react-native-webview@11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + react-native-webview@11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1): dependencies: escape-string-regexp: 2.0.0 invariant: 2.2.4 react: 18.3.1 - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) + optional: true - react-native-webview@11.26.1(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1): + react-native-webview@11.26.1(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: escape-string-regexp: 2.0.0 invariant: 2.2.4 react: 18.3.1 - react-native: 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4) - optional: true + react-native: 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10): + react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.76.0 '@react-native/codegen': 0.76.0(@babel/preset-env@7.25.9(@babel/core@7.25.9)) - '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@react-native/gradle-plugin': 0.76.0 '@react-native/js-polyfills': 0.76.0 '@react-native/normalize-colors': 0.76.0 - '@react-native/virtualized-lists': 0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@react-native/virtualized-lists': 0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -25222,14 +25920,14 @@ snapshots: pretty-format: 29.7.0 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 5.3.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + react-devtools-core: 5.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 semver: 7.6.3 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) yargs: 17.7.2 optionalDependencies: '@types/react': 18.3.12 @@ -25241,21 +25939,22 @@ snapshots: - encoding - supports-color - utf-8-validate + optional: true - react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4): + react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.76.0 - '@react-native/codegen': 0.76.0(@babel/preset-env@7.25.9(@babel/core@7.25.9)) - '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@react-native/codegen': 0.76.0(@babel/preset-env@7.25.9(@babel/core@7.26.0)) + '@react-native/community-cli-plugin': 0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.76.0 '@react-native/js-polyfills': 0.76.0 '@react-native/normalize-colors': 0.76.0 - '@react-native/virtualized-lists': 0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1) + '@react-native/virtualized-lists': 0.76.0(@types/react@18.3.12)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.25.9) + babel-jest: 29.7.0(@babel/core@7.26.0) babel-plugin-syntax-hermes-parser: 0.23.1 base64-js: 1.5.1 chalk: 4.1.2 @@ -25274,14 +25973,14 @@ snapshots: pretty-format: 29.7.0 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 5.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + react-devtools-core: 5.3.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 semver: 7.6.3 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) + ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 optionalDependencies: '@types/react': 18.3.12 @@ -25293,7 +25992,6 @@ snapshots: - encoding - supports-color - utf-8-validate - optional: true react-property@2.0.2: {} @@ -25479,11 +26177,11 @@ snapshots: relateurl@0.2.7: {} - remove-files-webpack-plugin@1.5.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4)(webpack@5.95.0): + remove-files-webpack-plugin@1.5.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4)(webpack@5.95.0): dependencies: - '@types/webpack': 5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + '@types/webpack': 5.28.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) trash: 7.2.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -25999,7 +26697,7 @@ snapshots: speed-measure-webpack-plugin@1.5.0(webpack@5.95.0): dependencies: chalk: 4.1.2 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) split-on-first@1.1.0: {} @@ -26193,7 +26891,7 @@ snapshots: style-loader@4.0.0(webpack@5.95.0): dependencies: - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) style-to-js@1.1.16: dependencies: @@ -26354,26 +27052,25 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.95.0): + terser-webpack-plugin@5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack@5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13)) optionalDependencies: '@swc/core': 1.7.39(@swc/helpers@0.5.13) - esbuild: 0.24.0 - terser-webpack-plugin@5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack@5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13)) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.39(@swc/helpers@0.5.13) @@ -26499,7 +27196,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3): + ts-jest@29.2.5(@babel/core@7.25.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.9))(jest@29.7.0(@types/node@22.9.1)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.9.1)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -26517,7 +27214,6 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.9) - esbuild: 0.24.0 ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.0)(babel-plugin-macros@3.1.0)(node-notifier@10.0.1)(ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.10.0)(typescript@5.6.3)))(typescript@5.6.3): dependencies: @@ -26556,7 +27252,7 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.3 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) ts-node@10.9.2(@swc/core@1.7.39(@swc/helpers@0.5.13))(@types/node@22.10.0)(typescript@5.6.3): dependencies: @@ -27076,14 +27772,14 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)): + wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@6.0.4)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)): dependencies: '@tanstack/react-query': 5.59.16(react@18.3.1) - '@wagmi/connectors': 5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) - '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) + '@wagmi/connectors': 5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@6.0.4)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)) + '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) + viem: 2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -27110,15 +27806,16 @@ snapshots: - supports-color - utf-8-validate - zod + optional: true - wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@6.0.4)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)): + wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)): dependencies: '@tanstack/react-query': 5.59.16(react@18.3.1) - '@wagmi/connectors': 5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.25.9)(@babel/preset-env@7.25.9(@babel/core@7.25.9))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@6.0.4))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@6.0.4)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)) - '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4)) + '@wagmi/connectors': 5.3.3(@types/react@18.3.12)(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.25.9(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@types/react@18.3.12)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) + '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(@types/react@18.3.12)(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@6.0.4) + viem: 2.21.34(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -27145,7 +27842,6 @@ snapshots: - supports-color - utf-8-validate - zod - optional: true walk-sync@2.2.0: dependencies: @@ -27227,7 +27923,7 @@ snapshots: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -27235,7 +27931,7 @@ snapshots: webpack-manifest-plugin@5.0.0(webpack@5.95.0): dependencies: tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4) webpack-sources: 2.3.1 webpack-merge@5.10.0: @@ -27294,7 +27990,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -27316,7 +28012,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.95.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.39(@swc/helpers@0.5.13))(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: