+
))
diff --git a/packages/wallet/src/components/chart/constants.ts b/packages/wallet/src/components/chart/constants.ts
index 6debfdb85..08bda52c0 100644
--- a/packages/wallet/src/components/chart/constants.ts
+++ b/packages/wallet/src/components/chart/constants.ts
@@ -2,7 +2,7 @@ import { danger, success, white } from '@status-im/colors'
export const positiveColors = {
line: success[50],
- background: white[100],
+ background: 'transparent',
marker: success['50/30'],
fill: success['50/5'],
white: white[100],
@@ -10,7 +10,7 @@ export const positiveColors = {
export const negativeColors = {
line: danger[50],
- background: white[100],
+ background: 'transparent',
marker: danger['50/30'],
fill: danger['50/5'],
white: white[100],
diff --git a/packages/wallet/src/components/chart/hooks/use-token-chart-tooltip.ts b/packages/wallet/src/components/chart/hooks/use-token-chart-tooltip.ts
index 5aecf3155..43c619359 100644
--- a/packages/wallet/src/components/chart/hooks/use-token-chart-tooltip.ts
+++ b/packages/wallet/src/components/chart/hooks/use-token-chart-tooltip.ts
@@ -6,11 +6,11 @@ import { useTooltip } from '@visx/tooltip'
import { extent } from 'd3-array'
import { timeFormat } from 'd3-time-format'
-import type { ChartDataPoint as PriceType } from '../utils'
+import type { ChartDataPoint } from '../utils'
import type { EventType } from '@visx/event/lib/types'
type Props = {
- data: PriceType[]
+ data: ChartDataPoint[]
dates: Date[]
innerWidth: number
currency?: string
@@ -22,17 +22,13 @@ type Props = {
}
}
-type TooltipData = {
- date: string
- price: number
+type TooltipData = ChartDataPoint & {
formattedDate: string
}
// Eg. 'Jan 17th, 2024 - 14:45 '
const formatDate = timeFormat('%b %d, %Y - %H:%M')
-const getPrice = (d: PriceType) => d.price
-
const useTokenChartTooltip = (props: Props) => {
const { data, margin, dates, innerWidth } = props
@@ -42,13 +38,15 @@ const useTokenChartTooltip = (props: Props) => {
tooltipData: {
date: '',
price: 0,
+ balance: 0,
+ value: 0,
formattedDate: '',
},
})
const filteredDates = dates.filter(Boolean) // filters out undefined values
- const getDate = useCallback((d: PriceType) => new Date(d?.date), [])
+ const getDate = useCallback((d: ChartDataPoint) => new Date(d?.date), [])
const xDomain = extent(filteredDates) as [Date, Date]
const xScale = scaleTime({
@@ -74,13 +72,11 @@ const useTokenChartTooltip = (props: Props) => {
}
const d = data[closestIndex]
- const price = getPrice(d)
showTooltip({
tooltipData: {
- date: d?.date,
+ ...d,
formattedDate: formatDate(getDate(d)),
- price,
},
})
},
diff --git a/packages/wallet/src/components/chart/index.tsx b/packages/wallet/src/components/chart/index.tsx
index 424c42df4..641e933a3 100644
--- a/packages/wallet/src/components/chart/index.tsx
+++ b/packages/wallet/src/components/chart/index.tsx
@@ -1,7 +1,9 @@
'use client'
import { ParentSize } from '@visx/responsive'
+import { match } from 'ts-pattern'
+import { EmptyState } from '../empty-state'
import { ChartLoading, TokenChart } from './components'
import type { DataType, TimeFrame } from './utils'
@@ -12,6 +14,7 @@ type ChartProps = {
| ApiOutput['assets']['nativeTokenPriceChart']
| ApiOutput['assets']['tokenPriceChart']
balance: ApiOutput['assets']['tokenBalanceChart']
+ value: { date: string; price: number }[]
activeTimeFrame: TimeFrame
activeDataType: DataType
}
@@ -19,23 +22,33 @@ type ChartProps = {
const Chart = ({
price,
balance,
+ value,
activeTimeFrame,
activeDataType,
}: ChartProps) => {
- const currency = 'EUR'
+ const currency = 'USD'
return (
-
- {({ width }) => (
-
- )}
+
+ {({ width }) => {
+ const data = match(activeDataType)
+ .with('balance', () => balance)
+ .with('value', () => value)
+ .with('price', () => price)
+ .exhaustive()
+
+ return (
+ }
+ />
+ )
+ }}
)
diff --git a/packages/wallet/src/components/chart/utils/index.ts b/packages/wallet/src/components/chart/utils/index.ts
index 365fe03c0..8c449b874 100644
--- a/packages/wallet/src/components/chart/utils/index.ts
+++ b/packages/wallet/src/components/chart/utils/index.ts
@@ -1,10 +1,15 @@
-import { differenceInCalendarMonths } from 'date-fns'
+import { match } from 'ts-pattern'
export const TIME_FRAMES = ['24H', '7D', '1M', '3M', '1Y', 'All'] as const
export type TimeFrame = (typeof TIME_FRAMES)[number]
-export type DataType = 'price' | 'balance'
-export type ChartDataPoint = { date: string; price: number }
+export type DataType = 'price' | 'balance' | 'value'
+export type ChartDataPoint = {
+ date: string
+ price: number
+ balance?: number
+ value?: number
+}
export type ChartDatum = { date: Date; value: number }
export const DEFAULT_TIME_FRAME: TimeFrame = TIME_FRAMES[0]
@@ -31,8 +36,6 @@ export const checkDateOutput = (
): 'bullet' | 'month' | 'day' | 'hour' | 'empty' => {
const {
date,
- previousDate,
- firstDate,
index,
variant,
totalDataPoints = 0,
@@ -49,8 +52,6 @@ export const checkDateOutput = (
return Math.max(1, Math.ceil(totalDataPoints / maxLabels))
}
- const isFirstDataPoint = index === 0
-
if (variant === '24H') {
const hourInterval = getSafeInterval(60)
if (index % hourInterval === 0) {
@@ -60,22 +61,20 @@ export const checkDateOutput = (
}
if (variant === '7D') {
- const currentDay = date.getDate()
- const previousDay = previousDate ? previousDate.getDate() : -1
- const isDayTransition = currentDay !== previousDay
+ const dayInterval = getSafeInterval(70)
- if (isFirstDataPoint || isDayTransition) {
+ if (index % dayInterval === 0) {
return 'month'
}
return 'empty'
}
if (variant === '1M') {
- const interval = getSafeInterval(40)
+ const interval = getSafeInterval(60)
if (index % interval === 0) {
const currentDayOfMonth = date.getDate()
- if (isFirstDataPoint || currentDayOfMonth === 1) {
+ if (currentDayOfMonth === 1) {
return 'month'
}
return 'day'
@@ -85,14 +84,6 @@ export const checkDateOutput = (
}
if (variant === '3M') {
- const currentMonth = date.getMonth()
- const previousMonth = previousDate ? previousDate.getMonth() : -1
- const isMonthTransition = currentMonth !== previousMonth
-
- if (isFirstDataPoint || isMonthTransition) {
- return 'month'
- }
-
const dayInterval = Math.max(10, getSafeInterval(60))
if (index % dayInterval === 0) {
return 'day'
@@ -102,11 +93,9 @@ export const checkDateOutput = (
}
if (variant === '1Y') {
- const currentMonth = date.getMonth()
- const previousMonth = previousDate ? previousDate.getMonth() : -1
- const isMonthTransition = currentMonth !== previousMonth
+ const monthInterval = getSafeInterval(50)
- if (isFirstDataPoint || isMonthTransition) {
+ if (index > 0 && index % monthInterval === 0) {
return 'month'
}
@@ -114,104 +103,108 @@ export const checkDateOutput = (
}
if (variant === 'All') {
- if (isFirstDataPoint) {
- return 'month'
- }
+ const yearInterval = getSafeInterval(50)
- const currentYear = date.getFullYear()
- const previousYear = previousDate ? previousDate.getFullYear() : -1
- const isYearTransition = currentYear !== previousYear
-
- if (isYearTransition) {
+ if (index > 0 && index % yearInterval === 0) {
return 'month'
}
- const monthInterval = Math.max(6, getSafeInterval(60))
- const monthsFromReference = differenceInCalendarMonths(date, firstDate)
-
- return monthsFromReference % monthInterval === 0 ? 'month' : 'empty'
+ return 'empty'
}
return 'bullet'
}
-export const formatChartValue = (
- value: number,
- dataType: 'price' | 'balance',
- currency?: string,
-): string => {
- const fractionalDigits = value.toString().split('.')[1]?.length || 0
-
- if (dataType === 'balance') {
- return value.toLocaleString('en-US', {
- minimumFractionDigits: fractionalDigits,
- maximumFractionDigits: fractionalDigits,
- })
- }
-
- return value.toLocaleString('en-US', {
- style: 'currency',
- currency: currency || 'USD',
- minimumFractionDigits: fractionalDigits,
- maximumFractionDigits: fractionalDigits,
- })
+const priceFormatter = new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ notation: 'standard',
+ currency: 'USD',
+ minimumSignificantDigits: 4,
+ maximumSignificantDigits: 4,
+ roundingPriority: 'morePrecision',
+})
+
+const balanceFormatter = new Intl.NumberFormat('en-US', {
+ style: 'decimal',
+ notation: 'standard',
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 2,
+ minimumSignificantDigits: 1,
+ maximumSignificantDigits: 4,
+ roundingPriority: 'morePrecision',
+})
+
+const valueFormatter = new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: 'USD',
+ notation: 'standard',
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2,
+})
+
+export const formatChartValue = (value: number, dataType: DataType): string => {
+ return match(dataType)
+ .with('balance', () => balanceFormatter.format(value))
+ .with('price', () => priceFormatter.format(value))
+ .with('value', () => valueFormatter.format(value))
+ .exhaustive()
}
-export const formatSmallNumber = (value: number): string => {
- if (value === 0) return '0'
-
- if (value < 0.01) {
- const str = value.toString()
- const match = str.match(/0\.0*/)
- if (match) {
- const leadingZeros = match[0].length - 2
- const decimalPlaces = leadingZeros + 2
- return value.toLocaleString('en-US', {
- minimumFractionDigits: decimalPlaces,
- maximumFractionDigits: Math.min(decimalPlaces, 8),
- })
- }
- }
+export const getChartValue = (
+ point: ChartDataPoint,
+ dataType: DataType,
+): number => {
+ return match(dataType)
+ .with('price', () => point.price)
+ .with('balance', () => point.balance ?? point.price)
+ .with('value', () => point.value ?? point.price)
+ .exhaustive()
+}
- return value.toLocaleString('en-US', {
- minimumFractionDigits: 0,
- maximumFractionDigits: 2,
- })
+export const createChartDataPoint = (
+ date: string,
+ value: number,
+ dataType: DataType,
+ additionalData?: { price?: number; balance?: number },
+): ChartDataPoint => {
+ return match(dataType)
+ .with('price', () => ({ date, price: value }))
+ .with('balance', () => ({ date, price: value, balance: value }))
+ .with('value', () => ({
+ date,
+ price: additionalData?.price ?? 0,
+ balance: additionalData?.balance ?? 0,
+ value,
+ }))
+ .exhaustive()
}
export const calculateChartRange = (
- data: Array<{ price: number }>,
+ data: ChartDataPoint[],
marginFactor = 0.1,
+ dataType: DataType = 'price',
) => {
if (data.length === 0) return { min: 0, max: 1, ticks: [] }
- const prices = data.map(d => d.price)
- const maxPrice = Math.max(...prices)
- const minPrice = Math.min(...prices)
+ const values = data.map(d => getChartValue(d, dataType))
+ const maxPrice = Math.max(...values)
+ const minPrice = Math.min(...values)
const priceRange = maxPrice - minPrice
const adjustedMin = minPrice - priceRange * marginFactor
const adjustedMax = maxPrice + priceRange * marginFactor
- const finalMin = minPrice > 0 && adjustedMin < 0 ? 0 : adjustedMin
+ const finalMin = Math.max(0, adjustedMin)
const finalMax = adjustedMax
// Generate ticks
const tickCount = 7
const tickInterval = (finalMax - finalMin) / (tickCount - 1)
- const maxDecimals = Math.min(
- Math.max(
- ...data.map(d =>
- d.price % 1 !== 0 ? d.price.toString().split('.')[1]?.length || 0 : 0,
- ),
- ),
- 4,
- )
const ticks = Array.from({ length: tickCount }, (_, i) => {
const tickValue = finalMin + i * tickInterval
- if (maxDecimals === 0) return Math.round(tickValue).toString()
- return tickValue.toFixed(tickValue === 0 ? 0 : maxDecimals)
+
+ return formatChartValue(tickValue, dataType)
})
return { min: finalMin, max: finalMax, ticks }
diff --git a/packages/wallet/src/components/create-password-form/index.tsx b/packages/wallet/src/components/create-password-form/index.tsx
index 682255e62..c9e41bf45 100644
--- a/packages/wallet/src/components/create-password-form/index.tsx
+++ b/packages/wallet/src/components/create-password-form/index.tsx
@@ -175,7 +175,8 @@ const CreatePasswordForm = ({
!isPasswordValid ||
!doPasswordsMatch ||
!!form.formState.errors.password ||
- !!form.formState.errors.confirmPassword
+ !!form.formState.errors.confirmPassword ||
+ loading
}
>
{loading ? (
diff --git a/packages/wallet/src/components/currency-amount/index.tsx b/packages/wallet/src/components/currency-amount/index.tsx
index 55a5f9f5d..a6b47ffe4 100644
--- a/packages/wallet/src/components/currency-amount/index.tsx
+++ b/packages/wallet/src/components/currency-amount/index.tsx
@@ -15,7 +15,7 @@ type Props = {
}
// TODO: get this from the user's settings
-const SYMBOL: 'EUR' | 'USD' = 'EUR'
+const SYMBOL: 'EUR' | 'USD' = 'USD'
const MIN_VALUE = 0.01
export const CurrencyAmount = (props: Props) => {
diff --git a/packages/wallet/src/components/empty-state-actions/components/buy-tokens.tsx b/packages/wallet/src/components/empty-state-actions/components/buy-tokens.tsx
new file mode 100644
index 000000000..b96d40f3e
--- /dev/null
+++ b/packages/wallet/src/components/empty-state-actions/components/buy-tokens.tsx
@@ -0,0 +1,99 @@
+import { ExternalIcon } from '@status-im/icons/12'
+import { cx } from 'class-variance-authority'
+
+import { Image, type ImageId } from '../../image'
+
+type Props = {
+ address: string
+}
+
+const BuyTokens = (props: Props) => {
+ const { address } = props
+
+ const PROVIDERS: ProviderProps[] = [
+ {
+ name: 'MoonPay',
+ image: 'Wallet/Icons/Logos/moonpay-bigger:144:144',
+ list: [
+ 'Pay with Credit/Debit Card, Bank Transfer, Apple/Google Pay, SEPA, +9 more',
+ 'Fees: from 1%',
+ 'Supported Countries: 180',
+ ],
+ url: 'https://buy.moonpay.com/v2/buy?apiKey=pk_live_YQC6CQPA5qqDu0unEwHJyAYQyeIqFGR',
+ },
+ {
+ name: 'Mercuryo',
+ image: 'Wallet/Icons/Logos/mercuryo-bigger:144:144',
+ list: [
+ 'Pay with Credit/Debit Card, Bank Transfer, Apple/Google Pay, SEPA, +10 more',
+ 'Fees: from 1%',
+ 'Supported Countries: 135+',
+ ],
+ url: `https://exchange.mercuryo.io/?type=buy&network=ETHEREUM¤cy=ETH&address=${address}&hide_address=false&fix_address=true&widget_id=6a7eb330-2b09-49b7-8fd3-1c77cfb6cd47`,
+ },
+ ]
+
+ return (
+
+
+
+ Ways to buy tokens
+
+
+ Credit card and bank transfer
+
+
+
+ {PROVIDERS.map(provider => (
+
+ ))}
+
+
+ )
+}
+
+type ProviderProps = {
+ name: string
+ image: ImageId
+ list: string[]
+ url: string
+}
+
+const Provider = (props: ProviderProps) => {
+ const { name, image, list, url } = props
+
+ return (
+
+
+
+
{name}
+
+
+ {list.map(item => (
+
+ {item}
+
+ ))}
+
+
+
+ )
+}
+
+export { BuyTokens }
diff --git a/packages/wallet/src/components/empty-state-actions/components/deposit-tokens.tsx b/packages/wallet/src/components/empty-state-actions/components/deposit-tokens.tsx
new file mode 100644
index 000000000..f42d95ca1
--- /dev/null
+++ b/packages/wallet/src/components/empty-state-actions/components/deposit-tokens.tsx
@@ -0,0 +1,86 @@
+'use client'
+import { useEffect, useState } from 'react'
+
+import { IconButton, useToast } from '@status-im/components'
+import { CheckIcon, CopyIcon } from '@status-im/icons/20'
+import { QRCodeSVG } from 'qrcode.react'
+
+import { useCopyToClipboard } from '../../../hooks'
+import { NetworkLogo } from '../../network-logo'
+
+type Props = {
+ address: string
+}
+
+const DepositTokens = (props: Props) => {
+ const { address } = props
+ const [, copy] = useCopyToClipboard()
+ const [success, setSuccess] = useState(false)
+ const toast = useToast()
+
+ useEffect(() => {
+ const timer = setTimeout(() => setSuccess(false), 2000)
+
+ return () => {
+ clearTimeout(timer)
+ }
+ }, [success])
+
+ const handleCopy = () => {
+ try {
+ copy(address)
+ setSuccess(true)
+ } catch {
+ toast.negative('Failed to copy address.')
+ }
+ }
+
+ return (
+
+
+
+ Deposit tokens
+
+
+ Send ETH, tokens or collectibles (NFTs) to this address from another
+ wallet or exchange
+
+
+
+
+
+ {address}
+
+
+ ) : (
+
+ )
+ }
+ aria-label="Copy code"
+ />
+
+
+
+
+ Supported network:
+
+
+
+ Ethereum
+
+
+
+
+ )
+}
+
+export { DepositTokens }
diff --git a/packages/wallet/src/components/empty-state-actions/index.tsx b/packages/wallet/src/components/empty-state-actions/index.tsx
new file mode 100644
index 000000000..a48dfe70c
--- /dev/null
+++ b/packages/wallet/src/components/empty-state-actions/index.tsx
@@ -0,0 +1,19 @@
+import { BuyTokens } from './components/buy-tokens'
+import { DepositTokens } from './components/deposit-tokens'
+
+type Props = {
+ address: string
+}
+
+const EmptyStateActions = (props: Props) => {
+ const { address } = props
+
+ return (
+
+
+
+
+ )
+}
+
+export { EmptyStateActions }
diff --git a/packages/wallet/src/components/empty-state/index.tsx b/packages/wallet/src/components/empty-state/index.tsx
index 23176b3d6..c23e47ada 100644
--- a/packages/wallet/src/components/empty-state/index.tsx
+++ b/packages/wallet/src/components/empty-state/index.tsx
@@ -1,11 +1,24 @@
+import { cva } from 'cva'
import { match } from 'ts-pattern'
import { Image } from '../image'
import type { ImageId } from '../image'
+const styles = cva({
+ variants: {
+ variant: {
+ activity: 'size-20',
+ collectible: 'size-20',
+ balance: 'h-[112px]',
+ price: 'h-[112px]',
+ value: 'h-[112px]',
+ },
+ },
+})
+
type Props = {
- variant: 'activity' | 'collectible'
+ variant: 'activity' | 'collectible' | 'balance' | 'price' | 'value'
}
const EmptyState = (props: Props) => {
@@ -14,8 +27,8 @@ const EmptyState = (props: Props) => {
const content = match(variant)
.with('activity', () => ({
imageId: 'admin/empty/devices:241:240' as ImageId,
- imageAlt: 'No activity',
- title: 'No Activity',
+ imageAlt: 'No history',
+ title: 'No history',
description: 'Transaction history will be visible on this page',
}))
.with('collectible', () => ({
@@ -24,11 +37,33 @@ const EmptyState = (props: Props) => {
title: 'No Collectibles',
description: 'Your collectibles will be visible on this page',
}))
+ .with('balance', () => ({
+ imageId: 'Portfolio/Empty States/No_Balance:750:232' as ImageId,
+ imageAlt: 'No balance',
+ title: 'No balance',
+ description: 'Hold this asset to view your balance history here',
+ }))
+ .with('price', () => ({
+ imageId: 'Portfolio/Empty States/No_Balance:750:232' as ImageId,
+ imageAlt: 'No prices',
+ title: 'No prices',
+ description: 'Prices will be visible on this page',
+ }))
+ .with('value', () => ({
+ imageId: 'Portfolio/Empty States/No_Balance:750:232' as ImageId,
+ imageAlt: 'No value',
+ title: 'No value',
+ description: 'Hold this asset to view your value history here',
+ }))
.exhaustive()
return (
-
+
{content.title}
{content.description}
diff --git a/packages/wallet/src/components/feedback/index.tsx b/packages/wallet/src/components/feedback/index.tsx
index 97b3ff88f..3d29dba61 100644
--- a/packages/wallet/src/components/feedback/index.tsx
+++ b/packages/wallet/src/components/feedback/index.tsx
@@ -62,7 +62,7 @@ const FeedbackPopover = () => {
const FeedbackSection = () => {
return (
-
+
We're building with you.
@@ -74,7 +74,7 @@ const FeedbackSection = () => {
target="_blank"
className="flex justify-between px-2 py-[5px] text-15 font-500 text-neutral-100 hover:text-neutral-50"
>
- {label}
+ {label}
))}
diff --git a/packages/wallet/src/components/image/types.ts b/packages/wallet/src/components/image/types.ts
index b9e11cbc9..7f8d24196 100644
--- a/packages/wallet/src/components/image/types.ts
+++ b/packages/wallet/src/components/image/types.ts
@@ -1,4 +1,14 @@
export type ImageType =
+ | { id: 'Portfolio/Empty States/No_Balance:750:232'; alt: '' }
+ | { id: 'Wallet/Icons/Logos/mercuryo-bigger:144:144'; alt: '' }
+ | { id: 'Wallet/Icons/Logos/moonpay-bigger:144:144'; alt: '' }
+ | { id: 'Wallet/Icons/Logos/mercuryo:64:64'; alt: '' }
+ | { id: 'Wallet/Icons/Logos/moonpay:64:64'; alt: '' }
+ | { id: 'Homepage/Screens/Extension Section/Extension_01:2127:2390'; alt: '' }
+ | {
+ id: 'Help/Documentation Screens/Wallet/1532/1532_1_Screen_Light:1872:1208'
+ alt: 'A diagram showing the relationship between wallet accounts, keys, and derivation paths'
+ }
| {
id: 'Help/Documentation Screens/Wallet/1512/1512_1_Screen:1480:1480'
alt: ''
diff --git a/packages/wallet/src/components/import-recovery-phrase-form/index.tsx b/packages/wallet/src/components/import-recovery-phrase-form/index.tsx
index 8391dacbe..9db1dad7a 100644
--- a/packages/wallet/src/components/import-recovery-phrase-form/index.tsx
+++ b/packages/wallet/src/components/import-recovery-phrase-form/index.tsx
@@ -12,7 +12,7 @@ const mnemonicSchema = z.object({
mnemonic: z
.string()
.trim()
- .refine(value => validateMnemonic(value, english), {
+ .refine(value => value === '' || validateMnemonic(value, english), {
message: 'Invalid phrase. Check word count and spelling.',
}),
})
@@ -38,8 +38,11 @@ const ImportRecoveryPhraseForm = ({
const {
formState: { errors },
+ watch,
} = form
+ const mnemonicValue = watch('mnemonic')
+
return (
I've backed up my recovery phrase and understand that clicking “Finish
- Backup” will completely and permanently delete it from this wallet
- interface.
+ Backup” will remove it from this wallet interface.
diff --git a/packages/wallet/src/components/recovery-phrase-textarea/index.tsx b/packages/wallet/src/components/recovery-phrase-textarea/index.tsx
index 5e750cd89..d1b7b2ac5 100644
--- a/packages/wallet/src/components/recovery-phrase-textarea/index.tsx
+++ b/packages/wallet/src/components/recovery-phrase-textarea/index.tsx
@@ -14,12 +14,20 @@ function RecoveryPhraseTextarea(props: Props) {
const { field, fieldState } = useController(props)
const invalid = fieldState.invalid
+ const handlePaste = (event: React.ClipboardEvent) => {
+ event.preventDefault()
+ const pastedText = event.clipboardData.getData('text')
+ const trimmedText = pastedText.trim()
+ field.onChange(trimmedText)
+ }
+
return (
)
}
diff --git a/packages/wallet/src/components/send-assets-modal/index.tsx b/packages/wallet/src/components/send-assets-modal/index.tsx
index 199eb2a18..39c9ac75e 100644
--- a/packages/wallet/src/components/send-assets-modal/index.tsx
+++ b/packages/wallet/src/components/send-assets-modal/index.tsx
@@ -1,6 +1,6 @@
'use client'
-import { useEffect, useMemo, useRef, useState } from 'react'
+import { useEffect, useMemo, useState } from 'react'
import { zodResolver } from '@hookform/resolvers/zod'
import * as Dialog from '@radix-ui/react-dialog'
@@ -13,6 +13,7 @@ import * as z from 'zod'
import { CurrencyAmount } from '../currency-amount'
import { NetworkLogo } from '../network-logo'
import { PasswordModal } from '../password-modal'
+import { TokenAmount } from '../token-amount'
import type { NetworkType } from '../../data'
import type { Account } from '../address'
@@ -31,12 +32,15 @@ type Props = {
totalBalanceEur: number
contractAddress?: string
network: NetworkType
+ decimals: number
}
signTransaction: (data: FormData & { password: string }) => Promise
verifyPassword: (inputPassword: string) => Promise
onEstimateGas: (to: string, value: string) => void
gasFees?: {
maxFeeEur: number
+ feeEur: number
+ maxFeeEth: number
confirmationTime: string
feeEth: number
}
@@ -45,22 +49,39 @@ type Props = {
type TransactionState = 'idle' | 'signing' | 'pending' | 'success' | 'error'
-const createFormSchema = (balance: number) =>
+const createFormSchema = (
+ balance: number,
+ fromAddress: string,
+ maxGasFeeEth?: number,
+ assetSymbol?: string,
+) =>
z.object({
to: z
.string()
.min(1, 'Recipient address is required')
- .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid wallet address'),
+ .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid wallet address')
+ .refine(
+ val => val.toLowerCase() !== fromAddress.toLowerCase(),
+ 'You are sending assets to yourself',
+ ),
amount: z
.string()
.min(1, 'Amount is required')
.refine(
val => {
- const num = Number.parseFloat(val)
- return num > 0 && num <= balance
+ const amount = Number.parseFloat(val)
+ if (!maxGasFeeEth) return amount > 0 && amount <= balance
+
+ const isETH = assetSymbol === 'ETH'
+ const totalCost = isETH ? amount + maxGasFeeEth : maxGasFeeEth
+ const availableBalance = balance
+
+ return amount > 0 && totalCost <= availableBalance
},
{
- message: 'More than available balance',
+ message: maxGasFeeEth
+ ? `Insufficient balance. Max gas fees: ${maxGasFeeEth.toFixed(6)} ETH`
+ : 'More than available balance',
},
),
contractAddress: z
@@ -97,12 +118,22 @@ const SendAssetsModal = (props: Props) => {
const balance = asset.totalBalance
const ethBalance = account.ethBalance
- const formSchema = useMemo(() => createFormSchema(balance), [balance])
+ const formSchema = useMemo(
+ () =>
+ createFormSchema(
+ balance,
+ account.address,
+ gasFees?.maxFeeEth,
+ asset.symbol,
+ ),
+ [balance, account.address, gasFees?.maxFeeEth, asset.symbol],
+ )
const {
control,
handleSubmit,
watch,
+ setValue,
formState: { errors },
reset,
} = useForm({
@@ -119,9 +150,9 @@ const SendAssetsModal = (props: Props) => {
const watchedTo = watch('to')
const balanceEur = asset.totalBalanceEur
- const debounceTimeout = useRef(null)
-
- const memoizedOnEstimateGas = useRef(onEstimateGas)
+ useEffect(() => {
+ setValue('contractAddress', asset.contractAddress || undefined)
+ }, [asset.contractAddress, setValue])
// Estimate gas fees when 'to' or 'amount' changes
useEffect(() => {
@@ -130,22 +161,13 @@ const SendAssetsModal = (props: Props) => {
const parsed = Number.parseFloat(watchedAmount)
if (Number.isNaN(parsed)) return
- if (debounceTimeout.current) {
- clearTimeout(debounceTimeout.current)
- }
-
- debounceTimeout.current = setTimeout(() => {
- const amountInWei = BigInt(Math.floor(parsed * 1e18)).toString(16)
- memoizedOnEstimateGas.current(watchedTo, `0x${amountInWei}`)
- }, 300)
+ if (parsed <= 0 || parsed > balance) return
- return () => {
- if (debounceTimeout.current) {
- clearTimeout(debounceTimeout.current)
- debounceTimeout.current = null
- }
- }
- }, [watchedTo, watchedAmount])
+ const amountInWei = BigInt(
+ Math.floor(parsed * Math.pow(10, asset.decimals)),
+ ).toString(16)
+ onEstimateGas(watchedTo, `0x${amountInWei}`)
+ }, [watchedTo, watchedAmount, onEstimateGas, asset.decimals, balance])
// Check for insufficient ETH balance
useEffect(() => {
@@ -160,8 +182,8 @@ const SendAssetsModal = (props: Props) => {
const amountToSend = Number.parseFloat(watchedAmount)
const hasInsufficientEthNow = isETH
- ? ethBalance < amountToSend + gasFees.feeEth
- : ethBalance < gasFees.feeEth
+ ? ethBalance <= amountToSend + gasFees.maxFeeEth
+ : ethBalance <= gasFees.maxFeeEth
if (hasInsufficientEthNow) {
if (!hasInsufficientEth) {
@@ -199,7 +221,7 @@ const SendAssetsModal = (props: Props) => {
setTransactionState('pending')
if (pendingTransactionData) {
- toast.positive('Transaction signed', {
+ toast.positive('Transaction signed and sent', {
duration: 2000,
})
@@ -209,12 +231,6 @@ const SendAssetsModal = (props: Props) => {
...pendingTransactionData,
password,
})
-
- setTransactionState('success')
-
- setTimeout(() => {
- toast.positive('Transaction successful')
- }, 5000)
}
} catch (error) {
setTransactionState('error')
@@ -248,7 +264,9 @@ const SendAssetsModal = (props: Props) => {
}
const hasInsufficientBalance =
- watchedAmount && Number.parseFloat(watchedAmount) > balance
+ watchedAmount &&
+ Number.parseFloat(watchedAmount) > balance &&
+ Number.parseFloat(watchedAmount) > 0
const isTransactionSigning = transactionState === 'signing'
@@ -266,12 +284,12 @@ const SendAssetsModal = (props: Props) => {
data-customisation="blue"
className="fixed left-0 top-[38px] flex size-full justify-center"
>
-
+
Send assets
-
+
Send {asset.name} to another wallet
@@ -291,18 +309,18 @@ const SendAssetsModal = (props: Props) => {
>
-
To
- {errors.amount && (
+ {errors.amount && hasInsufficientBalance && (
{errors.amount.message}
@@ -394,15 +417,21 @@ const SendAssetsModal = (props: Props) => {
{watchedAmount && !hasInsufficientBalance && (
Remaining ~{' '}
- {(
- balance - Number.parseFloat(watchedAmount || '0')
- ).toLocaleString()}{' '}
+
{' '}
{asset.symbol} /{' '}
@@ -481,25 +510,35 @@ const SendAssetsModal = (props: Props) => {
Not enough ETH to pay gas fees
-
+
Add ETH
)}
{/* Gas Fees Section */}
- {watchedTo && watchedAmount && (
+ {!hasInsufficientBalance && watchedTo && watchedAmount && (
Max fees
{gasFees ? (
- <>
-
+ {' '}
- >
+ ETH /{' '}
+
+
) : (
'Estimating...'
)}
@@ -539,7 +578,7 @@ const SendAssetsModal = (props: Props) => {
onOpenChange={handlePasswordModalClose}
onConfirm={handlePasswordConfirm}
isLoading={isTransactionSigning}
- buttonLabel="Sign Transaction"
+ buttonLabel="Send Transaction"
/>
>
)
diff --git a/packages/wallet/src/constants/erc20.json b/packages/wallet/src/constants/erc20.json
index b8bda8787..66d9539ef 100644
--- a/packages/wallet/src/constants/erc20.json
+++ b/packages/wallet/src/constants/erc20.json
@@ -5594,7 +5594,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"56": {
@@ -7243,7 +7243,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"1": {
@@ -11421,7 +11421,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"1": {
@@ -14211,7 +14211,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"1": {
@@ -15067,7 +15067,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"1": {
@@ -17510,7 +17510,7 @@
"name": "Uniswap",
"symbol": "UNI",
"decimals": 18,
- "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg",
+ "logoURI": "https://assets.coingecko.com/coins/images/12504/thumb/uniswap-logo.png?1720676669",
"extensions": {
"bridgeInfo": {
"1": {
diff --git a/packages/wallet/src/constants/errors.ts b/packages/wallet/src/constants/errors.ts
new file mode 100644
index 000000000..7242c6007
--- /dev/null
+++ b/packages/wallet/src/constants/errors.ts
@@ -0,0 +1,30 @@
+export const ERROR_MESSAGES = {
+ NETWORK:
+ 'Couldn’t connect to the network. Please check your internet and try again.',
+ TIMEOUT: 'The request took too long. Refresh or try again later.',
+ ASSETS_FETCH: 'We couldn’t fetch your assets. Refresh or try again later.',
+ TOKEN_INFO:
+ 'Something went wrong loading token info. Refresh or try again later.',
+ BALANCE: 'Couldn’t retrieve balance. Refresh or try again later.',
+ COLLECTIBLES:
+ 'We had an issue loading your collectibles. Refresh or try again later.',
+ COLLECTIBLES_PARTIAL:
+ 'Some collectible data couldn’t be fetched. Refresh or try again later.',
+ COLLECTIBLE_INFO:
+ 'Something went wrong loading collectible info. Refresh or try again later.',
+ TX_FAILED:
+ 'Your transaction didn’t go through. Check gas settings and try again.',
+ SIGNING: 'Something went wrong while signing. Please try again.',
+ GENERAL:
+ 'We hit an unexpected issue. Please restart extension and try again.',
+ ACTION_GENERIC: 'That didn’t work. Please try again.',
+ NEW_TAB: 'Unable to open a new tab. Please check your browser settings.',
+ PROVIDER_NOT_SUPPORTED: 'Provider not supported.',
+ NO_WALLET_SELECTED: 'No wallet selected. Please select a wallet to continue.',
+ INVALID_PASSWORD: 'Invalid password. Please try again.',
+ GAS_FEES_FETCH:
+ 'We couldn’t fetch gas fee. Please try again later or check your network connection.',
+ ACTIVITIES: 'We couldn’t fetch your activities. Refresh or try again later.',
+ RECOVERY_PHRASE_BACKUP:
+ 'Failed to mark recovery phrase as backed up. Please try again later.',
+}
diff --git a/packages/wallet/src/constants/index.ts b/packages/wallet/src/constants/index.ts
index 1193cef4c..0e2f43aa7 100644
--- a/packages/wallet/src/constants/index.ts
+++ b/packages/wallet/src/constants/index.ts
@@ -1 +1,2 @@
+export { ERROR_MESSAGES } from './errors'
export { GRADIENTS } from './gradients'
diff --git a/packages/wallet/src/data/api/lib/trpc.ts b/packages/wallet/src/data/api/lib/trpc.ts
index bd539ee7a..3b400bc59 100644
--- a/packages/wallet/src/data/api/lib/trpc.ts
+++ b/packages/wallet/src/data/api/lib/trpc.ts
@@ -1,4 +1,4 @@
-import { initTRPC } from '@trpc/server'
+import { initTRPC, TRPCError } from '@trpc/server'
import superjson from 'superjson'
import { ZodError } from 'zod'
@@ -59,6 +59,30 @@ export const { createCallerFactory } = t
*/
export const router = t.router
+const errorMiddleware = t.middleware(async opts => {
+ const result = await opts.next()
+
+ if (!result.ok && result.error) {
+ const error = result.error.cause
+
+ if (error instanceof Error && error.cause === 429) {
+ throw new TRPCError({
+ code: 'TOO_MANY_REQUESTS',
+ message: error.message,
+ cause: error,
+ })
+ }
+
+ throw new TRPCError({
+ code: 'INTERNAL_SERVER_ERROR',
+ message: error?.message || 'Unknown error',
+ cause: error,
+ })
+ }
+
+ return result
+})
+
/**
* Unauthenticated procedure
*
@@ -66,4 +90,4 @@ export const router = t.router
* guarantee that a user querying is authorized, but you can still access user session data if they
* are logged in.
*/
-export const publicProcedure = t.procedure
+export const publicProcedure = t.procedure.use(errorMiddleware)
diff --git a/packages/wallet/src/data/api/routers/activity.ts b/packages/wallet/src/data/api/routers/activity.ts
index e928a839b..18ab52942 100644
--- a/packages/wallet/src/data/api/routers/activity.ts
+++ b/packages/wallet/src/data/api/routers/activity.ts
@@ -41,7 +41,7 @@ const cachedPriceData = cache(async (key: string) => {
return await fetchTokensPriceForDate(symbols, timestamp)
})
-type PriceDataResponse = Record
+type PriceDataResponse = Record
const batchPriceRequests = async (
priceRequests: Array<{ symbols: string[]; timestamp: number }>,
@@ -242,7 +242,7 @@ export async function page({
activity.asset || (activity.category === 'external' ? 'ETH' : null)
if (assetSymbol && priceData[assetSymbol]) {
- const eurRate = priceData[assetSymbol].EUR?.PRICE ?? 0
+ const eurRate = priceData[assetSymbol].USD?.PRICE ?? 0
return {
...activity,
@@ -346,7 +346,7 @@ export async function activity(
activity.asset || (activity.category === 'external' ? 'ETH' : null)
if (assetSymbol && priceData[assetSymbol]) {
- const eurRate = priceData[assetSymbol].EUR?.PRICE ?? 0
+ const eurRate = priceData[assetSymbol].USD?.PRICE ?? 0
return {
...activity,
diff --git a/packages/wallet/src/data/api/routers/assets.ts b/packages/wallet/src/data/api/routers/assets.ts
index 3084b297e..51f3f9818 100644
--- a/packages/wallet/src/data/api/routers/assets.ts
+++ b/packages/wallet/src/data/api/routers/assets.ts
@@ -4,11 +4,11 @@ import { z } from 'zod'
import erc20TokenList from '../../../constants/erc20.json'
import nativeTokenList from '../../../constants/native.json'
+import { toChecksumAddress } from '../../../utils'
import {
fetchTokenBalanceHistory,
getERC20TokensBalance,
getNativeTokenBalance,
- getTokensBalance,
} from '../../services/alchemy'
import {
fetchTokenMetadata,
@@ -30,6 +30,7 @@ type Asset = {
price_percentage_24h_change: number
balance: number
total_eur: number
+ decimals?: number
metadata: {
market_cap: number
fully_dilluted: number
@@ -61,12 +62,13 @@ const STATUS_NETWORKS: Record = {
}
const DEFAULT_TOKEN_SYMBOLS = [
+ 'ETH',
'SNT',
'USDC',
'USDT',
'LINK',
'PEPE',
- 'WBNB',
+ 'UNI',
'SHIB',
]
@@ -185,7 +187,6 @@ const cachedAll = cache(async (key: string) => {
return await all({ address, networks })
})
-// note: https://docs.alchemy.com/reference/alchemy-gettokenbalances can now return native tokens together with ERC20 tokens
async function all({
address,
networks,
@@ -200,94 +201,67 @@ async function all({
try {
const assets: Omit[] = []
+ // note: https://docs.alchemy.com/reference/alchemy-gettokenbalances can now return native tokens together with ERC20 tokens
+ // Native tokens
const filteredNativeTokens = nativeTokenList.tokens.filter(token =>
Object.entries(STATUS_NETWORKS)
.filter(([, network]) => networks.includes(network))
.map(([chainId]) => Number(chainId))
.includes(token.chainId),
)
-
- const tokenBalances = new Map<
- string,
- { balance: number; network: NetworkType; isNative: boolean }
- >()
- let pageKey: string | undefined
-
- do {
- const result = await getTokensBalance(address, networks, pageKey)
-
- for (const tokenBalance of result.tokens) {
- const balance = Number(tokenBalance.tokenBalance)
-
- if (balance > 0) {
- if (tokenBalance.tokenAddress) {
- // ERC20 token
- const token = erc20TokenList.tokens.find(
- t =>
- t.address.toLowerCase() ===
- tokenBalance.tokenAddress?.toLowerCase() ||
- t.address === tokenBalance.tokenAddress,
- )
- if (token) {
- tokenBalances.set(tokenBalance.tokenAddress, {
- balance: balance / 10 ** token.decimals,
- network: STATUS_NETWORKS[token.chainId] || 'ethereum',
- isNative: false,
- })
- }
- } else {
- // Native token
- const network = networks[0]
- const chainId = Object.entries(STATUS_NETWORKS).find(
- ([, n]) => n === network,
- )?.[0]
- if (chainId) {
- const nativeToken = nativeTokenList.tokens.find(
- token => token.chainId === Number(chainId),
- )
- if (nativeToken) {
- tokenBalances.set(nativeToken.symbol, {
- balance: balance / 10 ** nativeToken.decimals,
- network: STATUS_NETWORKS[nativeToken.chainId],
- isNative: true,
- })
- }
- }
- }
+ await Promise.all(
+ filteredNativeTokens.map(async token => {
+ const balance = await getNativeTokenBalance(
+ address,
+ STATUS_NETWORKS[token.chainId],
+ )
+ const price = (await legacy_fetchTokensPrice([token.symbol]))[
+ token.symbol
+ ]
+
+ const asset: Omit = {
+ networks: [STATUS_NETWORKS[token.chainId]],
+ native: true,
+ contract: null,
+ icon: token.logoURI,
+ name: token.name,
+ symbol: token.symbol,
+ price_eur: price.USD['PRICE'],
+ price_percentage_24h_change: price.USD['CHANGEPCT24HOUR'],
+ balance: Number(balance) / 10 ** token.decimals,
+ total_eur:
+ (Number(balance) / 10 ** token.decimals) * price.USD['PRICE'],
+ decimals: token.decimals,
}
- }
-
- pageKey = result.pageKey || undefined
- } while (pageKey)
- // Native tokens
- for (const [symbol, balanceInfo] of tokenBalances) {
- if (balanceInfo.isNative) {
- const token = filteredNativeTokens.find(t => t.symbol === symbol)
- if (token) {
- const price = (await legacy_fetchTokensPrice([token.symbol]))[
- token.symbol
- ]
+ assets.push(asset)
+ }),
+ )
- const asset: Omit = {
- networks: [balanceInfo.network],
- native: true,
- contract: null,
- icon: token.logoURI,
- name: token.name,
- symbol: token.symbol,
- price_eur: price.EUR['PRICE'],
- price_percentage_24h_change: price.EUR['CHANGEPCT24HOUR'],
- balance: balanceInfo.balance,
- total_eur: balanceInfo.balance * price.EUR['PRICE'],
- }
+ // ERC20 tokens
+ const filteredERC20Tokens = new Map(
+ erc20TokenList.tokens
+ .filter(token =>
+ Object.entries(STATUS_NETWORKS)
+ .filter(([, network]) => networks.includes(network))
+ .map(([chainId]) => Number(chainId))
+ .includes(token.chainId),
+ )
+ .map(token => [toChecksumAddress(token.address), token]),
+ )
- assets.push(asset)
- }
- }
- }
+ const ERC20TokensByNetwork = Array.from(
+ filteredERC20Tokens.values(),
+ ).reduce(
+ (acc, token) => {
+ const network = STATUS_NETWORKS[token.chainId]
+ if (!acc[network]) acc[network] = []
+ acc[network].push(token)
+ return acc
+ },
+ {} as Record,
+ )
- // ERC20 tokens
const partialERC20Assets: Map<
string,
Omit<
@@ -296,25 +270,46 @@ async function all({
>
> = new Map()
- for (const [contractAddress, balanceInfo] of tokenBalances) {
- if (!balanceInfo.isNative) {
- const token = erc20TokenList.tokens.find(
- t =>
- t.address.toLowerCase() === contractAddress.toLowerCase() ||
- t.address === contractAddress,
+ for (const [network] of Object.entries(ERC20TokensByNetwork) as Array<
+ [string, ERC20Token[]]
+ >) {
+ let pageKey: string | undefined
+
+ do {
+ const result = await getERC20TokensBalance(
+ address,
+ network as NetworkType,
+ undefined,
+ pageKey,
)
- if (token) {
- partialERC20Assets.set(contractAddress, {
- networks: [balanceInfo.network],
- native: false,
- contract: token.address,
- icon: token.logoURI,
- name: token.name,
- symbol: token.symbol,
- balance: balanceInfo.balance,
- })
+
+ for (const balance of result.tokenBalances) {
+ const tokenBalance = Number(balance.tokenBalance)
+
+ if (tokenBalance > 0) {
+ const token = filteredERC20Tokens.get(
+ toChecksumAddress(balance.contractAddress),
+ )
+ if (token) {
+ const checksummedAddress = toChecksumAddress(
+ balance.contractAddress,
+ )
+ partialERC20Assets.set(checksummedAddress, {
+ networks: [network as NetworkType],
+ native: false,
+ contract: checksummedAddress,
+ icon: token.logoURI,
+ name: token.name,
+ symbol: token.symbol,
+ balance: tokenBalance / 10 ** token.decimals,
+ decimals: token.decimals,
+ })
+ }
+ }
}
- }
+
+ pageKey = result.pageKey
+ } while (pageKey)
}
const batchSize = 300
@@ -331,9 +326,10 @@ async function all({
if (price) {
const asset: Omit = {
...partialAsset,
- price_eur: price['EUR']['PRICE'] ?? 0,
- price_percentage_24h_change: price['EUR']['CHANGEPCT24HOUR'] ?? 0,
- total_eur: partialAsset.balance * (price['EUR']['PRICE'] ?? 0),
+ price_eur: price['USD']['PRICE'] ?? 0,
+ price_percentage_24h_change: price['USD']['CHANGEPCT24HOUR'] ?? 0,
+ total_eur: partialAsset.balance * (price['USD']['PRICE'] ?? 0),
+ decimals: partialAsset.decimals, // <-- Mantém decimals
}
assets.push(asset)
@@ -384,15 +380,18 @@ async function all({
icon: token.logoURI,
name: token.name,
symbol: token.symbol,
- price_eur: prices[symbol].EUR.PRICE,
- price_percentage_24h_change: prices[symbol].EUR.CHANGEPCT24HOUR,
+ price_eur: prices[symbol].USD.PRICE,
+ price_percentage_24h_change: prices[symbol].USD.CHANGEPCT24HOUR,
balance: 0,
total_eur: 0,
+ decimals: token.decimals,
})
}
}
}
+ aggregatedAssets.sort((a, b) => b.total_eur - a.total_eur)
+
const summary = sum(aggregatedAssets)
return {
@@ -536,14 +535,14 @@ async function token({
// fixme: not found contract but at least 1 other returns
await Promise.allSettled(
filteredERC20Tokens.map(async token => {
- const balance = await getERC20TokensBalance(
+ const result = await getERC20TokensBalance(
address,
STATUS_NETWORKS[token.chainId],
[token.address],
)
if (
- !Number(balance[0].tokenBalance) &&
+ !Number(result.tokenBalances[0].tokenBalance) &&
!DEFAULT_TOKEN_SYMBOLS.includes(token.symbol)
) {
throw new Error(`Balance not found for token ${token.symbol}`)
@@ -560,7 +559,7 @@ async function token({
const asset = map({
token,
- balance: balance[0].tokenBalance,
+ balance: result.tokenBalances[0].tokenBalance,
price,
priceHistory,
tokenMetadata,
@@ -671,6 +670,7 @@ async function nativeTokenBalanceChart({
days,
undefined,
currentTime,
+ 18,
)
return { [network]: data } as Record<
@@ -732,6 +732,7 @@ async function tokenBalanceChart({
days,
token.address,
currentTime,
+ token.decimals,
)
return { [STATUS_NETWORKS[token.chainId]]: data } as Record<
@@ -843,6 +844,9 @@ function map(data: {
tokenMetadata: any
}): Asset {
const { token, balance, price, priceHistory, tokenMetadata } = data
+
+ const lows = priceHistory.map(({ low }) => low).filter(low => low > 0)
+
return {
networks: [STATUS_NETWORKS[token.chainId]],
...('address' in token
@@ -851,18 +855,19 @@ function map(data: {
icon: token.logoURI,
name: token.name,
symbol: token.symbol,
- price_eur: price.EUR['PRICE'],
- price_percentage_24h_change: price.EUR['CHANGEPCT24HOUR'],
+ price_eur: price.USD['PRICE'],
+ price_percentage_24h_change: price.USD['CHANGEPCT24HOUR'],
balance: Number(balance) / 10 ** token.decimals,
- total_eur: (Number(balance) / 10 ** token.decimals) * price.EUR['PRICE'],
+ total_eur: (Number(balance) / 10 ** token.decimals) * price.USD['PRICE'],
+ decimals: token.decimals,
metadata: {
- market_cap: price.EUR['MKTCAP'],
- fully_dilluted: price.EUR['PRICE'] * tokenMetadata['SUPPLY_TOTAL'],
- circulation: price.EUR['CIRCULATINGSUPPLY'],
+ market_cap: price.USD['MKTCAP'],
+ fully_dilluted: price.USD['PRICE'] * tokenMetadata['SUPPLY_TOTAL'],
+ circulation: price.USD['CIRCULATINGSUPPLY'],
total_supply: tokenMetadata['SUPPLY_TOTAL'],
all_time_high: Math.max(...priceHistory.map(({ high }) => high)),
- all_time_low: Math.min(...priceHistory.map(({ low }) => low)),
- volume_24: price.EUR['TOTALVOLUME24H'],
+ all_time_low: lows.length ? Math.min(...lows) : price.USD['PRICE'],
+ volume_24: price.USD['TOTALVOLUME24HTO'],
rank_by_market_cap:
tokenMetadata['TOPLIST_BASE_RANK']['TOTAL_MKT_CAP_USD'],
about: tokenMetadata['ASSET_DESCRIPTION'],
@@ -878,7 +883,9 @@ function sum(assets: Asset[] | Omit[]) {
acc + asset.total_eur * (asset.price_percentage_24h_change / 100),
0,
)
- const total_percentage_24h_change = (total_eur_24h_change / total_eur) * 100
+ const total_percentage_24h_change = total_eur
+ ? (total_eur_24h_change / total_eur) * 100
+ : 0
return {
total_balance,
diff --git a/packages/wallet/src/data/api/routers/collectibles.ts b/packages/wallet/src/data/api/routers/collectibles.ts
index 50b02770c..20d70e0ac 100644
--- a/packages/wallet/src/data/api/routers/collectibles.ts
+++ b/packages/wallet/src/data/api/routers/collectibles.ts
@@ -164,7 +164,7 @@ async function collectible(
const nft = await getNFTMetadata(contract, tokenId, network)
// todo: replace floor price provider https://github.com/status-im/status-website/issues/1547
- const currency = 'EUR'
+ const currency = 'USD'
let price: number | undefined
let floorPrice: number | undefined
if (network === 'ethereum') {
diff --git a/packages/wallet/src/data/api/routers/nodes.ts b/packages/wallet/src/data/api/routers/nodes.ts
index 4dfc92c1e..17c1a7613 100644
--- a/packages/wallet/src/data/api/routers/nodes.ts
+++ b/packages/wallet/src/data/api/routers/nodes.ts
@@ -18,6 +18,7 @@ export const nodesRouter = router({
from: z.string(),
to: z.string(),
value: z.string(),
+ data: z.string().optional(),
}),
}),
)
diff --git a/packages/wallet/src/data/services/alchemy/index.ts b/packages/wallet/src/data/services/alchemy/index.ts
index c0ef68001..3d20db7bc 100644
--- a/packages/wallet/src/data/services/alchemy/index.ts
+++ b/packages/wallet/src/data/services/alchemy/index.ts
@@ -17,6 +17,7 @@ import { estimateConfirmationTime, processFeeHistory } from './utils'
import type { NetworkType } from '../../api/types'
import type {
AssetTransfer,
+ BlockNumberResponseBody,
BlockResponseBody,
deprecated_NFTSaleResponseBody,
ERC20TokenBalanceResponseBody,
@@ -32,6 +33,7 @@ import type {
TokenBalanceHistoryResponseBody,
TokensBalanceResponseBody,
TransactionCountResponseBody,
+ TransactionStatusResponseBody,
} from './types'
const alchemyNetworks = {
@@ -95,7 +97,7 @@ export async function getNativeTokenBalance(
`https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
)
const body = await _retry(async () =>
- _fetch(url, 'POST', 15, {
+ _fetch(url, 'POST', 0, {
id: 1,
jsonrpc: '2.0',
method: 'eth_getBalance',
@@ -116,26 +118,35 @@ export async function getNativeTokenBalance(
export async function getERC20TokensBalance(
address: string,
network: NetworkType,
- contracts: string[],
+ contracts?: string[],
+ pageKey?: string,
) {
- if (contracts.length > 1000) {
+ if (contracts && contracts.length > 100) {
throw new Error('Too many contracts')
}
const url = new URL(
`https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
)
+ const params: (string | string[])[] =
+ contracts && contracts.length > 0 ? [address, contracts] : [address]
+
+ if (pageKey) {
+ params.push(pageKey)
+ }
+
const body = await _retry(async () =>
- _fetch(url, 'POST', 15, {
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
method: 'alchemy_getTokenBalances',
- params: [address, contracts],
+ params,
}),
)
- const balances = body.result.tokenBalances
-
- return balances
+ return {
+ tokenBalances: body.result.tokenBalances,
+ pageKey: body.result.pageKey,
+ }
}
/**
@@ -153,7 +164,7 @@ export async function getTokensBalance(
)
const body = await _retry(async () =>
- _fetch(url, 'POST', 15, {
+ _fetch(url, 'POST', 0, {
addresses: [
{
address,
@@ -181,41 +192,34 @@ export async function fetchTokenBalanceHistory(
days: '1' | '7' | '30' | '90' | '365' | 'all' = '1',
contract?: string,
currentTime?: number,
+ decimals: number = 18,
) {
const transfers: TokenBalanceHistoryResponseBody['result']['transfers'] = []
{
- const response = await fetch(
+ const url = new URL(
`https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- jsonrpc: '2.0',
- method: 'alchemy_getAssetTransfers',
- params: [
- {
- fromBlock: '0x0',
- toBlock: 'latest',
- toAddress: address,
- category: [contract ? 'erc20' : 'external'],
- order: 'desc',
- withMetadata: true,
- excludeZeroValue: true,
- maxCount: '0x3e8',
- ...(contract && { contractAddresses: [contract] }),
- },
- ],
- }),
- next: {
- revalidate: 3600,
- },
- },
)
- const body: TokenBalanceHistoryResponseBody = await response.json()
+ const body = await _retry(async () =>
+ _fetch(url, 'POST', 0, {
+ jsonrpc: '2.0',
+ method: 'alchemy_getAssetTransfers',
+ params: [
+ {
+ fromBlock: '0x0',
+ toBlock: 'latest',
+ toAddress: address,
+ category: [contract ? 'erc20' : 'external'],
+ order: 'desc',
+ withMetadata: true,
+ excludeZeroValue: true,
+ maxCount: '0x3e8',
+ ...(contract && { contractAddresses: [contract] }),
+ },
+ ],
+ }),
+ )
transfers.push(...body.result.transfers)
}
@@ -223,37 +227,29 @@ export async function fetchTokenBalanceHistory(
await new Promise(resolve => setTimeout(resolve, 1000))
{
- const response = await fetch(
+ const url = new URL(
`https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- jsonrpc: '2.0',
- method: 'alchemy_getAssetTransfers',
- params: [
- {
- fromBlock: '0x0',
- toBlock: 'latest',
- fromAddress: address,
- category: [contract ? 'erc20' : 'external'],
- order: 'desc',
- withMetadata: true,
- excludeZeroValue: true,
- maxCount: '0x3e8',
- ...(contract && { contractAddresses: [contract] }),
- },
- ],
- }),
- next: {
- revalidate: 3600,
- },
- },
)
- const body: TokenBalanceHistoryResponseBody = await response.json()
+ const body = await _retry(async () =>
+ _fetch(url, 'POST', 0, {
+ jsonrpc: '2.0',
+ method: 'alchemy_getAssetTransfers',
+ params: [
+ {
+ fromBlock: '0x0',
+ toBlock: 'latest',
+ fromAddress: address,
+ category: [contract ? 'erc20' : 'external'],
+ order: 'desc',
+ withMetadata: true,
+ excludeZeroValue: true,
+ maxCount: '0x3e8',
+ ...(contract && { contractAddresses: [contract] }),
+ },
+ ],
+ }),
+ )
transfers.push(...body.result.transfers)
}
@@ -280,10 +276,6 @@ export async function fetchTokenBalanceHistory(
) === index,
)
- const now = Math.floor(Date.now() / (1000 * 3600)) * 3600
- const hoursInPeriod = Number(days) * 24
- const requestedStartTime = now - (hoursInPeriod - 1) * 3600
-
if (uniqueTransfers.length === 0) {
return []
}
@@ -294,24 +286,48 @@ export async function fetchTokenBalanceHistory(
),
)
- const timestamps = Array.from(
- { length: hoursInPeriod },
- (_, i) => requestedStartTime + i * 3600,
- )
- timestamps.push(currentTime || Date.now() / 1000)
+ const now = Math.floor(Date.now() / 1000)
+
+ const requestedDays = days === 'all' ? 3650 : Number(days)
+ const effectiveDays = requestedDays
+
+ let intervalSeconds: number
+ if (requestedDays <= 1) {
+ intervalSeconds = 3600
+ } else if (requestedDays <= 7) {
+ intervalSeconds = 3600
+ } else if (requestedDays <= 30) {
+ intervalSeconds = 4 * 3600
+ } else if (requestedDays <= 90) {
+ intervalSeconds = 12 * 3600
+ } else if (requestedDays <= 365) {
+ intervalSeconds = 24 * 3600
+ } else {
+ intervalSeconds = 7 * 24 * 3600
+ }
+
+ const requestedStartTime = now - effectiveDays * 24 * 3600
+ const timestamps: number[] = []
+
+ for (let time = requestedStartTime; time <= now; time += intervalSeconds) {
+ timestamps.push(time)
+ }
+
+ if (timestamps[timestamps.length - 1] !== now) {
+ timestamps.push(currentTime || now)
+ }
timestamps.reverse()
let balance: string
if (contract) {
- balance = (await getERC20TokensBalance(address, network, [contract]))[0]
- .tokenBalance
+ balance = (await getERC20TokensBalance(address, network, [contract]))
+ .tokenBalances[0].tokenBalance
} else {
balance = await getNativeTokenBalance(address, network)
}
- // fixme: use token's decimals
- const latestBalance = Number(balance) / 1e18
+ const latestBalance = Number(balance) / Math.pow(10, decimals)
let currentBalance = latestBalance
let transferIndex = 0
@@ -386,9 +402,7 @@ export async function getNFTs(
url.searchParams.set('pageKey', page)
}
- const body = await _retry(async () =>
- _fetch(url, 'GET', 15),
- )
+ const body = await _retry(async () => _fetch(url, 'GET', 0))
return body
}
@@ -410,7 +424,7 @@ export async function getNFTMetadata(
url.searchParams.set('tokenId', tokenId)
const body = await _retry(async () =>
- _fetch(url, 'GET', 3600),
+ _fetch(url, 'GET', 0),
)
return body
@@ -421,26 +435,22 @@ export async function getLatestBlockNumber(
): Promise {
const url = `https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`
- const res = await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
+ const body = await _retry(async () =>
+ _fetch(new URL(url), 'POST', 0, {
jsonrpc: '2.0',
method: 'eth_blockNumber',
params: [],
id: 1,
}),
- })
-
- const data = await res.json()
+ )
- if (!data.result) {
+ if (!body.result) {
throw new Error(`Failed to fetch latest block number for ${network}`)
}
- return parseInt(data.result, 16)
+ const blockNumber = parseInt(body.result, 16)
+
+ return blockNumber
}
/**
@@ -491,7 +501,7 @@ export async function getOutgoingAssetTransfers(
pageKey?: string
}
}
- >(url, 'POST', 3600, {
+ >(url, 'POST', 0, {
jsonrpc: '2.0',
method: 'alchemy_getAssetTransfers',
params: [params, 'latest'],
@@ -576,7 +586,7 @@ export async function getIncomingAssetTransfers(
pageKey?: string
}
}
- >(url, 'POST', 3600, {
+ >(url, 'POST', 0, {
jsonrpc: '2.0',
method: 'alchemy_getAssetTransfers',
params: [params, 'latest'],
@@ -769,24 +779,24 @@ export async function getTransactionStatus(
txHash: string,
network: NetworkType,
): Promise<'pending' | 'success' | 'failed' | 'unknown'> {
- const url = `https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`
+ const url = new URL(
+ `https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
+ )
- const res = await fetch(url, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
+ const body = await _retry(async () =>
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
method: 'eth_getTransactionReceipt',
params: [txHash],
id: 1,
}),
- })
+ )
- const data = await res.json()
+ const transactionReceipt = body.result
- if (data?.result == null) return 'pending'
- if (data?.result?.status === '0x1') return 'success'
- if (data?.result?.status === '0x0') return 'failed'
+ if (transactionReceipt == null) return 'pending'
+ if (transactionReceipt?.status === '0x1') return 'success'
+ if (transactionReceipt?.status === '0x0') return 'failed'
return 'unknown'
}
@@ -817,7 +827,7 @@ export async function deprecated_getNFTSale(
url.searchParams.set('taker', 'BUYER')
const body = await _retry(async () =>
- _fetch(url, 'GET', 3600),
+ _fetch(url, 'GET', 0),
)
return body
@@ -838,7 +848,7 @@ export async function getNFTFloorPrice(contract: string, network: NetworkType) {
url.searchParams.set('contractAddress', contract)
const body = await _retry(async () =>
- _fetch(url, 'GET', 15),
+ _fetch(url, 'GET', 0),
)
return body
@@ -850,36 +860,45 @@ export async function getFeeRate(
from: string
to: string
value: string
+ data?: string
},
) {
const url = new URL(
`https://${alchemyNetworks[network]}.g.alchemy.com/v2/${serverEnv.ALCHEMY_API_KEY}`,
)
+ const gasParams: Record = {
+ from: params.from,
+ to: params.to,
+ value: params.value,
+ }
+
+ if (params['data']) gasParams['data'] = params['data']
+
let gasEstimate, maxPriorityFee, latestBlock, feeHistory, ethPriceData
try {
;[gasEstimate, maxPriorityFee, latestBlock, feeHistory, ethPriceData] =
await Promise.all([
- _fetch(url, 'POST', 3600, {
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
id: 1,
method: 'eth_estimateGas',
- params: [params],
+ params: [gasParams],
}),
- _fetch(url, 'POST', 3600, {
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
id: 2,
method: 'eth_maxPriorityFeePerGas',
params: [],
}),
- _fetch(url, 'POST', 3600, {
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
id: 3,
method: 'eth_getBlockByNumber',
params: ['latest', false],
}),
- _fetch(url, 'POST', 3600, {
+ _fetch(url, 'POST', 0, {
jsonrpc: '2.0',
id: 4,
method: 'eth_feeHistory',
@@ -912,22 +931,29 @@ export async function getFeeRate(
})
const ethPrice =
- typeof ethPriceData?.eur === 'number'
- ? ethPriceData.eur
- : parseFloat(ethPriceData?.eur) || 0
+ typeof ethPriceData?.usd === 'number'
+ ? ethPriceData.usd
+ : parseFloat(ethPriceData?.usd) || 0
const feeEth = parseFloat(formatEther(gasLimit * (baseFee + priorityFee)))
- const feeEur = ethPrice > 0 ? feeEth * ethPrice : 0
+ const feeEur = parseFloat((ethPrice > 0 ? feeEth * ethPrice : 0).toFixed(6))
+ const maxFeeEth = parseFloat(formatEther(gasLimit * maxFeePerGas))
+ const maxFeeEur = parseFloat(
+ (ethPrice > 0 ? maxFeeEth * ethPrice : 0).toFixed(6),
+ )
+
const confirmationTime = estimateConfirmationTime(priorityFee, feeHistoryData)
return {
- maxFeeEur: parseFloat(feeEur.toFixed(6)),
feeEth,
+ feeEur,
+ maxFeeEth,
+ maxFeeEur,
confirmationTime,
txParams: {
- gasLimit: gasLimitHex,
+ gasLimit: `0x${gasLimit.toString(16)}`,
maxFeePerGas: `0x${maxFeePerGas.toString(16)}`,
- maxPriorityFeePerGas: priorityFeeHex,
+ maxPriorityFeePerGas: `0x${priorityFee.toString(16)}`,
},
}
}
@@ -1000,8 +1026,11 @@ async function _fetch(
},
})
+ // throw new Error('limited', { cause: 429 })
+
if (!response.ok) {
console.error(response.statusText)
+ // todo: https://trpc.io/docs/v10/server/error-handling#throwing-errors for passing original error as `cause`
throw new Error('Failed to fetch.', { cause: response.status })
}
diff --git a/packages/wallet/src/data/services/alchemy/types.ts b/packages/wallet/src/data/services/alchemy/types.ts
index 907f3d5cd..4b498dde4 100644
--- a/packages/wallet/src/data/services/alchemy/types.ts
+++ b/packages/wallet/src/data/services/alchemy/types.ts
@@ -12,6 +12,7 @@ export type ERC20TokenBalanceResponseBody = {
contractAddress: string
tokenBalance: string
}>
+ pageKey?: string
}
}
@@ -361,6 +362,33 @@ export type AssetTransfersResponseBody = {
}
}
+export type BlockNumberResponseBody = {
+ jsonrpc: '2.0'
+ id: number
+ result: string | null
+}
+
+export type TransactionStatusResponseBody = {
+ jsonrpc: '2.0'
+ id: '1'
+ result: {
+ blockHash: string
+ blockNumber: string
+ contractAddress: string | null
+ cumulativeGasUsed: string
+ from: string
+ gasUsed: string
+ effectiveGasPrice: string
+ logs: unknown[]
+ logsBloom: string
+ status: string
+ to: string
+ transactionHash: string
+ transactionIndex: string
+ type: string
+ }
+}
+
export type ResponseBody =
| ERC20TokenBalanceResponseBody
| NativeTokenBalanceResponseBody
@@ -378,3 +406,5 @@ export type ResponseBody =
| TokenBalanceHistoryResponseBody
| AssetTransfersResponseBody
| TokensBalanceResponseBody
+ | BlockNumberResponseBody
+ | TransactionStatusResponseBody
diff --git a/packages/wallet/src/data/services/coingecko.ts b/packages/wallet/src/data/services/coingecko.ts
index a0ef75778..51721df5d 100644
--- a/packages/wallet/src/data/services/coingecko.ts
+++ b/packages/wallet/src/data/services/coingecko.ts
@@ -99,7 +99,7 @@ export const getMarket = async (): Promise => {
export const getNativeTokenPrice = async (network: NetworkType) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/simple/price?ids=${coingeckoNativeTokens[network]}&vs_currencies=eur&include_24hr_change=true`,
+ `https://api.coingecko.com/api/v3/simple/price?ids=${coingeckoNativeTokens[network]}&vs_currencies=usd&include_24hr_change=true`,
{
headers: {
'Content-Type': 'application/json',
@@ -127,7 +127,7 @@ export const getNativeTokenPriceChartData = async (
days: '1' | '7' | '30' | '90' | '365' | 'all' = '1',
) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/coins/${coingeckoNativeTokens[network]}/market_chart?vs_currency=eur&days=${days}`,
+ `https://api.coingecko.com/api/v3/coins/${coingeckoNativeTokens[network]}/market_chart?vs_currency=usd&days=${days}`,
{
next: {
revalidate: 3600,
@@ -152,7 +152,7 @@ export const getERC20TokenPriceChartData = async (
days: '1' | '7' | '30' | '90' | '365' | 'all' = '1',
) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/coins/${coingeckoNetworks[network]}/contract/${address}/market_chart?vs_currency=eur&days=${days}`,
+ `https://api.coingecko.com/api/v3/coins/${coingeckoNetworks[network]}/contract/${address}/market_chart?vs_currency=usd&days=${days}`,
{
next: {
revalidate: 3600,
@@ -231,7 +231,7 @@ export const getERC20TokensPrice = async (
coingeckoNetworks[network]
}?contract_addresses=${addresses.join(
',',
- )}&vs_currencies=eur&include_24hr_change=true`,
+ )}&vs_currencies=usd&include_24hr_change=true`,
{
headers: {
'Content-Type': 'application/json',
diff --git a/packages/wallet/src/data/services/coingecko/index.ts b/packages/wallet/src/data/services/coingecko/index.ts
index 1b7351307..cf6762c42 100644
--- a/packages/wallet/src/data/services/coingecko/index.ts
+++ b/packages/wallet/src/data/services/coingecko/index.ts
@@ -24,7 +24,7 @@ const coingeckoNativeTokens = {
export const getNativeTokenPrice = async (network: NetworkType) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/simple/price?ids=${coingeckoNativeTokens[network]}&vs_currencies=eur&include_24hr_change=true`,
+ `https://api.coingecko.com/api/v3/simple/price?ids=${coingeckoNativeTokens[network]}&vs_currencies=usd&include_24hr_change=true`,
{
headers: {
'Content-Type': 'application/json',
@@ -52,7 +52,7 @@ export const getNativeTokenPriceChartData = async (
days: '1' | '7' | '30' | '90' | '365' | 'all' = '1',
) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/coins/${coingeckoNativeTokens[network]}/market_chart?vs_currency=eur&days=${days}`,
+ `https://api.coingecko.com/api/v3/coins/${coingeckoNativeTokens[network]}/market_chart?vs_currency=usd&days=${days}`,
{
next: {
revalidate: 3600,
@@ -77,7 +77,7 @@ export const getERC20TokenPriceChartData = async (
days: '1' | '7' | '30' | '90' | '365' | 'all' = '1',
) => {
const response = await fetch(
- `https://api.coingecko.com/api/v3/coins/${coingeckoNetworks[network]}/contract/${address}/market_chart?vs_currency=eur&days=${days}`,
+ `https://api.coingecko.com/api/v3/coins/${coingeckoNetworks[network]}/contract/${address}/market_chart?vs_currency=usd&days=${days}`,
{
next: {
revalidate: 3600,
@@ -156,7 +156,7 @@ export const getERC20TokensPrice = async (
coingeckoNetworks[network]
}?contract_addresses=${addresses.join(
',',
- )}&vs_currencies=eur&include_24hr_change=true`,
+ )}&vs_currencies=usd&include_24hr_change=true`,
{
headers: {
'Content-Type': 'application/json',
diff --git a/packages/wallet/src/data/services/cryptocompare/index.ts b/packages/wallet/src/data/services/cryptocompare/index.ts
index a4e242a75..23517cd6d 100644
--- a/packages/wallet/src/data/services/cryptocompare/index.ts
+++ b/packages/wallet/src/data/services/cryptocompare/index.ts
@@ -24,7 +24,7 @@ import type {
* @see https://min-api.cryptocompare.com/documentation?key=Historical&cat=dataHistoday
* @see https://min-api.cryptocompare.com/documentation?key=Historical&cat=dataHistohour
*
- * note: Tries to convert to EUR if CCCAGG market does not exist for coin pair.
+ * note: Tries to convert to USD if CCCAGG market does not exist for coin pair.
*/
export async function legacy_fetchTokenPriceHistory(
symbol: string,
@@ -33,9 +33,9 @@ export async function legacy_fetchTokenPriceHistory(
if (days === 'all') {
const url = new URL('https://min-api.cryptocompare.com/data/v2/histoday')
url.searchParams.set('fsym', symbol)
- url.searchParams.set('tsym', 'EUR')
+ url.searchParams.set('tsym', 'USD')
url.searchParams.set('allData', 'true')
- url.searchParams.set('tryConversion', 'true')
+ url.searchParams.set('tryConversion', 'false')
url.searchParams.set('api_key', serverEnv.CRYPTOCOMPARE_API_KEY)
const body = await _fetch(url, 3600)
@@ -53,10 +53,10 @@ export async function legacy_fetchTokenPriceHistory(
do {
const url = new URL('https://min-api.cryptocompare.com/data/v2/histohour')
url.searchParams.set('fsym', symbol)
- url.searchParams.set('tsym', 'EUR')
+ url.searchParams.set('tsym', 'USD')
url.searchParams.set('toTs', to.toString())
url.searchParams.set('limit', '2000')
- url.searchParams.set('tryConversion', 'true')
+ url.searchParams.set('tryConversion', 'false')
url.searchParams.set('api_key', serverEnv.CRYPTOCOMPARE_API_KEY)
const body = await _fetch(url, 3600)
@@ -72,7 +72,7 @@ export async function legacy_fetchTokenPriceHistory(
return data
}
-// todo?: use for current price as well (lacks EUR)
+// todo?: use for current price as well (lacks USD)
// todo?: use https://developers.cryptocompare.com/documentation/data-api/asset_v1_summary_list if full metadata is not needed
// fixme?: use CCData id instead of symbol by extending token list
// todo?: use contract address lookup https://developers.cryptocompare.com/documentation/data-api/onchain_v2_data_by_address instead
@@ -83,7 +83,7 @@ export async function fetchTokenMetadata(symbol: string) {
const url = new URL('https://data-api.cryptocompare.com/asset/v1/metadata')
url.searchParams.set('asset', symbol)
url.searchParams.set('asset_lookup_priority', 'SYMBOL')
- url.searchParams.set('quote_asset', 'EUR')
+ url.searchParams.set('quote_asset', 'USD')
url.searchParams.set('api_key', serverEnv.CRYPTOCOMPARE_API_KEY)
const body = await _fetch(url, 3600)
@@ -92,7 +92,7 @@ export async function fetchTokenMetadata(symbol: string) {
return data
}
-// todo?: use https://min-api.cryptocompare.com/data/coin/generalinfo?fsyms=OP,ARB,SNT,USDT&tsym=EUR instead (no docs)
+// todo?: use https://min-api.cryptocompare.com/data/coin/generalinfo?fsyms=OP,ARB,SNT,USDT&tsym=USD instead (no docs)
/**
* @see https://developers.cryptocompare.com/documentation/data-api/asset_v1_data_by_symbol
*/
@@ -136,7 +136,7 @@ export async function legacy_research_fetchTokenMetadata(symbol: string) {
export async function legacy_fetchTokensPrice(symbols: string[]) {
const url = new URL('https://min-api.cryptocompare.com/data/pricemultifull')
url.searchParams.set('fsyms', symbols.join(','))
- url.searchParams.set('tsyms', 'EUR')
+ url.searchParams.set('tsyms', 'USD')
url.searchParams.set('relaxedValidation', 'true')
url.searchParams.set('api_key', serverEnv.CRYPTOCOMPARE_API_KEY)
@@ -152,7 +152,7 @@ export async function legacy_fetchTokensPrice(symbols: string[]) {
) {
console.warn('Removed failing symbols, retrying without them')
- const errorMatch = error.message.match(/\((\w+)-EUR\)/)
+ const errorMatch = error.message.match(/\((\w+)-USD\)/)
if (errorMatch && errorMatch[1]) {
const failedSymbol = errorMatch[1]
const filteredSymbols = symbols.filter(s => s !== failedSymbol)
@@ -176,16 +176,16 @@ export async function fetchTokensPriceForDate(
symbols: string[],
timestamp: number,
) {
- const data: Record = {}
+ const data: Record = {}
for (const symbol of symbols) {
try {
const url = new URL('https://min-api.cryptocompare.com/data/v2/histoday')
url.searchParams.set('fsym', symbol)
- url.searchParams.set('tsym', 'EUR')
+ url.searchParams.set('tsym', 'USD')
url.searchParams.set('toTs', timestamp.toString())
url.searchParams.set('limit', '1')
- url.searchParams.set('tryConversion', 'true') // tries to convert to EUR if specific market does not exist i.e. ETH <-> EUR
+ url.searchParams.set('tryConversion', 'false')
url.searchParams.set('api_key', serverEnv.CRYPTOCOMPARE_API_KEY)
const body = await _fetch(url, 15)
@@ -193,7 +193,7 @@ export async function fetchTokensPriceForDate(
if (prices.length > 0) {
data[symbol] = {
- EUR: {
+ USD: {
PRICE: prices[0].close,
},
}
diff --git a/packages/wallet/src/data/services/cryptocompare/types.ts b/packages/wallet/src/data/services/cryptocompare/types.ts
index d2eeff532..e4d9b0ed8 100644
--- a/packages/wallet/src/data/services/cryptocompare/types.ts
+++ b/packages/wallet/src/data/services/cryptocompare/types.ts
@@ -669,7 +669,7 @@ export type legacy_research_TokenMetadataResponseBody = {
export type legacy_TokensPriceResponseBody = {
RAW: {
[symbol: string]: {
- EUR: {
+ USD: {
TYPE: string
MARKET: string
FROMSYMBOL: string
@@ -723,7 +723,7 @@ export type legacy_TokensPriceResponseBody = {
}
DISPLAY: {
[symbol: string]: {
- EUR: {
+ USD: {
FROMSYMBOL: string
TOSYMBOL: string
MARKET: string
diff --git a/packages/wallet/src/utils/index.ts b/packages/wallet/src/utils/index.ts
new file mode 100644
index 000000000..9b6e41de3
--- /dev/null
+++ b/packages/wallet/src/utils/index.ts
@@ -0,0 +1,2 @@
+export { toChecksumAddress } from './to-checksum-address'
+export { getTransactionHash } from './transaction-hash'
diff --git a/packages/wallet/src/utils/to-checksum-address.ts b/packages/wallet/src/utils/to-checksum-address.ts
new file mode 100644
index 000000000..b10c1ede9
--- /dev/null
+++ b/packages/wallet/src/utils/to-checksum-address.ts
@@ -0,0 +1,26 @@
+import { keccak256 } from 'ethereum-cryptography/keccak'
+import { bytesToHex, utf8ToBytes } from 'ethereum-cryptography/utils'
+
+/**
+ * Converts an Ethereum address to its checksummed version according to EIP-55.
+ *
+ * @param address - The Ethereum address to checksum (with or without 0x prefix)
+ * @returns The checksummed address with 0x prefix
+ *
+ * @see https://eips.ethereum.org/EIPS/eip-55
+ */
+export function toChecksumAddress(address: string): string {
+ const cleanAddress = address.toLowerCase().replace('0x', '')
+ const hash = bytesToHex(keccak256(utf8ToBytes(cleanAddress)))
+ let checksumAddress = '0x'
+
+ for (let i = 0; i < cleanAddress.length; i++) {
+ if (parseInt(hash[i], 16) >= 8) {
+ checksumAddress += cleanAddress[i].toUpperCase()
+ } else {
+ checksumAddress += cleanAddress[i]
+ }
+ }
+
+ return checksumAddress
+}
diff --git a/packages/wallet/src/utils/transaction-hash.ts b/packages/wallet/src/utils/transaction-hash.ts
new file mode 100644
index 000000000..d7734924c
--- /dev/null
+++ b/packages/wallet/src/utils/transaction-hash.ts
@@ -0,0 +1,15 @@
+export const getTransactionHash = (hash: unknown): string => {
+ if (typeof hash === 'string') {
+ return hash
+ }
+ if (typeof hash === 'object' && hash !== null) {
+ if ('result' in hash && typeof hash.result === 'string') {
+ return hash.result
+ }
+ if ('txid' in hash && typeof hash.txid === 'string') {
+ return hash.txid
+ }
+ }
+ console.warn('[getTransactionHash] Unrecognized hash object format:', hash)
+ return String(hash)
+}
diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json
index d433b64a7..e17eee819 100644
--- a/packages/wallet/tsconfig.json
+++ b/packages/wallet/tsconfig.json
@@ -9,11 +9,22 @@
],
"compilerOptions": {
"rootDir": ".",
- // "composite": true,
+ "composite": true,
"jsx": "preserve",
"outDir": "./dist",
"allowJs": true,
- "plugins": [{ "name": "next" }]
+ "plugins": [{ "name": "next" }],
+ "noEmit": false
},
- "references": []
+ "references": [
+ {
+ "path": "../components"
+ },
+ {
+ "path": "../icons"
+ },
+ {
+ "path": "../colors"
+ }
+ ]
}
diff --git a/packages/wallet/vercel.json b/packages/wallet/vercel.json
index 4a3c21232..e2d4376e5 100644
--- a/packages/wallet/vercel.json
+++ b/packages/wallet/vercel.json
@@ -2,5 +2,5 @@
"$schema": "https://openapi.vercel.sh/vercel.json",
"ignoreCommand": "git diff --quiet HEAD^ HEAD ../../{patches,package.json,turbo.json} ../../packages/{colors,icons} ./",
"installCommand": "pnpm install --dir ../../ --frozen-lockfile",
- "buildCommand": "turbo run build --cwd ../../ --filter=components... && pnpm storybook:build"
+ "buildCommand": "turbo run build --cwd ../../ --filter=@status-im/components... && pnpm storybook:build"
}
diff --git a/packages/wallet/vite.config.ts b/packages/wallet/vite.config.ts
index f6c0756eb..40e383daa 100644
--- a/packages/wallet/vite.config.ts
+++ b/packages/wallet/vite.config.ts
@@ -21,6 +21,7 @@ export default defineConfig(({ mode }) => {
'data/index': './src/data/index.ts',
'hooks/index': './src/hooks/index.ts',
'constants/index': './src/constants/index.ts',
+ 'utils/index': './src/utils/index.ts',
},
formats: ['es', 'cjs'],
fileName: format => {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 86aca7186..30426cff0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -63,6 +63,9 @@ importers:
react:
specifier: ^18.3.1
version: 18.3.1
+ react-devtools:
+ specifier: ^6.1.5
+ version: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
@@ -95,13 +98,13 @@ importers:
version: 10.45.2(@trpc/server@10.45.2)
'@trpc/next':
specifier: 10.45.2
- version: 10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@trpc/server':
specifier: 10.45.2
version: 10.45.2
next:
specifier: 15.3.0
- version: 15.3.0(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)
+ version: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)
react:
specifier: ^19.0.0
version: 19.1.0
@@ -912,6 +915,9 @@ importers:
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
+ ethers:
+ specifier: ^6.15.0
+ version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
long:
specifier: ^5.3.1
version: 5.3.2
@@ -982,6 +988,9 @@ importers:
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.4.1(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.5.1))
+ '@wxt-dev/auto-icons':
+ specifier: ^1.0.2
+ version: 1.0.2(wxt@0.19.29(@types/node@22.7.5)(bufferutil@4.0.9)(less@4.2.0)(lightningcss@1.27.0)(rollup@4.40.2)(sass@1.80.4)(tsx@4.19.4)(utf-8-validate@5.0.10)(yaml@2.5.1))
'@wxt-dev/module-react':
specifier: ^1.1.2
version: 1.1.3(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.5.1))(wxt@0.19.29(@types/node@22.7.5)(bufferutil@4.0.9)(less@4.2.0)(lightningcss@1.27.0)(rollup@4.40.2)(sass@1.80.4)(tsx@4.19.4)(utf-8-validate@5.0.10)(yaml@2.5.1))
@@ -1449,7 +1458,7 @@ importers:
version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)
next:
specifier: 15.1.6
- version: 15.1.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4)
+ version: 15.1.6(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4)
qrcode.react:
specifier: ^3.1.0
version: 3.2.0(react@18.3.1)
@@ -2266,6 +2275,10 @@ packages:
'@effect-ts/system@0.57.5':
resolution: {integrity: sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g==}
+ '@electron/get@2.0.3':
+ resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==}
+ engines: {node: '>=12'}
+
'@emnapi/core@0.45.0':
resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==}
@@ -7044,6 +7057,10 @@ packages:
'@scure/bip39@1.6.0':
resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==}
+ '@sindresorhus/is@4.6.0':
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+
'@sindresorhus/is@5.6.0':
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
engines: {node: '>=14.16'}
@@ -7551,6 +7568,10 @@ packages:
'@swc/types@0.1.12':
resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==}
+ '@szmarczak/http-timer@4.0.6':
+ resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+ engines: {node: '>=10'}
+
'@szmarczak/http-timer@5.0.1':
resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
engines: {node: '>=14.16'}
@@ -7865,6 +7886,9 @@ packages:
'@types/body-parser@1.19.2':
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
+ '@types/cacheable-request@6.0.3':
+ resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+
'@types/chrome@0.0.258':
resolution: {integrity: sha512-vicJi6cg2zaFuLmLY7laG6PHBknjKFusPYlaKQ9Zlycskofy71rStlGvW07MUuqUIVorZf8k5KH+zeTTGcH2dQ==}
@@ -8033,6 +8057,9 @@ packages:
'@types/jsonfile@6.1.1':
resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==}
+ '@types/keyv@3.1.4':
+ resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+
'@types/lodash@4.14.191':
resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==}
@@ -8072,6 +8099,9 @@ packages:
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+ '@types/node@16.18.126':
+ resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==}
+
'@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
@@ -8126,6 +8156,9 @@ packages:
'@types/resolve@1.20.4':
resolution: {integrity: sha512-BKGK0T1VgB1zD+PwQR4RRf0ais3NyvH1qjLUrHI5SEiccYaJrhLstLuoXFWJ+2Op9whGizSPUMGPJY/Qtb/A2w==}
+ '@types/responselike@1.0.3':
+ resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+
'@types/retry@0.12.2':
resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==}
@@ -8777,6 +8810,11 @@ packages:
resolution: {integrity: sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==}
engines: {node: '>=16.0.0'}
+ '@wxt-dev/auto-icons@1.0.2':
+ resolution: {integrity: sha512-Wp1pZnRysvDvxkkkys6ZPXL9O2Q9RDjooAZeV19vBg4NXPyE21qO2fu3QmIcug3fPzKzpcFa6dm1Y1dX8qhfEg==}
+ peerDependencies:
+ wxt: '>=0.19.0'
+
'@wxt-dev/module-react@1.1.3':
resolution: {integrity: sha512-ede2FLS3sdJwtyI61jvY1UiF194ouv3wxm+fCYjfP4FfvoXQbif8UuusYBC0KSa/L2AL9Cfa/lEvsdNYrKFUaA==}
peerDependencies:
@@ -8876,6 +8914,9 @@ packages:
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ ansi-align@2.0.0:
+ resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==}
+
ansi-align@3.0.1:
resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
@@ -8895,6 +8936,10 @@ packages:
resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
engines: {node: '>=18'}
+ ansi-regex@3.0.1:
+ resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
+ engines: {node: '>=4'}
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -9287,9 +9332,17 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ boolean@3.2.0:
+ resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
bowser@2.11.0:
resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
+ boxen@1.3.0:
+ resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==}
+ engines: {node: '>=4'}
+
boxen@8.0.1:
resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
engines: {node: '>=18'}
@@ -9442,6 +9495,10 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
+ cacheable-lookup@5.0.4:
+ resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+ engines: {node: '>=10.6.0'}
+
cacheable-lookup@7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
@@ -9450,6 +9507,10 @@ packages:
resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
engines: {node: '>=14.16'}
+ cacheable-request@7.0.4:
+ resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+ engines: {node: '>=8'}
+
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
@@ -9473,6 +9534,10 @@ packages:
resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
engines: {node: '>=8'}
+ camelcase@4.1.0:
+ resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==}
+ engines: {node: '>=4'}
+
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
@@ -9501,6 +9566,10 @@ packages:
capital-case@1.0.4:
resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+ capture-stack-trace@1.0.2:
+ resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==}
+ engines: {node: '>=0.10.0'}
+
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -9613,6 +9682,9 @@ packages:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
engines: {node: '>=6.0'}
+ ci-info@1.6.0:
+ resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==}
+
ci-info@3.8.0:
resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
engines: {node: '>=8'}
@@ -9641,6 +9713,10 @@ packages:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
+ cli-boxes@1.0.0:
+ resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==}
+ engines: {node: '>=0.10.0'}
+
cli-boxes@3.0.0:
resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
engines: {node: '>=10'}
@@ -9708,6 +9784,9 @@ packages:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
+ clone-response@1.0.3:
+ resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+
clone@1.0.4:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
@@ -9826,6 +9905,10 @@ packages:
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ configstore@3.1.5:
+ resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==}
+ engines: {node: '>=4'}
+
configstore@7.0.0:
resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==}
engines: {node: '>=18'}
@@ -9925,6 +10008,10 @@ packages:
create-ecdh@4.0.4:
resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+ create-error-class@3.0.2:
+ resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==}
+ engines: {node: '>=0.10.0'}
+
create-hash@1.2.0:
resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
@@ -9958,6 +10045,10 @@ packages:
resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
engines: {node: '>= 0.10'}
+ crypto-random-string@1.0.0:
+ resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==}
+ engines: {node: '>=4'}
+
crypto-random-string@4.0.0:
resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
engines: {node: '>=12'}
@@ -10252,6 +10343,10 @@ packages:
resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
engines: {node: '>=18'}
+ default-gateway@6.0.3:
+ resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
+ engines: {node: '>= 10'}
+
default-gateway@7.2.2:
resolution: {integrity: sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==}
engines: {node: '>= 16'}
@@ -10350,6 +10445,9 @@ packages:
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+ detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
@@ -10435,6 +10533,10 @@ packages:
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dot-prop@4.2.1:
+ resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==}
+ engines: {node: '>=4'}
+
dot-prop@9.0.0:
resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==}
engines: {node: '>=18'}
@@ -10569,6 +10671,9 @@ packages:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
+ duplexer3@0.1.5:
+ resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
+
duplexify@4.1.3:
resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
@@ -10591,6 +10696,11 @@ packages:
electron-to-chromium@1.5.24:
resolution: {integrity: sha512-0x0wLCmpdKFCi9ulhvYZebgcPmHTkFVUfU2wzDykadkslKwT4oAmDTHEKLnlrDsMGZe4B+ksn8quZfZjYsBetA==}
+ electron@23.3.13:
+ resolution: {integrity: sha512-BaXtHEb+KYKLouUXlUVDa/lj9pj4F5kiE0kwFdJV84Y2EU7euIDgPthfKtchhr5MVHmjtavRMIV/zAwEiSQ9rQ==}
+ engines: {node: '>= 12.20.55'}
+ hasBin: true
+
elliptic@6.6.1:
resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
@@ -11122,6 +11232,10 @@ packages:
evp_bytestokey@1.0.3:
resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+ execa@0.7.0:
+ resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==}
+ engines: {node: '>=4'}
+
execa@0.8.0:
resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==}
engines: {node: '>=4'}
@@ -11623,10 +11737,18 @@ packages:
resolution: {integrity: sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==}
engines: {node: '>=16 || 14 >=14.17'}
+ global-agent@3.0.0:
+ resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
+ engines: {node: '>=10.0'}
+
global-directory@4.0.1:
resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
engines: {node: '>=18'}
+ global-dirs@0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+
global@4.4.0:
resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
@@ -11689,6 +11811,10 @@ packages:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
+ got@11.8.6:
+ resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+ engines: {node: '>=10.19.0'}
+
got@12.6.1:
resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
engines: {node: '>=14.16'}
@@ -11697,6 +11823,10 @@ packages:
resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==}
engines: {node: '>=16'}
+ got@6.7.1:
+ resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==}
+ engines: {node: '>=4'}
+
graceful-fs@4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
@@ -12030,6 +12160,10 @@ packages:
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
engines: {node: '>=8.0.0'}
+ http2-wrapper@1.0.3:
+ resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+ engines: {node: '>=10.19.0'}
+
http2-wrapper@2.2.1:
resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
engines: {node: '>=10.19.0'}
@@ -12118,6 +12252,10 @@ packages:
resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==}
engines: {node: '>=12.2'}
+ import-lazy@2.1.0:
+ resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
+ engines: {node: '>=4'}
+
import-meta-resolve@1.1.1:
resolution: {integrity: sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==}
@@ -12186,6 +12324,10 @@ packages:
interface-store@5.1.4:
resolution: {integrity: sha512-SI2co5IAxAybBc9egRM2bXvHOa1RPh5SQQkO6di6t/aX92RbtzP4t8raB0l3GTzQmJADaBbzz8Tfa1QLgfMdGQ==}
+ internal-ip@6.2.0:
+ resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==}
+ engines: {node: '>=10'}
+
internal-slot@1.0.5:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
engines: {node: '>= 0.4'}
@@ -12211,6 +12353,10 @@ packages:
resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==}
engines: {node: '>= 12'}
+ ip-regex@4.3.0:
+ resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==}
+ engines: {node: '>=8'}
+
ip-regex@5.0.0:
resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -12293,6 +12439,10 @@ packages:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
+ is-ci@1.2.1:
+ resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==}
+ hasBin: true
+
is-ci@3.0.1:
resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
hasBin: true
@@ -12342,6 +12492,10 @@ packages:
is-finalizationregistry@1.0.2:
resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+ is-fullwidth-code-point@2.0.0:
+ resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
+ engines: {node: '>=4'}
+
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -12378,6 +12532,10 @@ packages:
engines: {node: '>=14.16'}
hasBin: true
+ is-installed-globally@0.1.0:
+ resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==}
+ engines: {node: '>=4'}
+
is-installed-globally@1.0.0:
resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==}
engines: {node: '>=18'}
@@ -12390,6 +12548,10 @@ packages:
resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
engines: {node: '>=12'}
+ is-ip@3.1.0:
+ resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==}
+ engines: {node: '>=8'}
+
is-json@2.0.1:
resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==}
@@ -12422,6 +12584,10 @@ packages:
resolution: {integrity: sha512-P3fxi10Aji2FZmHTrMPSNFbNC6nnp4U5juPAIjXPHkUNubi4+qK7vvdsaNpAUwXslhYm9oyjEYTxs1xd/+Ph0w==}
engines: {node: '>=16'}
+ is-npm@1.0.0:
+ resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==}
+ engines: {node: '>=0.10.0'}
+
is-npm@6.0.0:
resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -12434,10 +12600,18 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-obj@1.0.1:
+ resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
+ engines: {node: '>=0.10.0'}
+
is-obj@3.0.0:
resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
engines: {node: '>=12'}
+ is-path-inside@1.0.1:
+ resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==}
+ engines: {node: '>=0.10.0'}
+
is-path-inside@4.0.0:
resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
engines: {node: '>=12'}
@@ -12473,6 +12647,10 @@ packages:
resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
engines: {node: '>=0.10.0'}
+ is-redirect@1.0.0:
+ resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==}
+ engines: {node: '>=0.10.0'}
+
is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
@@ -12488,6 +12666,10 @@ packages:
resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
engines: {node: '>=0.10.0'}
+ is-retry-allowed@1.2.0:
+ resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
+ engines: {node: '>=0.10.0'}
+
is-set@2.0.2:
resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
@@ -12803,6 +12985,9 @@ packages:
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+
json-to-pretty-yaml@1.2.2:
resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==}
engines: {node: '>= 0.2.0'}
@@ -12886,6 +13071,10 @@ packages:
resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
engines: {node: '>=0.10'}
+ latest-version@3.1.0:
+ resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==}
+ engines: {node: '>=4'}
+
latest-version@9.0.0:
resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==}
engines: {node: '>=18'}
@@ -13234,6 +13423,14 @@ packages:
lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ lowercase-keys@1.0.1:
+ resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
+ engines: {node: '>=0.10.0'}
+
+ lowercase-keys@2.0.0:
+ resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+ engines: {node: '>=8'}
+
lowercase-keys@3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -13272,6 +13469,10 @@ packages:
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+ make-dir@1.3.0:
+ resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
+ engines: {node: '>=4'}
+
make-dir@2.1.0:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
@@ -13328,6 +13529,10 @@ packages:
resolution: {integrity: sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q==}
deprecated: This was arguably a breaking change. Not in API, but more results can be returned. Upgrade to the next major when you are ready for that
+ matcher@3.0.0:
+ resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
+ engines: {node: '>=10'}
+
math-expression-evaluator@1.4.0:
resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==}
@@ -13792,6 +13997,10 @@ packages:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
+ mimic-response@1.0.1:
+ resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+ engines: {node: '>=4'}
+
mimic-response@3.1.0:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
@@ -14184,6 +14393,10 @@ packages:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
+ normalize-url@6.1.0:
+ resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+ engines: {node: '>=10'}
+
normalize-url@8.0.1:
resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==}
engines: {node: '>=14.16'}
@@ -14467,6 +14680,10 @@ packages:
typescript:
optional: true
+ p-cancelable@2.1.1:
+ resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+ engines: {node: '>=8'}
+
p-cancelable@3.0.0:
resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
engines: {node: '>=12.20'}
@@ -14475,6 +14692,10 @@ packages:
resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==}
engines: {node: '>=12'}
+ p-event@4.2.0:
+ resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==}
+ engines: {node: '>=8'}
+
p-event@6.0.0:
resolution: {integrity: sha512-Xbfxd0CfZmHLGKXH32k1JKjQYX6Rkv0UtQdaFJ8OyNcf+c0oWCeXHc1C4CX/IESZLmcvfPa5aFIO/vCr5gqtag==}
engines: {node: '>=16.17'}
@@ -14531,6 +14752,10 @@ packages:
resolution: {integrity: sha512-fJLEQ2KqYBJRuaA/8cKMnqhulqNM+bpcjYtXNex2t3mOXKRYPitAJt9NacSf8XAFzcYahSAbKpobiWDSqHSh2g==}
engines: {node: '>=16.17'}
+ p-timeout@3.2.0:
+ resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
+ engines: {node: '>=8'}
+
p-timeout@5.1.0:
resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==}
engines: {node: '>=12'}
@@ -14550,6 +14775,10 @@ packages:
resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==}
engines: {node: '>=18'}
+ package-json@4.0.1:
+ resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==}
+ engines: {node: '>=4'}
+
package-json@8.1.1:
resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
engines: {node: '>=14.16'}
@@ -14641,6 +14870,9 @@ packages:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
+ path-is-inside@1.0.2:
+ resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
+
path-key@2.0.1:
resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
engines: {node: '>=4'}
@@ -14941,6 +15173,10 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ prepend-http@1.0.4:
+ resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==}
+ engines: {node: '>=0.10.0'}
+
prettier-linter-helpers@1.0.0:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'}
@@ -15049,6 +15285,10 @@ packages:
resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==}
engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+
promise-toolbox@0.21.0:
resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==}
engines: {node: '>=6'}
@@ -15243,6 +15483,13 @@ packages:
date-fns: ^2.28.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-devtools-core@6.1.5:
+ resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==}
+
+ react-devtools@6.1.5:
+ resolution: {integrity: sha512-yp7kADDET5neqMMBtwRIPqJ1tcVXWP88RsSCdOrwYsxGGL/pS5Za4jOCYekiZb0m7nzTbSH158ugGyNnBaDJvQ==}
+ hasBin: true
+
react-docgen-typescript@2.2.2:
resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==}
peerDependencies:
@@ -15529,10 +15776,17 @@ packages:
resolution: {integrity: sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==}
engines: {node: '>=6'}
+ registry-auth-token@3.4.0:
+ resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==}
+
registry-auth-token@5.0.2:
resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
engines: {node: '>=14'}
+ registry-url@3.1.0:
+ resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==}
+ engines: {node: '>=0.10.0'}
+
registry-url@6.0.1:
resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
engines: {node: '>=12'}
@@ -15942,6 +16196,9 @@ packages:
resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
hasBin: true
+ responselike@2.0.1:
+ resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+
responselike@3.0.0:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
@@ -16004,6 +16261,10 @@ packages:
ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+ roarr@2.15.4:
+ resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
+ engines: {node: '>=8.0'}
+
robust-predicates@3.0.2:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
@@ -16099,6 +16360,13 @@ packages:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
+ semver-compare@1.0.0:
+ resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
+
+ semver-diff@2.1.0:
+ resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==}
+ engines: {node: '>=0.10.0'}
+
semver@5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
hasBin: true
@@ -16133,6 +16401,10 @@ packages:
sentence-case@3.0.4:
resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+ serialize-error@7.0.1:
+ resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
+ engines: {node: '>=10'}
+
serialize-error@8.1.0:
resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==}
engines: {node: '>=10'}
@@ -16432,6 +16704,10 @@ packages:
string-replace-to-array@2.1.1:
resolution: {integrity: sha512-i31csTEoIrcB8pusAF72Z0WsF04sbdiH4s0egpcmFj30SgHYdYd1swmZ7Zb1qFryJ5DbZR6z4rSjOzoUcrWUWw==}
+ string-width@2.1.1:
+ resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
+ engines: {node: '>=4'}
+
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -16488,6 +16764,10 @@ packages:
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+ strip-ansi@4.0.0:
+ resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
+ engines: {node: '>=4'}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -16594,6 +16874,10 @@ packages:
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
+ sumchecker@3.0.1:
+ resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==}
+ engines: {node: '>= 8.0'}
+
superjson@2.2.2:
resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'}
@@ -16706,6 +16990,10 @@ packages:
resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==}
engines: {node: '>=14.16'}
+ term-size@1.2.0:
+ resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==}
+ engines: {node: '>=4'}
+
term-size@2.2.1:
resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
engines: {node: '>=8'}
@@ -16732,6 +17020,10 @@ packages:
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ timed-out@4.0.1:
+ resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
+ engines: {node: '>=0.10.0'}
+
timeout-signal@2.0.0:
resolution: {integrity: sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==}
engines: {node: '>=16'}
@@ -17167,6 +17459,10 @@ packages:
unimport@3.14.6:
resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==}
+ unique-string@1.0.0:
+ resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==}
+ engines: {node: '>=4'}
+
unique-string@3.0.0:
resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
engines: {node: '>=12'}
@@ -17345,6 +17641,10 @@ packages:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
+ unzip-response@2.0.1:
+ resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==}
+ engines: {node: '>=4'}
+
update-browserslist-db@1.1.0:
resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
hasBin: true
@@ -17357,6 +17657,10 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ update-notifier@2.5.0:
+ resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==}
+ engines: {node: '>=4'}
+
update-notifier@7.3.1:
resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==}
engines: {node: '>=18'}
@@ -17370,6 +17674,10 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ url-parse-lax@1.0.0:
+ resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==}
+ engines: {node: '>=0.10.0'}
+
url@0.11.4:
resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
engines: {node: '>= 0.4'}
@@ -17802,6 +18110,10 @@ packages:
engines: {node: '>=8'}
hasBin: true
+ widest-line@2.0.1:
+ resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==}
+ engines: {node: '>=4'}
+
widest-line@5.0.0:
resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
engines: {node: '>=18'}
@@ -17832,6 +18144,9 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ write-file-atomic@2.4.3:
+ resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==}
+
ws@7.5.10:
resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
engines: {node: '>=8.3.0'}
@@ -17908,6 +18223,10 @@ packages:
resolution: {integrity: sha512-n6DRR34OAFczJfZOwJeY5dn+j+w2BTquW2nAX32vk3FMLWUhzpv5svMvSUTyNiFq3P0o3U7YxfxHdmKJnXZHBA==}
hasBin: true
+ xdg-basedir@3.0.0:
+ resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==}
+ engines: {node: '>=4'}
+
xdg-basedir@5.1.0:
resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
engines: {node: '>=12'}
@@ -19207,6 +19526,20 @@ snapshots:
'@effect-ts/system@0.57.5': {}
+ '@electron/get@2.0.3':
+ dependencies:
+ debug: 4.4.0
+ env-paths: 2.2.1
+ fs-extra: 8.1.0
+ got: 11.8.6
+ progress: 2.0.3
+ semver: 6.3.1
+ sumchecker: 3.0.1
+ optionalDependencies:
+ global-agent: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
'@emnapi/core@0.45.0':
dependencies:
tslib: 2.8.1
@@ -26157,6 +26490,8 @@ snapshots:
'@noble/hashes': 1.8.0
'@scure/base': 1.2.5
+ '@sindresorhus/is@4.6.0': {}
+
'@sindresorhus/is@5.6.0': {}
'@socket.io/component-emitter@3.1.2': {}
@@ -26203,7 +26538,7 @@ snapshots:
'@storybook/global': 5.0.0
'@storybook/react-dom-shim': 8.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3))
'@types/react': 19.1.0
- fs-extra: 11.1.1
+ fs-extra: 11.3.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
rehype-external-links: 3.0.0
@@ -26306,7 +26641,7 @@ snapshots:
es-module-lexer: 1.5.4
express: 4.20.0
find-cache-dir: 3.3.2
- fs-extra: 11.1.1
+ fs-extra: 11.3.0
magic-string: 0.30.11
storybook: 8.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)
ts-dedent: 2.2.0
@@ -26722,6 +27057,10 @@ snapshots:
dependencies:
'@swc/counter': 0.1.3
+ '@szmarczak/http-timer@4.0.6':
+ dependencies:
+ defer-to-connect: 2.0.1
+
'@szmarczak/http-timer@5.0.1':
dependencies:
defer-to-connect: 2.0.1
@@ -26999,13 +27338,13 @@ snapshots:
'@trpc/server': 10.45.2
typescript: 5.8.3
- '@trpc/next@10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@trpc/next@10.45.2(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@10.45.2)(next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@tanstack/react-query': 5.75.5(react@19.1.0)
'@trpc/client': 10.45.2(@trpc/server@10.45.2)
'@trpc/react-query': 11.1.0(@tanstack/react-query@5.75.5(react@19.1.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)
'@trpc/server': 10.45.2
- next: 15.3.0(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)
+ next: 15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
@@ -27092,6 +27431,13 @@ snapshots:
'@types/connect': 3.4.35
'@types/node': 20.11.5
+ '@types/cacheable-request@6.0.3':
+ dependencies:
+ '@types/http-cache-semantics': 4.0.4
+ '@types/keyv': 3.1.4
+ '@types/node': 20.11.5
+ '@types/responselike': 1.0.3
+
'@types/chrome@0.0.258':
dependencies:
'@types/filesystem': 0.0.36
@@ -27260,6 +27606,10 @@ snapshots:
dependencies:
'@types/node': 20.11.5
+ '@types/keyv@3.1.4':
+ dependencies:
+ '@types/node': 20.11.5
+
'@types/lodash@4.14.191': {}
'@types/mdast@3.0.15':
@@ -27292,6 +27642,8 @@ snapshots:
'@types/node@12.20.55': {}
+ '@types/node@16.18.126': {}
+
'@types/node@17.0.45': {}
'@types/node@18.19.99':
@@ -27344,6 +27696,10 @@ snapshots:
'@types/resolve@1.20.4': {}
+ '@types/responselike@1.0.3':
+ dependencies:
+ '@types/node': 20.11.5
+
'@types/retry@0.12.2': {}
'@types/semver@7.5.0': {}
@@ -28896,6 +29252,13 @@ snapshots:
dependencies:
tslib: 2.8.1
+ '@wxt-dev/auto-icons@1.0.2(wxt@0.19.29(@types/node@22.7.5)(bufferutil@4.0.9)(less@4.2.0)(lightningcss@1.27.0)(rollup@4.40.2)(sass@1.80.4)(tsx@4.19.4)(utf-8-validate@5.0.10)(yaml@2.5.1))':
+ dependencies:
+ defu: 6.1.4
+ fs-extra: 11.3.0
+ sharp: 0.33.5
+ wxt: 0.19.29(@types/node@22.7.5)(bufferutil@4.0.9)(less@4.2.0)(lightningcss@1.27.0)(rollup@4.40.2)(sass@1.80.4)(tsx@4.19.4)(utf-8-validate@5.0.10)(yaml@2.5.1)
+
'@wxt-dev/module-react@1.1.3(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.5.1))(wxt@0.19.29(@types/node@22.7.5)(bufferutil@4.0.9)(less@4.2.0)(lightningcss@1.27.0)(rollup@4.40.2)(sass@1.80.4)(tsx@4.19.4)(utf-8-validate@5.0.10)(yaml@2.5.1))':
dependencies:
'@vitejs/plugin-react': 4.4.1(vite@6.3.5(@types/node@22.7.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.27.0)(sass@1.80.4)(tsx@4.19.4)(yaml@2.5.1))
@@ -28984,6 +29347,10 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ ansi-align@2.0.0:
+ dependencies:
+ string-width: 2.1.1
+
ansi-align@3.0.1:
dependencies:
string-width: 4.2.3
@@ -29002,6 +29369,8 @@ snapshots:
dependencies:
environment: 1.1.0
+ ansi-regex@3.0.1: {}
+
ansi-regex@5.0.1: {}
ansi-regex@6.0.1: {}
@@ -29487,8 +29856,21 @@ snapshots:
boolbase@1.0.0: {}
+ boolean@3.2.0:
+ optional: true
+
bowser@2.11.0: {}
+ boxen@1.3.0:
+ dependencies:
+ ansi-align: 2.0.0
+ camelcase: 4.1.0
+ chalk: 2.4.2
+ cli-boxes: 1.0.0
+ string-width: 2.1.1
+ term-size: 1.2.0
+ widest-line: 2.0.1
+
boxen@8.0.1:
dependencies:
ansi-align: 3.0.1
@@ -29690,6 +30072,8 @@ snapshots:
cac@6.7.14: {}
+ cacheable-lookup@5.0.4: {}
+
cacheable-lookup@7.0.0: {}
cacheable-request@10.2.14:
@@ -29702,6 +30086,16 @@ snapshots:
normalize-url: 8.0.1
responselike: 3.0.0
+ cacheable-request@7.0.4:
+ dependencies:
+ clone-response: 1.0.3
+ get-stream: 5.2.0
+ http-cache-semantics: 4.1.1
+ keyv: 4.5.4
+ lowercase-keys: 2.0.0
+ normalize-url: 6.1.0
+ responselike: 2.0.1
+
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
@@ -29730,6 +30124,8 @@ snapshots:
map-obj: 4.3.0
quick-lru: 4.0.1
+ camelcase@4.1.0: {}
+
camelcase@5.3.1: {}
camelcase@6.3.0: {}
@@ -29750,6 +30146,8 @@ snapshots:
tslib: 2.8.1
upper-case-first: 2.0.2
+ capture-stack-trace@1.0.2: {}
+
ccount@2.0.1: {}
chacha-native@2.0.3:
@@ -29916,6 +30314,8 @@ snapshots:
chrome-trace-event@1.0.4: {}
+ ci-info@1.6.0: {}
+
ci-info@3.8.0: {}
ci-info@4.2.0: {}
@@ -29941,6 +30341,8 @@ snapshots:
clean-stack@2.2.0: {}
+ cli-boxes@1.0.0: {}
+
cli-boxes@3.0.0: {}
cli-cursor@3.1.0:
@@ -30014,6 +30416,10 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ clone-response@1.0.3:
+ dependencies:
+ mimic-response: 1.0.1
+
clone@1.0.4: {}
clone@2.1.2: {}
@@ -30119,6 +30525,15 @@ snapshots:
ini: 1.3.8
proto-list: 1.2.4
+ configstore@3.1.5:
+ dependencies:
+ dot-prop: 4.2.1
+ graceful-fs: 4.2.11
+ make-dir: 1.3.0
+ unique-string: 1.0.0
+ write-file-atomic: 2.4.3
+ xdg-basedir: 3.0.0
+
configstore@7.0.0:
dependencies:
atomically: 2.0.3
@@ -30233,6 +30648,10 @@ snapshots:
bn.js: 4.12.2
elliptic: 6.6.1
+ create-error-class@3.0.2:
+ dependencies:
+ capture-stack-trace: 1.0.2
+
create-hash@1.2.0:
dependencies:
cipher-base: 1.0.6
@@ -30299,6 +30718,8 @@ snapshots:
randombytes: 2.1.0
randomfill: 1.0.4
+ crypto-random-string@1.0.0: {}
+
crypto-random-string@4.0.0:
dependencies:
type-fest: 1.4.0
@@ -30604,6 +31025,10 @@ snapshots:
bundle-name: 4.1.0
default-browser-id: 5.0.0
+ default-gateway@6.0.3:
+ dependencies:
+ execa: 5.1.1
+
default-gateway@7.2.2:
dependencies:
execa: 7.2.0
@@ -30678,6 +31103,9 @@ snapshots:
detect-node-es@1.1.0: {}
+ detect-node@2.1.0:
+ optional: true
+
devlop@1.1.0:
dependencies:
dequal: 2.0.3
@@ -30775,6 +31203,10 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
+ dot-prop@4.2.1:
+ dependencies:
+ is-obj: 1.0.1
+
dot-prop@9.0.0:
dependencies:
type-fest: 4.41.0
@@ -30823,6 +31255,8 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
+ duplexer3@0.1.5: {}
+
duplexify@4.1.3:
dependencies:
end-of-stream: 1.4.4
@@ -30849,6 +31283,14 @@ snapshots:
electron-to-chromium@1.5.24: {}
+ electron@23.3.13:
+ dependencies:
+ '@electron/get': 2.0.3
+ '@types/node': 16.18.126
+ extract-zip: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
elliptic@6.6.1:
dependencies:
bn.js: 4.12.2
@@ -31686,6 +32128,19 @@ snapshots:
- bufferutil
- utf-8-validate
+ ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.2
+ '@types/node': 22.7.5
+ aes-js: 4.0.0-beta.5
+ tslib: 2.7.0
+ ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@6.0.3):
dependencies:
'@adraffy/ens-normalize': 1.10.1
@@ -31726,6 +32181,16 @@ snapshots:
md5.js: 1.3.5
safe-buffer: 5.2.1
+ execa@0.7.0:
+ dependencies:
+ cross-spawn: 5.1.0
+ get-stream: 3.0.0
+ is-stream: 1.1.0
+ npm-run-path: 2.0.2
+ p-finally: 1.0.0
+ signal-exit: 3.0.7
+ strip-eof: 1.0.0
+
execa@0.8.0:
dependencies:
cross-spawn: 5.1.0
@@ -31835,7 +32300,7 @@ snapshots:
extract-zip@2.0.1:
dependencies:
- debug: 4.3.7(supports-color@5.5.0)
+ debug: 4.4.0
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
@@ -32333,10 +32798,24 @@ snapshots:
minipass: 4.2.5
path-scurry: 1.11.1
+ global-agent@3.0.0:
+ dependencies:
+ boolean: 3.2.0
+ es6-error: 4.1.1
+ matcher: 3.0.0
+ roarr: 2.15.4
+ semver: 7.7.1
+ serialize-error: 7.0.1
+ optional: true
+
global-directory@4.0.1:
dependencies:
ini: 4.1.1
+ global-dirs@0.1.1:
+ dependencies:
+ ini: 1.3.8
+
global@4.4.0:
dependencies:
min-document: 2.19.0
@@ -32405,6 +32884,20 @@ snapshots:
gopd@1.2.0: {}
+ got@11.8.6:
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ '@szmarczak/http-timer': 4.0.6
+ '@types/cacheable-request': 6.0.3
+ '@types/responselike': 1.0.3
+ cacheable-lookup: 5.0.4
+ cacheable-request: 7.0.4
+ decompress-response: 6.0.0
+ http2-wrapper: 1.0.3
+ lowercase-keys: 2.0.0
+ p-cancelable: 2.1.1
+ responselike: 2.0.1
+
got@12.6.1:
dependencies:
'@sindresorhus/is': 5.6.0
@@ -32433,6 +32926,22 @@ snapshots:
p-cancelable: 3.0.0
responselike: 3.0.0
+ got@6.7.1:
+ dependencies:
+ '@types/keyv': 3.1.4
+ '@types/responselike': 1.0.3
+ create-error-class: 3.0.2
+ duplexer3: 0.1.5
+ get-stream: 3.0.0
+ is-redirect: 1.0.0
+ is-retry-allowed: 1.2.0
+ is-stream: 1.1.0
+ lowercase-keys: 1.0.1
+ safe-buffer: 5.2.1
+ timed-out: 4.0.1
+ unzip-response: 2.0.1
+ url-parse-lax: 1.0.0
+
graceful-fs@4.2.10: {}
graceful-fs@4.2.11: {}
@@ -32884,6 +33393,11 @@ snapshots:
transitivePeerDependencies:
- debug
+ http2-wrapper@1.0.3:
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+
http2-wrapper@2.2.1:
dependencies:
quick-lru: 5.1.1
@@ -32946,6 +33460,8 @@ snapshots:
import-from@4.0.0: {}
+ import-lazy@2.1.0: {}
+
import-meta-resolve@1.1.1:
dependencies:
builtins: 4.1.0
@@ -33028,6 +33544,13 @@ snapshots:
interface-store@5.1.4: {}
+ internal-ip@6.2.0:
+ dependencies:
+ default-gateway: 6.0.3
+ ipaddr.js: 1.9.1
+ is-ip: 3.1.0
+ p-event: 4.2.0
+
internal-slot@1.0.5:
dependencies:
get-intrinsic: 1.2.4
@@ -33060,6 +33583,8 @@ snapshots:
jsbn: 1.1.0
sprintf-js: 1.1.3
+ ip-regex@4.3.0: {}
+
ip-regex@5.0.0: {}
ipaddr.js@1.9.1: {}
@@ -33138,6 +33663,10 @@ snapshots:
is-callable@1.2.7: {}
+ is-ci@1.2.1:
+ dependencies:
+ ci-info: 1.6.0
+
is-ci@3.0.1:
dependencies:
ci-info: 3.8.0
@@ -33174,6 +33703,8 @@ snapshots:
dependencies:
call-bind: 1.0.7
+ is-fullwidth-code-point@2.0.0: {}
+
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
@@ -33200,6 +33731,11 @@ snapshots:
dependencies:
is-docker: 3.0.0
+ is-installed-globally@0.1.0:
+ dependencies:
+ global-dirs: 0.1.1
+ is-path-inside: 1.0.1
+
is-installed-globally@1.0.0:
dependencies:
global-directory: 4.0.1
@@ -33209,6 +33745,10 @@ snapshots:
is-interactive@2.0.0: {}
+ is-ip@3.1.0:
+ dependencies:
+ ip-regex: 4.3.0
+
is-json@2.0.1: {}
is-loopback-addr@2.0.1: {}
@@ -33232,6 +33772,8 @@ snapshots:
is-network-error@1.0.0: {}
+ is-npm@1.0.0: {}
+
is-npm@6.0.0: {}
is-number-object@1.0.6:
@@ -33240,8 +33782,14 @@ snapshots:
is-number@7.0.0: {}
+ is-obj@1.0.1: {}
+
is-obj@3.0.0: {}
+ is-path-inside@1.0.1:
+ dependencies:
+ path-is-inside: 1.0.2
+
is-path-inside@4.0.0: {}
is-plain-obj@1.1.0: {}
@@ -33262,6 +33810,8 @@ snapshots:
is-primitive@3.0.1: {}
+ is-redirect@1.0.0: {}
+
is-reference@3.0.2:
dependencies:
'@types/estree': 1.0.7
@@ -33277,6 +33827,8 @@ snapshots:
dependencies:
is-unc-path: 1.0.0
+ is-retry-allowed@1.2.0: {}
+
is-set@2.0.2: {}
is-set@2.0.3: {}
@@ -33591,6 +34143,9 @@ snapshots:
json-stable-stringify-without-jsonify@1.0.1: {}
+ json-stringify-safe@5.0.1:
+ optional: true
+
json-to-pretty-yaml@1.2.2:
dependencies:
remedial: 1.0.8
@@ -33598,7 +34153,7 @@ snapshots:
json5@1.0.2:
dependencies:
- minimist: 1.2.7
+ minimist: 1.2.8
json5@2.2.3: {}
@@ -33690,6 +34245,10 @@ snapshots:
dependencies:
language-subtag-registry: 0.3.21
+ latest-version@3.1.0:
+ dependencies:
+ package-json: 4.0.1
+
latest-version@9.0.0:
dependencies:
package-json: 10.0.1
@@ -34145,6 +34704,10 @@ snapshots:
dependencies:
tslib: 2.8.1
+ lowercase-keys@1.0.1: {}
+
+ lowercase-keys@2.0.0: {}
+
lowercase-keys@3.0.0: {}
lru-cache@10.4.3: {}
@@ -34184,6 +34747,10 @@ snapshots:
'@babel/types': 7.25.6
source-map-js: 1.2.1
+ make-dir@1.3.0:
+ dependencies:
+ pify: 3.0.0
+
make-dir@2.1.0:
dependencies:
pify: 4.0.1
@@ -34225,6 +34792,11 @@ snapshots:
'@babel/runtime': 7.27.1
remove-accents: 0.5.0
+ matcher@3.0.0:
+ dependencies:
+ escape-string-regexp: 4.0.0
+ optional: true
+
math-expression-evaluator@1.4.0: {}
math-intrinsics@1.1.0: {}
@@ -35268,6 +35840,8 @@ snapshots:
mimic-function@5.0.1: {}
+ mimic-response@1.0.1: {}
+
mimic-response@3.1.0: {}
mimic-response@4.0.0: {}
@@ -35477,7 +36051,7 @@ snapshots:
minimist: 1.2.8
next: 15.3.0(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4)
- next@15.1.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4):
+ next@15.1.6(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.80.4):
dependencies:
'@next/env': 15.1.6
'@swc/counter': 0.1.3
@@ -35487,7 +36061,7 @@ snapshots:
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- styled-jsx: 5.1.6(react@18.3.1)
+ styled-jsx: 5.1.6(@babel/core@7.27.1)(react@18.3.1)
optionalDependencies:
'@next/swc-darwin-arm64': 15.1.6
'@next/swc-darwin-x64': 15.1.6
@@ -35531,6 +36105,33 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ next@15.3.0(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.80.4):
+ dependencies:
+ '@next/env': 15.3.0
+ '@swc/counter': 0.1.3
+ '@swc/helpers': 0.5.15
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001717
+ postcss: 8.4.31
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ styled-jsx: 5.1.6(@babel/core@7.27.1)(react@19.1.0)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.3.0
+ '@next/swc-darwin-x64': 15.3.0
+ '@next/swc-linux-arm64-gnu': 15.3.0
+ '@next/swc-linux-arm64-musl': 15.3.0
+ '@next/swc-linux-x64-gnu': 15.3.0
+ '@next/swc-linux-x64-musl': 15.3.0
+ '@next/swc-win32-arm64-msvc': 15.3.0
+ '@next/swc-win32-x64-msvc': 15.3.0
+ '@opentelemetry/api': 1.9.0
+ sass: 1.80.4
+ sharp: 0.34.1
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
nlcst-is-literal@2.1.1:
dependencies:
'@types/nlcst': 1.0.4
@@ -35668,6 +36269,8 @@ snapshots:
normalize-range@0.1.2: {}
+ normalize-url@6.1.0: {}
+
normalize-url@8.0.1: {}
npm-normalize-package-bin@3.0.1: {}
@@ -35935,10 +36538,16 @@ snapshots:
transitivePeerDependencies:
- zod
+ p-cancelable@2.1.1: {}
+
p-cancelable@3.0.0: {}
p-defer@4.0.0: {}
+ p-event@4.2.0:
+ dependencies:
+ p-timeout: 3.2.0
+
p-event@6.0.0:
dependencies:
p-timeout: 6.1.2
@@ -35993,6 +36602,10 @@ snapshots:
is-network-error: 1.0.0
retry: 0.13.1
+ p-timeout@3.2.0:
+ dependencies:
+ p-finally: 1.0.0
+
p-timeout@5.1.0: {}
p-timeout@6.1.2: {}
@@ -36008,6 +36621,13 @@ snapshots:
registry-url: 6.0.1
semver: 7.7.1
+ package-json@4.0.1:
+ dependencies:
+ got: 6.7.1
+ registry-auth-token: 3.4.0
+ registry-url: 3.1.0
+ semver: 5.7.1
+
package-json@8.1.1:
dependencies:
got: 12.6.1
@@ -36131,6 +36751,8 @@ snapshots:
path-is-absolute@1.0.1: {}
+ path-is-inside@1.0.2: {}
+
path-key@2.0.1: {}
path-key@3.1.1: {}
@@ -36486,7 +37108,7 @@ snapshots:
detect-libc: 2.0.3
expand-template: 2.0.3
github-from-package: 0.0.0
- minimist: 1.2.7
+ minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2
node-abi: 3.71.0
@@ -36505,6 +37127,8 @@ snapshots:
prelude-ls@1.2.1: {}
+ prepend-http@1.0.4: {}
+
prettier-linter-helpers@1.0.0:
dependencies:
fast-diff: 1.3.0
@@ -36560,6 +37184,8 @@ snapshots:
progress-events@1.0.0: {}
+ progress@2.0.3: {}
+
promise-toolbox@0.21.0:
dependencies:
make-error: 1.3.6
@@ -36759,7 +37385,7 @@ snapshots:
dependencies:
deep-extend: 0.6.0
ini: 1.3.8
- minimist: 1.2.7
+ minimist: 1.2.8
strip-json-comments: 2.0.1
react-aria-components@1.3.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
@@ -36856,6 +37482,27 @@ snapshots:
date-fns: 3.6.0
react: 19.1.0
+ react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ dependencies:
+ shell-quote: 1.8.2
+ ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ react-devtools@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ dependencies:
+ cross-spawn: 5.1.0
+ electron: 23.3.13
+ internal-ip: 6.2.0
+ minimist: 1.2.8
+ react-devtools-core: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ update-notifier: 2.5.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
react-docgen-typescript@2.2.2(typescript@5.8.3):
dependencies:
typescript: 5.8.3
@@ -37294,10 +37941,19 @@ snapshots:
regexparam@1.3.0: {}
+ registry-auth-token@3.4.0:
+ dependencies:
+ rc: 1.2.8
+ safe-buffer: 5.2.1
+
registry-auth-token@5.0.2:
dependencies:
'@pnpm/npm-conf': 2.3.1
+ registry-url@3.1.0:
+ dependencies:
+ rc: 1.2.8
+
registry-url@6.0.1:
dependencies:
rc: 1.2.8
@@ -38408,6 +39064,10 @@ snapshots:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ responselike@2.0.1:
+ dependencies:
+ lowercase-keys: 2.0.0
+
responselike@3.0.0:
dependencies:
lowercase-keys: 3.0.0
@@ -38526,6 +39186,16 @@ snapshots:
hash-base: 3.1.0
inherits: 2.0.4
+ roarr@2.15.4:
+ dependencies:
+ boolean: 3.2.0
+ detect-node: 2.1.0
+ globalthis: 1.0.4
+ json-stringify-safe: 5.0.1
+ semver-compare: 1.0.0
+ sprintf-js: 1.1.3
+ optional: true
+
robust-predicates@3.0.2: {}
rollup-plugin-preserve-directives@0.4.0(rollup@4.40.2):
@@ -38641,6 +39311,13 @@ snapshots:
extend-shallow: 2.0.1
kind-of: 6.0.3
+ semver-compare@1.0.0:
+ optional: true
+
+ semver-diff@2.1.0:
+ dependencies:
+ semver: 5.7.1
+
semver@5.7.1: {}
semver@6.3.1: {}
@@ -38695,6 +39372,11 @@ snapshots:
tslib: 2.8.1
upper-case-first: 2.0.2
+ serialize-error@7.0.1:
+ dependencies:
+ type-fest: 0.13.1
+ optional: true
+
serialize-error@8.1.0:
dependencies:
type-fest: 0.20.2
@@ -38765,7 +39447,7 @@ snapshots:
dependencies:
color: 4.2.3
detect-libc: 2.0.3
- semver: 7.6.3
+ semver: 7.7.1
optionalDependencies:
'@img/sharp-darwin-arm64': 0.33.5
'@img/sharp-darwin-x64': 0.33.5
@@ -38786,7 +39468,6 @@ snapshots:
'@img/sharp-wasm32': 0.33.5
'@img/sharp-win32-ia32': 0.33.5
'@img/sharp-win32-x64': 0.33.5
- optional: true
sharp@0.34.1:
dependencies:
@@ -39065,6 +39746,11 @@ snapshots:
string-replace-to-array@2.1.1: {}
+ string-width@2.1.1:
+ dependencies:
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 4.0.0
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -39161,6 +39847,10 @@ snapshots:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
+ strip-ansi@4.0.0:
+ dependencies:
+ ansi-regex: 3.0.1
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -39253,10 +39943,19 @@ snapshots:
optionalDependencies:
'@babel/core': 7.25.2
- styled-jsx@5.1.6(react@18.3.1):
+ styled-jsx@5.1.6(@babel/core@7.27.1)(react@18.3.1):
dependencies:
client-only: 0.0.1
react: 18.3.1
+ optionalDependencies:
+ '@babel/core': 7.27.1
+
+ styled-jsx@5.1.6(@babel/core@7.27.1)(react@19.1.0):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.1.0
+ optionalDependencies:
+ '@babel/core': 7.27.1
stylis@4.2.0: {}
@@ -39270,6 +39969,12 @@ snapshots:
pirates: 4.0.6
ts-interface-checker: 0.1.13
+ sumchecker@3.0.1:
+ dependencies:
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
superjson@2.2.2:
dependencies:
copy-anything: 3.0.5
@@ -39438,6 +40143,10 @@ snapshots:
type-fest: 2.19.0
unique-string: 3.0.0
+ term-size@1.2.0:
+ dependencies:
+ execa: 0.7.0
+
term-size@2.2.1: {}
text-decoder@1.2.1: {}
@@ -39462,6 +40171,8 @@ snapshots:
through@2.3.8: {}
+ timed-out@4.0.1: {}
+
timeout-signal@2.0.0: {}
timers-browserify@2.0.12:
@@ -39825,7 +40536,7 @@ snapshots:
chokidar: 3.6.0
fault: 2.0.1
json5: 2.2.3
- minimist: 1.2.7
+ minimist: 1.2.8
text-table: 0.2.0
unified-engine: 10.1.0
transitivePeerDependencies:
@@ -39948,6 +40659,10 @@ snapshots:
transitivePeerDependencies:
- rollup
+ unique-string@1.0.0:
+ dependencies:
+ crypto-random-string: 1.0.0
+
unique-string@3.0.0:
dependencies:
crypto-random-string: 4.0.0
@@ -40113,6 +40828,8 @@ snapshots:
untildify@4.0.0: {}
+ unzip-response@2.0.1: {}
+
update-browserslist-db@1.1.0(browserslist@4.22.1):
dependencies:
browserslist: 4.22.1
@@ -40131,6 +40848,19 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ update-notifier@2.5.0:
+ dependencies:
+ boxen: 1.3.0
+ chalk: 2.4.2
+ configstore: 3.1.5
+ import-lazy: 2.1.0
+ is-ci: 1.2.1
+ is-installed-globally: 0.1.0
+ is-npm: 1.0.0
+ latest-version: 3.1.0
+ semver-diff: 2.1.0
+ xdg-basedir: 3.0.0
+
update-notifier@7.3.1:
dependencies:
boxen: 8.0.1
@@ -40156,6 +40886,10 @@ snapshots:
dependencies:
punycode: 2.1.1
+ url-parse-lax@1.0.0:
+ dependencies:
+ prepend-http: 1.0.4
+
url@0.11.4:
dependencies:
punycode: 1.4.1
@@ -40757,6 +41491,10 @@ snapshots:
siginfo: 2.0.0
stackback: 0.0.2
+ widest-line@2.0.1:
+ dependencies:
+ string-width: 2.1.1
+
widest-line@5.0.0:
dependencies:
string-width: 7.2.0
@@ -40791,6 +41529,12 @@ snapshots:
wrappy@1.0.2: {}
+ write-file-atomic@2.4.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.3):
optionalDependencies:
bufferutil: 4.0.8
@@ -40811,6 +41555,11 @@ snapshots:
bufferutil: 4.0.8
utf-8-validate: 6.0.3
+ ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ optionalDependencies:
+ bufferutil: 4.0.9
+ utf-8-validate: 5.0.10
+
ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.3):
optionalDependencies:
bufferutil: 4.0.9
@@ -40907,6 +41656,8 @@ snapshots:
- utf-8-validate
- yaml
+ xdg-basedir@3.0.0: {}
+
xdg-basedir@5.1.0: {}
xml2js@0.4.23:
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 2e91deadb..4d579f690 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -4,7 +4,7 @@
// "tsBuildInfoFile": "./node_modules/.cache/tsconfig.tsbuildinfo",
"incremental": true,
"module": "ES2020",
- "moduleResolution": "Bundler",
+ "moduleResolution": "bundler",
"target": "ESNext",
"jsx": "react-jsx",
"declaration": true,
@@ -33,6 +33,21 @@
"skipLibCheck": true,
"pretty": true,
// "noErrorTruncation": true,
- "resolveJsonModule": true
+ "resolveJsonModule": true,
+ "baseUrl": ".",
+ "paths": {
+ "@status-im/colors": ["./packages/colors/src"],
+ "@status-im/colors/*": ["./packages/colors/src/*"],
+ "@status-im/icons": ["./packages/icons/src"],
+ "@status-im/icons/*": ["./packages/icons/src/*"],
+ "@status-im/components": ["./packages/components/src"],
+ "@status-im/components/*": ["./packages/components/src/*"],
+ "@status-im/wallet": ["./packages/wallet/src"],
+ "@status-im/wallet/*": ["./packages/wallet/src/*"],
+ "@status-im/status-js": ["./packages/status-js/src"],
+ "@status-im/status-js/*": ["./packages/status-js/src/*"]
+ // "@status-im/eslint-config": ["./packages/eslint-config/src"],
+ // "@status-im/eslint-config/*": ["./packages/eslint-config/src/*"]
+ }
}
}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 000000000..1f27591b0
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./packages/colors" },
+ { "path": "./packages/icons" },
+ { "path": "./packages/components" },
+ { "path": "./packages/status-js" },
+ { "path": "./packages/wallet" },
+ { "path": "./apps/connector" },
+ { "path": "./apps/portfolio" },
+ { "path": "./apps/wallet" },
+ { "path": "./apps/api" }
+ ]
+}
diff --git a/turbo.json b/turbo.json
index b2b1193a3..5eabf18c1 100644
--- a/turbo.json
+++ b/turbo.json
@@ -4,31 +4,8 @@
"globalPassThroughEnv": ["PORT"],
"tasks": {
"build": {
- "dependsOn": ["^build"]
- },
- "./packages/colors#build": {
- "outputs": ["dist/**"]
- },
- "./packages/icons#build": {
- "outputs": ["dist/**"]
- },
- "./packages/components#build": {
- "dependsOn": ["colors#build", "icons#build"],
- "outputs": ["dist/**", "storybook-static/**"]
- },
- "./packages/wallet#build": {
- "dependsOn": ["components#build"],
- "outputs": ["dist/**"]
- },
- "./apps/wallet#build": {
- "dependsOn": ["wallet#build"],
- "outputs": [".output/**"]
- },
- "./apps/portfolio#build": {
- "dependsOn": ["wallet#build"]
- },
- "./apps/api#build": {
- "dependsOn": ["wallet#build"]
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**", ".output/**", "build/**"]
},
"dev": {
"cache": false