diff --git a/components/Primitives/Commands.tsx b/components/Primitives/Commands.tsx index 3fc83cd..e5a98fd 100644 --- a/components/Primitives/Commands.tsx +++ b/components/Primitives/Commands.tsx @@ -75,7 +75,7 @@ export const CommandItem = React.forwardRef< ( + ( + {className, sideOffset = 4, ...props}: DropdownMenuContentProps, + ref: Ref | undefined + ): ReactElement => ( ( - e.preventDefault()} - {...props}> - | undefined) => ( + - - - - - - {children} - -)); + 'relative flex cursor-pointer items-center rounded-lg py-2 pl-8 pr-2', + 'outline-none select-none transition-colors', + 'text-xs text-neutral-800 group', + 'focus:bg-neutral-300 data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className + )} + checked={checked} + onSelect={(e: Event) => e.preventDefault()} + {...props}> + + + + + + + {children} + + ) +); DropdownMenuCheckboxItem.displayName = CheckboxItem.displayName; -export const DropdownMenuSeparator = forwardRef(({className, ...props}: any, ref) => ( - -)); +export const DropdownMenuSeparator = forwardRef( + ({className, ...props}: DropdownMenuSeparatorProps, ref: Ref | undefined) => ( + + ) +); DropdownMenuSeparator.displayName = Separator.displayName; diff --git a/components/apps/disperse/Wizard.tsx b/components/apps/disperse/Wizard.tsx deleted file mode 100644 index 8cf7b00..0000000 --- a/components/apps/disperse/Wizard.tsx +++ /dev/null @@ -1,586 +0,0 @@ -import React, {useCallback, useMemo, useState} from 'react'; -import {IconCircleCheck} from 'components/icons/IconCircleCheck'; -import {IconCircleCross} from 'components/icons/IconCircleCross'; -import {IconSpinner} from 'components/icons/IconSpinner'; -import {Button} from 'components/Primitives/Button'; -import {approveERC20, disperseERC20, disperseETH, isApprovedERC20} from 'utils/actions'; -import {notifyDisperse} from 'utils/notifier'; -import {getTransferTransaction} from 'utils/tools.gnosis'; -import {erc20ABI, useContractRead} from 'wagmi'; -import useWallet from '@builtbymom/web3/contexts/useWallet'; -import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; -import {useChainID} from '@builtbymom/web3/hooks/useChainID'; -import {cl, formatAmount, isZeroAddress, toAddress, toBigInt, toBigNumberAsAmount} from '@builtbymom/web3/utils'; -import {defaultTxStatus} from '@builtbymom/web3/utils/wagmi/transaction'; -import {useSafeAppsSDK} from '@gnosis.pm/safe-apps-react-sdk'; -import {toast} from '@yearn-finance/web-lib/components/yToast'; -import {ETH_TOKEN_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {SuccessModal} from '@common/ConfirmationModal'; - -import {useDisperse} from './useDisperse'; - -import type {ReactElement} from 'react'; -import type {BaseError, Hex} from 'viem'; -import type {TAddress} from '@builtbymom/web3/types'; -import type {BaseTransaction} from '@gnosis.pm/safe-apps-sdk'; -import type {TDisperseReceiver} from './useDisperse'; - -type TApprovalWizardProps = { - allowance: bigint; - onSuccess: () => Promise; -}; -function ApprovalWizard({onSuccess, allowance}: TApprovalWizardProps): ReactElement { - const {provider} = useWeb3(); - const {safeChainID} = useChainID(); - const {configuration} = useDisperse(); - const {getBalance} = useWallet(); - const [approvalStatus, set_approvalStatus] = useState(defaultTxStatus); - - const totalToDisperse = useMemo((): bigint => { - return configuration.receivers.reduce((acc, row): bigint => acc + toBigInt(row.amount?.raw), 0n); - }, [configuration.receivers]); - - const onApproveToken = useCallback(async (): Promise => { - const isApproved = await isApprovedERC20({ - connector: provider, - contractAddress: toAddress(configuration.tokenToSend?.address), - spenderAddress: toAddress(process.env.DISPERSE_ADDRESS), - amount: totalToDisperse - }); - if (isApproved) { - return document.getElementById('DISPERSE_TOKENS')?.click(); - } - const result = await approveERC20({ - connector: provider, - chainID: safeChainID, - contractAddress: toAddress(configuration.tokenToSend?.address), - spenderAddress: toAddress(process.env.DISPERSE_ADDRESS), - amount: totalToDisperse, - statusHandler: set_approvalStatus - }); - if (result.isSuccessful) { - await onSuccess(); - return document.getElementById('DISPERSE_TOKENS')?.click(); - } - }, [provider, configuration.tokenToSend, totalToDisperse, onSuccess, safeChainID]); - - function renderStatusIndicator(): ReactElement { - if (!configuration.tokenToSend) { - return
; - } - if (allowance >= totalToDisperse) { - return ; - } - if (approvalStatus.pending) { - return ; - } - if (approvalStatus.success) { - return ; - } - if (approvalStatus.error) { - return ; - } - if ( - totalToDisperse > - getBalance({ - address: toAddress(configuration.tokenToSend?.address), - chainID: configuration.tokenToSend.chainID - }).raw - ) { - return ; - } - - return
; - } - - function renderStatusMessage(): ReactElement { - if (totalToDisperse === 0n) { - return
{'You have nothing to approve '}
; - } - if (allowance >= totalToDisperse || approvalStatus.success) { - return ( -
- {'You have already approved '} - - {formatAmount( - toBigNumberAsAmount(allowance, configuration.tokenToSend?.decimals || 18), - 6, - configuration.tokenToSend?.decimals || 18 - )} - - {` ${configuration.tokenToSend?.symbol || 'Tokens'}`} -
- ); - } - if (approvalStatus.pending) { - return ( -
- {'Approving '} - - {formatAmount( - toBigNumberAsAmount(totalToDisperse, configuration.tokenToSend?.decimals || 18), - 6, - configuration.tokenToSend?.decimals || 18 - )} - - {` ${configuration.tokenToSend?.symbol || 'Tokens'} ...`} -
- ); - } - if ( - totalToDisperse > - getBalance({ - address: toAddress(configuration.tokenToSend?.address), - chainID: Number(configuration.tokenToSend?.chainID) - }).raw - ) { - return ( -
- {`You don't have enough ${configuration.tokenToSend?.symbol || 'Tokens'}`} -
- ); - } - - return ( -
- {'You need to approve the spending of '} - - {formatAmount( - toBigNumberAsAmount(totalToDisperse, configuration.tokenToSend?.decimals || 18), - 6, - configuration.tokenToSend?.decimals || 18 - )} - - {` ${configuration.tokenToSend?.symbol || 'Tokens'}`} -
- ); - } - - if (!configuration.tokenToSend) { - return ( - - ); - } - - return ( - - ); -} - -function NothingToDisperse(): ReactElement { - return ( -
-
-
- {'Please add some receivers to disperse tokens'} -
-
- ); -} - -function DisperseElement({row}: {row: TDisperseReceiver}): ReactElement { - const {configuration} = useDisperse(); - - return ( -
-
-
- {'Sending '} - - {formatAmount(row.amount?.normalized || 0, 6, configuration.tokenToSend?.decimals || 18)} - - {` ${configuration.tokenToSend?.symbol || 'Tokens'} to `} - - {toAddress(row.label) === ZERO_ADDRESS ? ( -
- {row.label} - {` (${toAddress(row.address)})`} -
- ) : ( -
- {toAddress(row.address)} -
- )} -
-
-
- ); -} - -type TSpendingWizardProps = { - onTrigger: () => void; - onSuccess: () => void; - onError: () => void; -}; -function SpendingWizard(props: TSpendingWizardProps): ReactElement { - const {address, provider, isWalletSafe} = useWeb3(); - const {safeChainID} = useChainID(); - const {isDispersed, configuration} = useDisperse(); - const {onRefresh} = useWallet(); - const {sdk} = useSafeAppsSDK(); - const [disperseStatus, set_disperseStatus] = useState(defaultTxStatus); - - const validReceivers = useMemo((): TDisperseReceiver[] => { - return configuration.receivers.filter( - (row): boolean => toBigInt(row.amount?.raw) !== 0n && row.address !== ZERO_ADDRESS - ); - }, [configuration.receivers]); - - /********************************************************************************************** - ** onDisperseTokensForGnosis will do just like disperseTokens but for Gnosis Safe and without - ** the use of a smartcontract. It will just batch standard transfers. - **********************************************************************************************/ - const onDisperseTokensForGnosis = useCallback(async (): Promise => { - const transactions: BaseTransaction[] = []; - const disperseAddresses: TAddress[] = []; - const disperseAmount: bigint[] = []; - for (const row of configuration.receivers) { - if (!row.amount || row.amount?.raw === 0n) { - continue; - } - if (!row.address || row.address === ZERO_ADDRESS || row.address === ETH_TOKEN_ADDRESS) { - continue; - } - disperseAddresses.push(row.address); - disperseAmount.push(row.amount.raw); - const newTransactionForBatch = getTransferTransaction( - row.amount.raw.toString(), - toAddress(configuration.tokenToSend?.address), - row.address - ); - transactions.push(newTransactionForBatch); - } - try { - const {safeTxHash} = await sdk.txs.send({txs: transactions}); - console.log({hash: safeTxHash}); - toast({type: 'success', content: 'Your transaction has been created! You can now sign and execute it!'}); - notifyDisperse({ - chainID: safeChainID, - tokenToDisperse: configuration.tokenToSend, - receivers: disperseAddresses, - amounts: disperseAmount, - type: 'SAFE', - from: toAddress(address), - hash: safeTxHash as Hex - }); - props.onSuccess(); - } catch (error) { - toast({ - type: 'error', - content: (error as BaseError)?.message || 'An error occured while creating your transaction!' - }); - props.onError(); - } - }, [address, safeChainID, configuration.receivers, sdk.txs, configuration.tokenToSend, props]); - - const onDisperseTokens = useCallback(async (): Promise => { - props.onTrigger(); - if (isWalletSafe) { - return await onDisperseTokensForGnosis(); - } - - const [disperseAddresses, disperseAmount] = configuration.receivers - .filter((row): boolean => { - return (toBigInt(row.amount?.raw) > 0n && row.address && !isZeroAddress(row.address)) || false; - }) - .reduce( - (acc, row): [TAddress[], bigint[]] => { - acc[0].push(toAddress(row.address)); - acc[1].push(toBigInt(row.amount?.raw)); - return acc; - }, - [[] as TAddress[], [] as bigint[]] - ); - - if (configuration.tokenToSend?.address === ETH_TOKEN_ADDRESS) { - const result = await disperseETH({ - connector: provider, - chainID: safeChainID, - contractAddress: toAddress(process.env.DISPERSE_ADDRESS), - receivers: disperseAddresses, - amounts: disperseAmount, - statusHandler: set_disperseStatus - }); - if (result.isSuccessful) { - props.onSuccess(); - onRefresh([ - { - decimals: configuration.tokenToSend.decimals, - name: configuration.tokenToSend.name, - symbol: configuration.tokenToSend.symbol, - address: configuration.tokenToSend.address, - chainID: configuration.tokenToSend.chainID - } - ]); - if (result.receipt) { - notifyDisperse({ - chainID: safeChainID, - tokenToDisperse: configuration.tokenToSend, - receivers: disperseAddresses, - amounts: disperseAmount, - type: 'EOA', - from: result.receipt.from, - hash: result.receipt.transactionHash - }); - } - return; - } - props.onError(); - } else { - const result = await disperseERC20({ - connector: provider, - chainID: safeChainID, - contractAddress: toAddress(process.env.DISPERSE_ADDRESS), - tokenToDisperse: toAddress(configuration.tokenToSend?.address), - receivers: disperseAddresses, - amounts: disperseAmount, - statusHandler: set_disperseStatus - }); - if (result.isSuccessful) { - props.onSuccess(); - onRefresh([ - { - decimals: configuration.tokenToSend?.decimals, - name: configuration.tokenToSend?.name, - symbol: configuration.tokenToSend?.symbol, - address: toAddress(configuration.tokenToSend?.address), - chainID: Number(configuration.tokenToSend?.chainID) - } - ]); - if (result.receipt) { - notifyDisperse({ - chainID: safeChainID, - tokenToDisperse: configuration.tokenToSend, - receivers: disperseAddresses, - amounts: disperseAmount, - type: 'EOA', - from: result.receipt.from, - hash: result.receipt.transactionHash - }); - } - return; - } - props.onError(); - } - }, [ - props, - isWalletSafe, - configuration.receivers, - configuration.tokenToSend, - onDisperseTokensForGnosis, - provider, - safeChainID, - onRefresh - ]); - - function renderStatusIndicator(): ReactElement { - if (isDispersed) { - return ; - } - if (disperseStatus.pending) { - return ; - } - if (disperseStatus.success) { - return ; - } - if (disperseStatus.error) { - return ; - } - return
; - } - - return ( -
-
{renderStatusIndicator()}
- -
- ); -} - -export function DisperseWizard(): ReactElement { - const {getBalance} = useWallet(); - const {address, isWalletSafe} = useWeb3(); - const {configuration, onResetDisperse} = useDisperse(); - const [disperseStatus, set_disperseStatus] = useState(defaultTxStatus); - const {data: allowance, refetch} = useContractRead({ - abi: erc20ABI, - functionName: 'allowance', - args: [toAddress(address), toAddress(process.env.DISPERSE_ADDRESS)], - address: toAddress(configuration.tokenToSend?.address), - enabled: - configuration.tokenToSend !== undefined && - toAddress(configuration.tokenToSend?.address) !== ETH_TOKEN_ADDRESS - }); - - const shouldApprove = useMemo((): boolean => { - return toAddress(configuration.tokenToSend?.address) !== ETH_TOKEN_ADDRESS; - }, [configuration.tokenToSend]); - - const totalToDisperse = useMemo((): number => { - return configuration.receivers.reduce((acc, row): number => acc + Number(row.amount?.normalized || 0), 0); - }, [configuration.receivers]); - - const isAboveBalance = - totalToDisperse > - getBalance({ - address: toAddress(configuration.tokenToSend?.address), - chainID: Number(configuration.tokenToSend?.chainID) - }).raw; - - const checkAlreadyExists = useCallback( - (UUID: string, address: TAddress): boolean => { - if (isZeroAddress(address)) { - return false; - } - return configuration.receivers.some((row): boolean => row.UUID !== UUID && row.address === address); - }, - [configuration.receivers] - ); - - const isValid = useMemo((): boolean => { - return configuration.receivers.every((row): boolean => { - if (!row.label && !row.address && toBigInt(row.amount?.raw) === 0n) { - return false; - } - if (!row.address || isZeroAddress(row.address)) { - return false; - } - if (checkAlreadyExists(row.UUID, row.address)) { - return false; - } - if (!row.amount || row.amount.raw === 0n) { - return false; - } - return true; - }); - }, [configuration.receivers, checkAlreadyExists]); - - return ( -
- {'Summary'} - -
- {shouldApprove && !isWalletSafe && ( - => { - await refetch(); - set_disperseStatus(defaultTxStatus); - }} - /> - )} - - set_disperseStatus({...defaultTxStatus, pending: true})} - onSuccess={() => set_disperseStatus({...defaultTxStatus, pending: true})} - onError={() => set_disperseStatus({...defaultTxStatus, error: true})} - /> - -
- -
-
- - { - onResetDisperse(); - set_disperseStatus(defaultTxStatus); - }} - /> -
- ); -} diff --git a/components/apps/disperse/index.tsx b/components/apps/disperse/index.tsx deleted file mode 100644 index c1d5c52..0000000 --- a/components/apps/disperse/index.tsx +++ /dev/null @@ -1,231 +0,0 @@ -import React, {Fragment, memo, useCallback} from 'react'; -import IconSquareMinus from 'components/icons/IconSquareMinus'; -import IconSquarePlus from 'components/icons/IconSquarePlus'; -import {useTokensWithBalance} from 'hooks/useTokensWithBalance'; -import { - handleInputChangeEventValue, - isZeroAddress, - parseUnits, - toAddress, - toNormalizedBN -} from '@builtbymom/web3/utils'; -import {newVoidRow, useDisperse} from '@disperse/useDisperse'; -import {AddressLikeInput} from '@common/AddressLikeInput'; -import {MultipleTokenSelector} from '@common/TokenInput/TokenSelector'; - -import {DisperseWizard} from './Wizard'; - -import type {ReactElement} from 'react'; -import type {TAddress, TNormalizedBN, TToken} from '@builtbymom/web3/types'; -import type {TDisperseConfiguration} from '@disperse/useDisperse'; - -function AmountToSendInput(props: { - token: TToken | undefined; - amount: TNormalizedBN | undefined; - onChange: (amount: TNormalizedBN) => void; -}): ReactElement { - return ( -
-
- e.preventDefault()} - min={0} - step={1 / 10 ** (props.token?.decimals || 18)} - inputMode={'numeric'} - placeholder={'0'} - pattern={'^((?:0|[1-9]+)(?:.(?:d+?[1-9]|[1-9]))?)$'} - onChange={e => props.onChange(handleInputChangeEventValue(e, props.token?.decimals || 18))} - value={props.amount?.normalized} - /> -
-
- ); -} - -const Disperse = memo(function Disperse(): ReactElement { - const {configuration, dispatchConfiguration} = useDisperse(); - const {tokensWithBalance} = useTokensWithBalance(); - - const checkAlreadyExists = useCallback( - (UUID: string, address: TAddress): boolean => { - if (isZeroAddress(address)) { - return false; - } - return configuration.receivers.some((row): boolean => row.UUID !== UUID && row.address === address); - }, - [configuration.receivers] - ); - - function onHandleMultiplePaste(_: string, pasted: string): void { - const separators = [' ', '-', ';', ',', '.']; - const addressAmounts = pasted - .replaceAll(' ', '') - .replaceAll('\t', '') - .split('\n') - .map((line): [string, string] => { - //remove all separators that are next to each other - let cleanedLine = separators.reduce( - (acc, separator): string => acc.replaceAll(separator + separator, separator), - line - ); - for (let i = 0; i < 3; i++) { - cleanedLine = separators.reduce( - (acc, separator): string => acc.replaceAll(separator + separator, separator), - cleanedLine - ); - } - - const addressAmount = cleanedLine.split( - separators.find((separator): boolean => cleanedLine.includes(separator)) ?? ' ' - ); - return [addressAmount[0], addressAmount[1]]; - }); - - const newRows = addressAmounts.map((addressAmount): TDisperseConfiguration['receivers'][0] => { - const row = newVoidRow(); - row.address = toAddress(addressAmount[0]); - row.label = String(addressAmount[0]); - try { - if (addressAmount[1].includes('.') || addressAmount[1].includes(',')) { - const normalizedAmount = Number(addressAmount[1]); - const raw = parseUnits(normalizedAmount, configuration.tokenToSend?.decimals || 18); - const amount = toNormalizedBN(raw, configuration.tokenToSend?.decimals || 18); - row.amount = amount; - } else { - const amount = toNormalizedBN(addressAmount[1], configuration.tokenToSend?.decimals || 18); - row.amount = amount; - } - } catch (e) { - row.amount = toNormalizedBN(0n, configuration.tokenToSend?.decimals || 18); - } - return row; - }); - - dispatchConfiguration({ - type: 'ADD_RECEIVERS', - payload: newRows.filter((row): boolean => { - if (!row.address || isZeroAddress(row.address)) { - return false; - } - if (checkAlreadyExists(row.UUID, row.address)) { - return false; - } - if (!row.amount || row.amount.raw === 0n) { - return false; - } - return true; - }) - }); - } - - return ( -
-
-
-
- {'Who gets what?'} -

- { - 'Drop the wallet, ENS, or Lens handle of who you want to receive the tokens, and enter the amount each address should receive. Add more receivers by clicking the +. Clicking is fun.' - } -

-
- -
=> e.preventDefault()} - className={'mt-6 grid w-full grid-cols-12 flex-row items-start justify-between gap-4'}> -
- {'Token to send'} - - dispatchConfiguration({type: 'SET_TOKEN_TO_SEND', payload: newToken}) - } - /> -
- -
-
-

{'Receivers'}

-

{'Amount'}

-
-
- {configuration.receivers.map((receiver): ReactElement => { - return ( - - - dispatchConfiguration({ - type: 'UPD_RECEIVER_BY_UUID', - payload: {...receiver, label} - }) - } - onChange={(address): void => { - dispatchConfiguration({ - type: 'UPD_RECEIVER_BY_UUID', - payload: {...receiver, address: toAddress(address)} - }); - }} - onPaste={onHandleMultiplePaste} - /> -
- { - dispatchConfiguration({ - type: 'UPD_RECEIVER_BY_UUID', - payload: {...receiver, amount} - }); - }} - /> - - dispatchConfiguration({ - type: 'DEL_RECEIVER_BY_UUID', - payload: receiver.UUID - }) - } - className={ - 'size-4 cursor-pointer text-neutral-400 transition-colors hover:text-neutral-900' - } - /> - - dispatchConfiguration({ - type: 'ADD_SIBLING_RECEIVER_FROM_UUID', - payload: receiver.UUID - }) - } - className={ - 'size-4 cursor-pointer text-neutral-400 transition-colors hover:text-neutral-900' - } - /> -
-
- ); - })} -
-
- - - -
-
-
- ); -}); - -export default Disperse; diff --git a/components/apps/disperse/useDisperse.tsx b/components/apps/disperse/useDisperse.tsx deleted file mode 100755 index fab1730..0000000 --- a/components/apps/disperse/useDisperse.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import React, {createContext, useContext, useMemo, useReducer, useState} from 'react'; - -import type {Dispatch} from 'react'; -import type {TAddress, TNormalizedBN, TToken} from '@builtbymom/web3/types'; - -export type TDisperseReceiver = { - address: TAddress | undefined; - amount: TNormalizedBN | undefined; - label: string; - UUID: string; -}; - -export type TDisperseConfiguration = { - tokenToSend: TToken | undefined; - receivers: TDisperseReceiver[]; -}; - -export type TDisperseActions = - | {type: 'SET_TOKEN_TO_SEND'; payload: TToken | undefined} - | {type: 'SET_RECEIVERS'; payload: TDisperseReceiver[]} - | {type: 'ADD_RECEIVERS'; payload: TDisperseReceiver[]} - | {type: 'ADD_SIBLING_RECEIVER_FROM_UUID'; payload: string} - | {type: 'DEL_RECEIVER_BY_UUID'; payload: string} - | {type: 'UPD_RECEIVER_BY_UUID'; payload: TDisperseReceiver} - | {type: 'RESET'; payload: undefined}; - -export type TDisperse = { - configuration: TDisperseConfiguration; - dispatchConfiguration: Dispatch; - isDispersed: boolean; - onResetDisperse: () => void; -}; - -export function newVoidRow(): TDisperseReceiver { - return { - address: undefined, - label: '', - amount: undefined, - UUID: crypto.randomUUID() - }; -} - -const defaultProps: TDisperse = { - isDispersed: false, - dispatchConfiguration: (): void => undefined, - onResetDisperse: (): void => undefined, - configuration: { - tokenToSend: undefined, - receivers: [newVoidRow(), newVoidRow()] - } -}; - -const configurationReducer = (state: TDisperseConfiguration, action: TDisperseActions): TDisperseConfiguration => { - switch (action.type) { - case 'SET_TOKEN_TO_SEND': - return {...state, tokenToSend: action.payload}; - case 'SET_RECEIVERS': - return {...state, receivers: action.payload}; - case 'ADD_RECEIVERS': - return {...state, receivers: [...state.receivers, ...action.payload]}; - case 'ADD_SIBLING_RECEIVER_FROM_UUID': - return { - ...state, - receivers: state.receivers.reduce((acc, row): TDisperseReceiver[] => { - if (row.UUID === action.payload) { - return [...acc, row, newVoidRow()]; - } - return [...acc, row]; - }, [] as TDisperseReceiver[]) - }; - case 'DEL_RECEIVER_BY_UUID': - if (state.receivers.length === 1) { - return {...state, receivers: [newVoidRow()]}; - } - return { - ...state, - receivers: state.receivers.filter((receiver): boolean => receiver.UUID !== action.payload) - }; - case 'UPD_RECEIVER_BY_UUID': - return { - ...state, - receivers: state.receivers.map((receiver): TDisperseReceiver => { - if (action.payload.UUID === receiver.UUID) { - return action.payload; - } - return receiver; - }) - }; - case 'RESET': - return {tokenToSend: undefined, receivers: [newVoidRow()]}; - } -}; - -const DisperseContext = createContext(defaultProps); -export const DisperseContextApp = ({children}: {children: React.ReactElement}): React.ReactElement => { - const [isDispersed, set_isDispersed] = useState(false); - const [configuration, dispatch] = useReducer(configurationReducer, defaultProps.configuration); - - const onResetDisperse = (): void => { - set_isDispersed(true); - setTimeout((): void => { - dispatch({type: 'RESET', payload: undefined}); - set_isDispersed(false); - }, 5000); - }; - - const contextValue = useMemo( - (): TDisperse => ({ - configuration, - dispatchConfiguration: dispatch, - isDispersed, - onResetDisperse - }), - [configuration, isDispersed] - ); - - return {children}; -}; - -export const useDisperse = (): TDisperse => { - const ctx = useContext(DisperseContext); - if (!ctx) { - throw new Error('DisperseContext not found'); - } - return ctx; -}; diff --git a/components/apps/nftmigratooor/3.ViewApprovalWizard.tsx b/components/apps/nftmigratooor/3.ViewApprovalWizard.tsx index dbe4055..141edce 100644 --- a/components/apps/nftmigratooor/3.ViewApprovalWizard.tsx +++ b/components/apps/nftmigratooor/3.ViewApprovalWizard.tsx @@ -2,19 +2,19 @@ import React, {useCallback, useMemo, useState} from 'react'; import {approveAllERC721, batchTransferERC721, listERC1155, transferERC721, transferERC1155} from 'utils/actions'; import {NFTMIGRATOOOR_CONTRACT_PER_CHAIN} from 'utils/constants'; import {getSafeBatchTransferFrom1155, getSafeTransferFrom721} from 'utils/tools.gnosis'; +import {erc721Abi, type TransactionReceipt} from 'viem'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; import {decodeAsBoolean, toAddress, toBigInt} from '@builtbymom/web3/utils'; -import {defaultTxStatus} from '@builtbymom/web3/utils/wagmi'; +import {defaultTxStatus, retrieveConfig} from '@builtbymom/web3/utils/wagmi'; import {useSafeAppsSDK} from '@gnosis.pm/safe-apps-react-sdk'; import ApprovalWizardItem from '@nftmigratooor/ApprovalWizardItem'; import {useNFTMigratooor} from '@nftmigratooor/useNFTMigratooor'; import {useUpdateEffect} from '@react-hookz/web'; -import {erc721ABI, multicall} from '@wagmi/core'; +import {multicall} from '@wagmi/core'; import type {ReactElement} from 'react'; import type {TApprovalStatus, TNFT, TWizardStatus} from 'utils/types/nftMigratooor'; -import type {ContractFunctionConfig, TransactionReceipt} from 'viem'; import type {TDict} from '@builtbymom/web3/types'; import type {BaseTransaction} from '@gnosis.pm/safe-apps-sdk'; @@ -88,18 +88,18 @@ function ViewApprovalWizard(): ReactElement { if (!address || !NFTMIGRATOOOR_CONTRACT_PER_CHAIN[safeChainID]) { return; } - const calls: ContractFunctionConfig[] = []; + const calls: any[] = []; Object.entries(groupedByCollection).forEach(([collectionAddress, collection]): void => { if (collection?.[0]?.collection?.type === 'ERC721') { calls.push({ address: toAddress(collectionAddress), - abi: erc721ABI, + abi: erc721Abi, functionName: 'isApprovedForAll', args: [address, NFTMIGRATOOOR_CONTRACT_PER_CHAIN[safeChainID]] }); } }); - const result = await multicall({ + const result = await multicall(retrieveConfig(), { chainId: safeChainID, contracts: calls as never[] }); diff --git a/components/apps/nftmigratooor/ApprovalWizardItem.tsx b/components/apps/nftmigratooor/ApprovalWizardItem.tsx index 47639f8..67b4f6b 100644 --- a/components/apps/nftmigratooor/ApprovalWizardItem.tsx +++ b/components/apps/nftmigratooor/ApprovalWizardItem.tsx @@ -4,8 +4,9 @@ import {IconCircleCheck} from 'components/icons/IconCircleCheck'; import {IconCircleCross} from 'components/icons/IconCircleCross'; import {IconSpinner} from 'components/icons/IconSpinner'; import {ETHEREUM_ENS_ADDRESS} from 'utils/constants'; -import {useNetwork} from 'wagmi'; +import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {toAddress, truncateHex} from '@builtbymom/web3/utils'; +import {getNetwork} from '@builtbymom/web3/utils/wagmi'; import {useNFTMigratooor} from '@nftmigratooor/useNFTMigratooor'; import type {ReactElement} from 'react'; @@ -23,8 +24,8 @@ function ApprovalWizardItem({ collectionApprovalStatus, index }: TApprovalWizardItemProps): ReactElement { + const {chainID} = useWeb3(); const {destinationAddress} = useNFTMigratooor(); - const {chain} = useNetwork(); const [firstItemInCollection] = collection; const hasMultipleItems = collection.length > 1; @@ -58,7 +59,7 @@ function ApprovalWizardItem({ if (collectionStatus?.receipt) { return ( {nft?.name || nft?.collection?.name}
e.stopPropagation()} @@ -130,7 +131,7 @@ const NFTAsset = memo(function NFTAsset(props: TNFTAssetProps): ReactElement { className={'hidden items-center space-x-4 md:flex'}>
; @@ -17,7 +16,7 @@ export type TMultiSafeConfiguration = { seed: bigint; threshold: number; owners: TOwners[]; - originalTx: FetchTransactionResult | undefined; + originalTx: any | undefined; settings: { shouldUseExpertMode: boolean; shouldUseTestnets: boolean; diff --git a/components/apps/stream/1.ViewStreamConfiguration.tsx b/components/apps/stream/1.ViewStreamConfiguration.tsx index 0a75443..d053c29 100644 --- a/components/apps/stream/1.ViewStreamConfiguration.tsx +++ b/components/apps/stream/1.ViewStreamConfiguration.tsx @@ -223,7 +223,6 @@ function TokenSelector(props: {onChangeTokenToReceiveValidity: (v: boolean | 'un symbol: wrappedToken.coinSymbol, decimals: wrappedToken.decimals, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN, logoURI: `${process.env.SMOL_ASSETS_URL}/token/${safeChainID}/${ETH_TOKEN_ADDRESS}/logo-32.png` }; diff --git a/components/apps/stream/2.ViewStreamSummary.tsx b/components/apps/stream/2.ViewStreamSummary.tsx index 1dbcf5e..7974e89 100644 --- a/components/apps/stream/2.ViewStreamSummary.tsx +++ b/components/apps/stream/2.ViewStreamSummary.tsx @@ -1,7 +1,8 @@ import React, {Fragment, useCallback, useMemo, useState} from 'react'; import {Button} from 'components/Primitives/Button'; import {differenceInDays, differenceInMonths, differenceInSeconds, getUnixTime, isAfter, isBefore} from 'date-fns'; -import {erc20ABI, useContractRead} from 'wagmi'; +import {erc20Abi} from 'viem'; +import {useReadContract} from 'wagmi'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; import {formatAmount, toAddress, toBigInt} from '@builtbymom/web3/utils'; @@ -26,9 +27,9 @@ function Buttons(): ReactElement { const [txStatusAllowance, set_txStatusAllowance] = useState(defaultTxStatus); const [isSuccessModalOpen, set_isSuccessModalOpen] = useState(false); - const {data: allowance, refetch} = useContractRead({ + const {data: allowance, refetch} = useReadContract({ address: toAddress(configuration.tokenToSend?.address), - abi: erc20ABI, + abi: erc20Abi, chainId: chainID, functionName: 'allowance', args: [toAddress(address), toAddress(getDefaultVestingContract(chainID))] diff --git a/components/apps/stream/VestingElement.tsx b/components/apps/stream/VestingElement.tsx index 9c8d198..aa3429f 100644 --- a/components/apps/stream/VestingElement.tsx +++ b/components/apps/stream/VestingElement.tsx @@ -1,7 +1,8 @@ import React, {Fragment, useCallback, useMemo, useState} from 'react'; import {Button} from 'components/Primitives/Button'; import {addSeconds, differenceInSeconds, format} from 'date-fns'; -import {erc20ABI, useContractReads} from 'wagmi'; +import {erc20Abi} from 'viem'; +import {useReadContracts} from 'wagmi'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {useTokenList} from '@builtbymom/web3/contexts/WithTokenList'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; @@ -69,17 +70,17 @@ export function VestingElement({vesting}: {vesting: TStreamArgs}): ReactElement const {chainID} = useChainID(); const {getToken} = useTokenList(); const [txStatus, set_txStatus] = useState(defaultTxStatus); - const {data, refetch, isFetchedAfterMount} = useContractReads({ + const {data, refetch, isFetchedAfterMount} = useReadContracts({ contracts: [ { address: toAddress(vesting.token), - abi: erc20ABI, + abi: erc20Abi, chainId: vesting.chainID, functionName: 'symbol' }, { address: toAddress(vesting.token), - abi: erc20ABI, + abi: erc20Abi, chainId: vesting.chainID, functionName: 'decimals' }, @@ -90,8 +91,14 @@ export function VestingElement({vesting}: {vesting: TStreamArgs}): ReactElement functionName: 'total_claimed' } ], - select(data) { - return [data?.[0]?.result || '', Number(toBigInt(data?.[1]?.result || 18)), toBigInt(data?.[2]?.result)]; + query: { + select(data) { + return [ + data?.[0]?.result || '', + Number(toBigInt(data?.[1]?.result || 18)), + toBigInt(data?.[2]?.result) + ]; + } } }); const [symbol, decimals, totalClaimed] = (data || ['', 18, 0n]) as [string, number, bigint]; diff --git a/components/common/ConfirmationModal.tsx b/components/common/ConfirmationModal.tsx index d2ef203..0f5ad02 100644 --- a/components/common/ConfirmationModal.tsx +++ b/components/common/ConfirmationModal.tsx @@ -3,6 +3,7 @@ import Confetti from 'react-dom-confetti'; import {Button} from 'components/Primitives/Button'; import {cl} from '@builtbymom/web3/utils'; import {Dialog, Transition} from '@headlessui/react'; +import {IconCheck} from '@icons/IconCheck'; import {useUpdateEffect} from '@react-hookz/web'; import type {ReactElement} from 'react'; @@ -13,6 +14,7 @@ type TSuccessModal = { title: string; content: string; ctaLabel: string; + downloadConfigButton?: JSX.Element; }; function SuccessModal(props: TSuccessModal): ReactElement { const [shouldTriggerConfettis, set_shouldTriggerConfettis] = useState(false); @@ -62,9 +64,12 @@ function SuccessModal(props: TSuccessModal): ReactElement { leaveTo={'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95'}> +
+ +
-
+
+ {props.downloadConfigButton} diff --git a/components/common/ErrorModal.tsx b/components/common/ErrorModal.tsx new file mode 100644 index 0000000..de38d10 --- /dev/null +++ b/components/common/ErrorModal.tsx @@ -0,0 +1,87 @@ +import {Fragment} from 'react'; +import {Button} from 'components/Primitives/Button'; +import {cl} from '@builtbymom/web3/utils'; +import {Dialog, Transition} from '@headlessui/react'; +import {IconErrorTriangle} from '@icons/IconErrorTriangle'; + +import type {ReactElement} from 'react'; + +type TErrorModal = { + isOpen: boolean; + onClose: VoidFunction; + title: string; + content: string; + ctaLabel: string; + type?: 'hard' | 'soft'; +}; + +export function ErrorModal({isOpen, onClose, title, content, ctaLabel, type = 'hard'}: TErrorModal): ReactElement { + return ( + + + +
+ + +
+
+ + +
+ +
+ +
+
+ + {title} + +
+

{content}

+
+
+
+
+ +
+
+
+
+
+
+
+ ); +} diff --git a/components/common/LinkOrDiv.tsx b/components/common/LinkOrDiv.tsx new file mode 100644 index 0000000..5e197cd --- /dev/null +++ b/components/common/LinkOrDiv.tsx @@ -0,0 +1,33 @@ +import Link from 'next/link'; + +import type {ReactElement, ReactNode} from 'react'; + +type TProps = { + href: string; + isDisabled?: boolean; + children?: ReactNode; + passHref?: boolean; + className?: string; +}; + +export function LinkOrDiv({href, isDisabled, children, passHref, ...rest}: TProps): ReactElement { + if (isDisabled) { + return ( + + ); + } + + return ( + + {children} + + ); +} diff --git a/components/common/Primitives/Warning.tsx b/components/common/Primitives/Warning.tsx index 079d536..20fb3df 100644 --- a/components/common/Primitives/Warning.tsx +++ b/components/common/Primitives/Warning.tsx @@ -1,17 +1,19 @@ import {cl} from '@builtbymom/web3/utils'; -import type {ReactElement} from 'react'; +import type {ReactElement, ReactNode} from 'react'; export type TWarningType = 'error' | 'warning' | 'info'; export function Warning({ message, type, - shopType = false + statusIcon, + title }: { - message: string | ReactElement; + message: string | ReactNode; type: TWarningType; - shopType?: boolean; + statusIcon?: ReactElement; + title?: string; }): ReactElement { const getWarningColors = (): string => { if (type === 'error') { @@ -20,13 +22,16 @@ export function Warning({ if (type === 'warning') { return 'border-[#FF9900] text-[#FF9900] bg-[#FFF3D3]'; } - return 'border-neutral-600 text-neutral-700 bg-neutral-300'; + return 'border-neutral-600 text-neutral-700 bg-neutral-100'; }; return ( -
- {shopType && {type}} -

{message}

+
+ {title && {title}} +
+ {statusIcon &&
{statusIcon}
} + {message &&
{message}
} +
); } diff --git a/components/common/TokenList/TokenListAddBox.tsx b/components/common/TokenList/TokenListAddBox.tsx index 9c92055..e925f9d 100644 --- a/components/common/TokenList/TokenListAddBox.tsx +++ b/components/common/TokenList/TokenListAddBox.tsx @@ -1,12 +1,14 @@ import React, {useCallback, useMemo, useRef, useState} from 'react'; import {Button} from 'components/Primitives/Button'; +import {erc20Abi} from 'viem'; import axios from 'axios'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; import {decodeAsBigInt, decodeAsNumber, decodeAsString, zeroNormalizedBN} from '@builtbymom/web3/utils'; +import {retrieveConfig} from '@builtbymom/web3/utils/wagmi'; import {IconCircleCheck} from '@icons/IconCircleCheck'; import {IconCircleCross} from '@icons/IconCircleCross'; import {defaultInputAddressLike} from '@utils/tools.address'; -import {erc20ABI, readContracts} from '@wagmi/core'; +import {readContracts} from '@wagmi/core'; import {IconLoader} from '@yearn-finance/web-lib/icons/IconLoader'; import AddressInput from '@common/AddressInput'; @@ -106,11 +108,11 @@ function TokenListAddBox({onAddTokenList, onAddToken}: TTokenListAddBox): React. e.preventDefault(); if (extraToken.isValid === true && extraToken.address) { set_isLoadingTokenAddress(true); - const [name, symbol, decimals] = await readContracts({ + const [name, symbol, decimals] = await readContracts(retrieveConfig(), { contracts: [ - {abi: erc20ABI, address: extraToken.address, functionName: 'name'}, - {abi: erc20ABI, address: extraToken.address, functionName: 'symbol'}, - {abi: erc20ABI, address: extraToken.address, functionName: 'decimals'} + {abi: erc20Abi, address: extraToken.address, functionName: 'name'}, + {abi: erc20Abi, address: extraToken.address, functionName: 'symbol'}, + {abi: erc20Abi, address: extraToken.address, functionName: 'decimals'} ] }); onAddToken({ @@ -121,7 +123,6 @@ function TokenListAddBox({onAddTokenList, onAddToken}: TTokenListAddBox): React. decimals: Number(decodeAsBigInt(decimals)) || decodeAsNumber(decimals), logoURI: `${process.env.SMOL_ASSETS_URL}/token/${safeChainID}/${extraToken.address}/logo-32.png`, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN }); set_extraToken(defaultInputAddressLike); diff --git a/components/designSystem/AddressBookEntry.tsx b/components/designSystem/AddressBookEntry.tsx index 37063be..c835b16 100644 --- a/components/designSystem/AddressBookEntry.tsx +++ b/components/designSystem/AddressBookEntry.tsx @@ -56,7 +56,7 @@ export function AddressBookEntryAddress(props: { if (!isMounted || props.isConnecting) { return ( -
+
@@ -113,7 +113,9 @@ export function AddressBookEntry(props: { const {data: avatar, isLoading: isLoadingAvatar} = useEnsAvatar({ chainId: 1, name: ensName || props.entry.ens, - enabled: Boolean(ensName || props.entry.ens) + query: { + enabled: Boolean(ensName || props.entry.ens) + } }); useEffect((): void => { diff --git a/components/designSystem/Avatar.tsx b/components/designSystem/Avatar.tsx index 1e013d0..066dde0 100644 --- a/components/designSystem/Avatar.tsx +++ b/components/designSystem/Avatar.tsx @@ -101,8 +101,10 @@ export function AvatarWrapper(props: {address: TAddress; sizeClassname?: string} isError: isErrorAvatar } = useEnsAvatar({ chainId: 1, - name: ensName, - enabled: Boolean(ensName) + name: ensName || undefined, + query: { + enabled: Boolean(ensName) + } }); const hasENS = isFetchedENS || isErrorENS; const hasAvatar = isFetchedAvatar || isErrorAvatar; diff --git a/components/designSystem/Curtains/AddressBookCurtain.tsx b/components/designSystem/Curtains/AddressBookCurtain.tsx index 6a3af7e..a53a0db 100644 --- a/components/designSystem/Curtains/AddressBookCurtain.tsx +++ b/components/designSystem/Curtains/AddressBookCurtain.tsx @@ -2,6 +2,7 @@ import React, {useCallback, useEffect, useRef, useState} from 'react'; import {useRouter} from 'next/router'; +import {usePlausible} from 'next-plausible'; import {CloseCurtainButton} from 'components/designSystem/Curtains/InfoCurtain'; import {Button} from 'components/Primitives/Button'; import {CurtainContent} from 'components/Primitives/Curtain'; @@ -19,7 +20,7 @@ import {AvatarWrapper} from '../Avatar'; import {NetworkDropdownSelector} from '../NetworkSelector/Dropdown'; import {SmolAddressInputSimple} from '../SmolAddressInput.simple'; -import type {TAddressBookEntryReducer} from 'pages/apps/address-book'; +import type {TAddressBookEntryReducer} from 'contexts/useAddressBookCurtain'; import type {Dispatch, ReactElement, SetStateAction} from 'react'; import type {TInputAddressLike} from '@utils/tools.address'; @@ -122,7 +123,7 @@ function NameInput(props: { useEffect(() => { const entry = getCachedEntry({label: selectedEntry.label}); const currentCustomValidity = inputRef.current?.validationMessage; - if (entry !== undefined && entry.id !== selectedEntry.id) { + if (entry !== undefined && entry.id !== selectedEntry.id && !entry.isHidden) { inputRef.current?.setCustomValidity('This name is already used in your address book'); props.onRefresh?.(); } else if (currentCustomValidity !== '') { @@ -220,7 +221,7 @@ function AddressInput(props: { const entry = getCachedEntry({address: props.addressLike.address}); const currentCustomValidity = inputRef.current?.validationMessage; - if (entry !== undefined && entry.id !== props.selectedEntry.id) { + if (entry !== undefined && entry.id !== props.selectedEntry.id && !entry.isHidden) { inputRef.current?.setCustomValidity('This address is already in your address book'); onChange(); } else if (currentCustomValidity !== '') { @@ -286,7 +287,7 @@ export function AddressBookCurtain(props: { onOpenChange: (props: {isOpen: boolean; isEditing: boolean}) => void; }): ReactElement { const router = useRouter(); - const {updateEntry} = useAddressBook(); + const {updateEntry, listCachedEntries} = useAddressBook(); const formRef = useRef(null); const [currentEntry, set_currentEntry] = useState(props.selectedEntry); const [, set_nonce] = useState(0); @@ -302,6 +303,8 @@ export function AddressBookCurtain(props: { source: 'defaultValue' }); + const plausible = usePlausible(); + const onIncrementNonce = useCallback(() => set_nonce(n => n + 1), []); const onFormSubmit = useCallback( @@ -316,16 +319,19 @@ export function AddressBookCurtain(props: { }); } if (props.selectedEntry.id === undefined) { - updateEntry({...currentEntry, address: addressLike.address}); + updateEntry({...currentEntry, address: addressLike.address, isHidden: false}); props.onOpenChange({isOpen: false, isEditing: false}); + if (listCachedEntries().length === 0) { + plausible('add 1st ab contact'); + } } else { - updateEntry({...currentEntry, address: addressLike.address}); + updateEntry({...currentEntry, address: addressLike.address, isHidden: false}); set_isEditMode(false); props.onOpenChange({isOpen: true, isEditing: false}); } return; }, - [isEditMode, props, addressLike.address, router, updateEntry, currentEntry] + [isEditMode, props, addressLike.address, router, updateEntry, currentEntry, listCachedEntries, plausible] ); const onResetAddressLike = useAsyncTrigger(async () => { @@ -343,6 +349,8 @@ export function AddressBookCurtain(props: { useEffect(() => set_currentEntry(props.selectedEntry), [props.selectedEntry]); useEffect(() => set_isEditMode(props.isEditing), [props.isEditing]); + + // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => set_currentEntry({...currentEntry, label: props.initialLabel ?? ''}), [props.initialLabel]); return ( diff --git a/components/designSystem/Curtains/InfoCurtain.tsx b/components/designSystem/Curtains/InfoCurtain.tsx index 0496c48..7490661 100644 --- a/components/designSystem/Curtains/InfoCurtain.tsx +++ b/components/designSystem/Curtains/InfoCurtain.tsx @@ -1,10 +1,20 @@ import {Fragment, type ReactElement} from 'react'; +import {useRouter} from 'next/router'; +import {usePlausible} from 'next-plausible'; import {CurtainContent} from 'components/Primitives/Curtain'; import {useIsMounted} from 'hooks/useIsMounted'; import {IconCross} from '@icons/IconCross'; import * as Dialog from '@radix-ui/react-dialog'; +import {useMountEffect} from '@react-hookz/web'; export function CloseCurtainButton(): ReactElement { + const plausible = usePlausible(); + const {route} = useRouter(); + + useMountEffect(() => { + plausible('open info curtain', {props: {page: route}}); + }); + return ( diff --git a/components/designSystem/Layout.tsx b/components/designSystem/Layout.tsx index 72b9dcb..c4640a2 100644 --- a/components/designSystem/Layout.tsx +++ b/components/designSystem/Layout.tsx @@ -1,5 +1,6 @@ import {type ReactElement, type ReactNode} from 'react'; import {WithAddressBook} from 'contexts/useAddressBook'; +import {WithAddressBookCurtain} from 'contexts/useAddressBookCurtain'; import {AnimatePresence, motion} from 'framer-motion'; import {cl} from '@builtbymom/web3/utils'; import {IconQuestionMark} from '@icons/IconQuestionMark'; @@ -7,6 +8,7 @@ import {appWrapperVariants} from '@utils/animations'; import {SideMenu} from './SideMenu'; import {InfoCurtain} from './Curtains/InfoCurtain'; +import {SideMenuMobile} from './SideMenu/SideMenuMobile'; import type {NextComponentType} from 'next'; import type {AppProps} from 'next/app'; @@ -69,11 +71,15 @@ export default function Layout(props: AppProps): ReactElement { initial={{scale: 0.9, opacity: 0}} animate={{scale: 1, opacity: 1}} transition={{duration: 0.6, ease: 'easeInOut'}} - className={'sticky top-10 z-20 col-sidebar flex h-app flex-col rounded-lg bg-neutral-0'}> + className={'sticky top-10 z-20 col-sidebar hidden h-app flex-col rounded-lg bg-neutral-0 md:flex'}> -
+
+ +
+ +
- - - {getLayout(, router)} - - + + + + {getLayout(, router)} + + + diff --git a/components/designSystem/NetworkSelector/Dropdown.tsx b/components/designSystem/NetworkSelector/Dropdown.tsx index 91631bb..2f9887f 100644 --- a/components/designSystem/NetworkSelector/Dropdown.tsx +++ b/components/designSystem/NetworkSelector/Dropdown.tsx @@ -79,13 +79,20 @@ export function NetworkDropdownSelector( Object.values(selectedNetworks).every(Boolean) && Object.keys(selectedNetworks).length === supportedNetworks.length; + const onOpenChange = (isOpen: boolean): void => { + if (!isOpen) { + props.onChange( + Object.keys(selectedNetworks) + .filter(chainId => { + return selectedNetworks[+chainId]; + }) + .map(Number) + ); + } + }; + return ( - { - if (!isOpen) { - props.onChange(Object.keys(selectedNetworks).map(Number)); - } - }}> + @@ -120,9 +127,7 @@ export function NetworkDropdownSelector( - set_selectedNetworks(prev => ({...prev, [network.id]: !prev[network.id]})) - }> + onCheckedChange={checked => set_selectedNetworks(prev => ({...prev, [network.id]: checked}))}> {network.name} ))} diff --git a/components/designSystem/NetworkSelector/Popover.tsx b/components/designSystem/NetworkSelector/Popover.tsx index cf3c83c..c9dddda 100644 --- a/components/designSystem/NetworkSelector/Popover.tsx +++ b/components/designSystem/NetworkSelector/Popover.tsx @@ -1,46 +1,24 @@ import {type ReactElement, useMemo, useState} from 'react'; -import {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem} from 'components/Primitives/Commands'; -import {useConnect, usePublicClient} from 'wagmi'; +import {CommandList} from 'cmdk'; +import {Command, CommandEmpty, CommandInput, CommandItem} from 'components/Primitives/Commands'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {toSafeChainID} from '@builtbymom/web3/hooks/useChainID'; import {cl} from '@builtbymom/web3/utils'; import {IconChevron} from '@icons/IconChevron'; import * as Popover from '@radix-ui/react-popover'; import {useIsMounted} from '@react-hookz/web'; -import {supportedTestNetworks} from '@utils/tools.chains'; +import {supportedNetworks} from '@utils/tools.chains'; import {ImageWithFallback} from '@common/ImageWithFallback'; export function NetworkPopoverSelector(): ReactElement { const isMounted = useIsMounted(); - const {onSwitchChain} = useWeb3(); - const publicClient = usePublicClient(); - const {connectors} = useConnect(); - const safeChainID = toSafeChainID(publicClient?.chain.id, Number(process.env.BASE_CHAINID)); - type TNetwork = {value: number; label: string}; - - const supportedNetworks = useMemo((): TNetwork[] => { - const injectedConnector = connectors.find((e): boolean => e.id.toLocaleLowerCase() === 'injected'); - if (injectedConnector) { - const chainsForInjected = injectedConnector.chains; - const testnet = supportedTestNetworks; - - return chainsForInjected - .filter(({id}): boolean => { - if (testnet.find((network): boolean => network.id === id)) { - return false; - } - return true; - }) - .map((network): TNetwork => ({value: network.id, label: network.name})); - } - return supportedNetworks.map((network): TNetwork => network); - }, [connectors]); + const {onSwitchChain, chainID} = useWeb3(); + const safeChainID = toSafeChainID(chainID, Number(process.env.BASE_CHAINID)); const currentNetwork = useMemo( - (): TNetwork | undefined => supportedNetworks.find((network): boolean => network.value === safeChainID), - [safeChainID, supportedNetworks] + () => supportedNetworks.find((network): boolean => network.id === safeChainID), + [safeChainID] ); - const [isOpen, set_isOpen] = useState(false); return ( -

- {isMounted() && currentNetwork?.label ? currentNetwork?.label : 'Select chain...'} -

- +
+ {isMounted() && currentNetwork?.name ? ( +
+ +

{currentNetwork?.name}

+
+ ) : ( +

{'Select chain'}

+ )} +
+ +
+
@@ -73,40 +65,40 @@ export function NetworkPopoverSelector(): ReactElement { {'No chain found.'} - + {supportedNetworks.map(network => ( { - if (selectedNetwork === currentNetwork?.label) { + if (selectedNetwork === currentNetwork?.name) { return; } const chain = supportedNetworks.find( - network => network.label.toLowerCase() === selectedNetwork + network => network.name.toLowerCase() === selectedNetwork.toLocaleLowerCase() ); - onSwitchChain(chain?.value || 1); + onSwitchChain(chain?.id || 1); set_isOpen(false); }}> - {network.label} + {network.name} ))} - +
diff --git a/components/designSystem/SideMenu/SideMenuMobile/index.tsx b/components/designSystem/SideMenu/SideMenuMobile/index.tsx new file mode 100644 index 0000000..6472d8a --- /dev/null +++ b/components/designSystem/SideMenu/SideMenuMobile/index.tsx @@ -0,0 +1,98 @@ +import {Fragment, useState} from 'react'; +import {NetworkPopoverSelector} from 'components/designSystem/NetworkSelector/Popover'; +import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; +import {cl, isAddress} from '@builtbymom/web3/utils'; +import {Dialog, Transition} from '@headlessui/react'; +import {IconHamburger} from '@icons/IconHamburger'; +import {ConnectButton} from '@rainbow-me/rainbowkit'; +import {useIsMounted} from '@react-hookz/web'; + +import {SideMenuNav} from '../SideMenuNav'; +import {CoinBalance} from '../SideMenuProfile/CoinBalance'; +import {ProfileBox} from '../SideMenuProfile/ProfileBox'; +import {SkeletonPlaceholder} from '../SideMenuProfile/SkeletonPlaceholder'; + +import type {ReactElement} from 'react'; + +export function SideMenuMobile(): ReactElement { + const [isOpen, set_isOpen] = useState(false); + const isMounted = useIsMounted(); + const {address} = useWeb3(); + + if (!isMounted()) { + return ( +
+ +
+ ); + } + if (!isAddress(address)) { + return ; + } + + return ( + <> +
+
+ + +
+
+
+ {'Chain'} + +
+
+ +
+
+
+ + set_isOpen(!isOpen)}> + +
+ + +
+
+ + + + + +
+
+
+
+ + ); +} diff --git a/components/designSystem/SideMenu/SideMenuNav/index.tsx b/components/designSystem/SideMenu/SideMenuNav/index.tsx index ba74c21..c697333 100644 --- a/components/designSystem/SideMenu/SideMenuNav/index.tsx +++ b/components/designSystem/SideMenu/SideMenuNav/index.tsx @@ -3,47 +3,61 @@ import Link from 'next/link'; import {usePathname} from 'next/navigation'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {cl, isZeroAddress} from '@builtbymom/web3/utils'; -import { - IconAppAddressBook, - IconAppDisperse, - IconAppEarn, - IconAppMigrate, - IconAppSend, - IconAppSwap -} from '@icons/IconApps'; +import {IconAppAddressBook, IconAppDisperse, IconAppEarn, IconAppSend, IconAppStream} from '@icons/IconApps'; +import {IconWallet} from '@icons/IconWallet'; import {useIsMounted} from '@react-hookz/web'; +import {LinkOrDiv} from '@common/LinkOrDiv'; type TNavItemProps = { label: string; href: string; icon: ReactElement; isSelected: boolean; + isDisabled?: boolean; }; -function NavItem(props: TNavItemProps): ReactElement { +function NavItem({label, href, icon, isSelected, isDisabled = false}: TNavItemProps): ReactElement { return (
  • - +
    - {cloneElement(props.icon, { - className: cl( - 'h-4 w-4', - props.isSelected ? 'text-neutral-900' : 'text-neutral-600 group-hover:text-neutral-900' - ) - })} -

    - {props.label} -

    +
    + {cloneElement(icon, { + className: cl( + 'h-4 w-4', + isSelected + ? 'text-neutral-900 text-neutral-600' + : isDisabled + ? 'text-neutral-400' + : 'group-hover:text-neutral-900' + ) + })} +

    + {label} +

    +
    + {isDisabled && ( + + {'Soon'} + + )}
    - +
  • ); } @@ -56,13 +70,11 @@ function LogOutButton(): ReactElement { } return ( -
    - -
    + ); } @@ -85,23 +97,19 @@ export function SideMenuNav(): ReactElement { label={'Disperse'} icon={} /> - } - /> - } - /> } + isDisabled + /> + } + isDisabled /> } /> + } + /> - - +
    +
    + + {'GitHub'} + + + {'Twitter'} + +
    + +
    ); diff --git a/components/designSystem/SideMenu/SideMenuProfile/SkeletonPlaceholder.tsx b/components/designSystem/SideMenu/SideMenuProfile/SkeletonPlaceholder.tsx index f7e9b91..87ebcc7 100644 --- a/components/designSystem/SideMenu/SideMenuProfile/SkeletonPlaceholder.tsx +++ b/components/designSystem/SideMenu/SideMenuProfile/SkeletonPlaceholder.tsx @@ -21,14 +21,14 @@ export function SkeletonPlaceholder(): ReactElement {
    -
    -
    +
    +
    {'Chain'}
    -
    +
    {'Coin'} -
    +
    diff --git a/components/designSystem/SideMenu/SideMenuProfile/index.tsx b/components/designSystem/SideMenu/SideMenuProfile/index.tsx index 47f1031..01d78b4 100644 --- a/components/designSystem/SideMenu/SideMenuProfile/index.tsx +++ b/components/designSystem/SideMenu/SideMenuProfile/index.tsx @@ -27,12 +27,14 @@ export function SideMenuProfile(): ReactElement {
    -
    -
    +
    +
    {'Chain'}
    - +
    + +
    ); diff --git a/components/designSystem/SmolAddressInput.simple.tsx b/components/designSystem/SmolAddressInput.simple.tsx index 836d2b9..b265e17 100644 --- a/components/designSystem/SmolAddressInput.simple.tsx +++ b/components/designSystem/SmolAddressInput.simple.tsx @@ -1,12 +1,12 @@ import React, {useCallback, useRef, useState} from 'react'; -import {getEnsName} from 'viem/ens'; import {cl, isAddress, toAddress, truncateHex} from '@builtbymom/web3/utils'; +import {retrieveConfig} from '@builtbymom/web3/utils/wagmi'; import {IconCircleCheck} from '@icons/IconCircleCheck'; import {IconCircleCross} from '@icons/IconCircleCross'; import {useAsyncAbortable, useUpdateEffect} from '@react-hookz/web'; import {defaultInputAddressLike} from '@utils/tools.address'; import {checkENSValidity} from '@utils/tools.ens'; -import {getPublicClient} from '@wagmi/core'; +import {getEnsName} from '@wagmi/core'; import {IconLoader} from '@yearn-finance/web-lib/icons/IconLoader'; import type {InputHTMLAttributes, ReactElement, RefObject} from 'react'; @@ -97,8 +97,7 @@ export function SmolAddressInputSimple( } set_isCheckingValidity(true); onChange({address: toAddress(input), label: input, isValid: true, source: 'typed'}); - const client = getPublicClient({chainId: 1}); - const ensName = await getEnsName(client, {address: toAddress(input)}); + const ensName = await getEnsName(retrieveConfig(), {address: toAddress(input)}); if (signal.aborted) { reject(new Error('Aborted!')); } @@ -136,7 +135,7 @@ export function SmolAddressInputSimple( actions.abort(); actions.execute(label); }, - [actions] + [actions, inputRef] ); const getInputValue = useCallback((): string | undefined => { diff --git a/components/designSystem/SmolAddressInput.tsx b/components/designSystem/SmolAddressInput.tsx index 7ecda1f..be490d7 100644 --- a/components/designSystem/SmolAddressInput.tsx +++ b/components/designSystem/SmolAddressInput.tsx @@ -1,7 +1,7 @@ -import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import React, {useCallback, useEffect, useRef, useState} from 'react'; import {useAddressBook} from 'contexts/useAddressBook'; -import {getEnsName} from 'viem/ens'; import {cl, isAddress, toAddress, truncateHex} from '@builtbymom/web3/utils'; +import {retrieveConfig} from '@builtbymom/web3/utils/wagmi'; import {IconAppAddressBook} from '@icons/IconApps'; import {IconChevron} from '@icons/IconChevron'; import {IconCircleCheck} from '@icons/IconCircleCheck'; @@ -9,199 +9,151 @@ import {IconCircleCross} from '@icons/IconCircleCross'; import {useAsyncAbortable} from '@react-hookz/web'; import {defaultInputAddressLike} from '@utils/tools.address'; import {checkENSValidity} from '@utils/tools.ens'; -import {getPublicClient} from '@wagmi/core'; +import {getEnsName} from '@wagmi/core'; import {IconLoader} from '@yearn-finance/web-lib/icons/IconLoader'; import {AvatarWrapper} from './Avatar'; -import type {TAddressBookEntry} from 'contexts/useAddressBook'; import type {ReactElement} from 'react'; -import type {TAddress} from '@builtbymom/web3/types'; import type {TInputAddressLike} from '@utils/tools.address'; type TAddressInput = { - onSetValue: (value: TInputAddressLike) => void; + onSetValue: (value: Partial) => void; value: TInputAddressLike; - initialStateFromUrl?: string | undefined; }; -export function SmolAddressInput({onSetValue, value, initialStateFromUrl}: TAddressInput): ReactElement { - const {onOpenCurtain, getEntry, getCachedEntry} = useAddressBook(); - - const [isFocused, set_isFocused] = useState(false); +// TODO: add debounce +export function useValidateAddressInput(): { + validate: (signal: AbortSignal | undefined, input: string) => Promise; + isCheckingValidity: boolean; +} { + const {getEntry} = useAddressBook(); const [isCheckingValidity, set_isCheckingValidity] = useState(false); - const currentAddress = useRef(defaultInputAddressLike.address); - const currentLabel = useRef(defaultInputAddressLike.label); - const currentInput = useRef(defaultInputAddressLike.label); - const inputRef = useRef(null); - const addressBookEntry = useMemo( - (): TAddressBookEntry | undefined => getCachedEntry({address: toAddress(value.address), label: value.label}), - [getCachedEntry, value] - ); - - const [, actions] = useAsyncAbortable( - async (signal, input: string): Promise => - new Promise(async (resolve, reject): Promise => { - if (signal.aborted) { - reject(new Error('Aborted!')); - } else { - currentLabel.current = input; - currentAddress.current = undefined; - - if (input === '') { - onSetValue(defaultInputAddressLike); - return resolve(); - } + const validate = async (signal: AbortSignal | undefined, input: string): Promise => { + if (input === '') { + return defaultInputAddressLike; + } - /********************************************************** - ** Check if the input is an address from the address book - **********************************************************/ - const fromAddressBook = await getEntry({label: input, address: toAddress(input)}); - if (fromAddressBook) { - currentAddress.current = toAddress(fromAddressBook.address); - if (signal.aborted) { - reject(new Error('Aborted!')); - } - currentLabel.current = fromAddressBook.label || fromAddressBook.ens || input; - onSetValue({ - address: toAddress(fromAddressBook.address), - label: fromAddressBook.label, - isValid: true, - source: 'addressBook' - }); - return resolve(); - } + /********************************************************** + ** Check if the input is an address from the address book + **********************************************************/ + const fromAddressBook = await getEntry({label: input, address: toAddress(input)}); + if (fromAddressBook && !fromAddressBook.isHidden) { + if (signal?.aborted) { + console.log('aborted'); + throw new Error('Aborted!'); + } - /********************************************************** - ** Check if the input is an ENS name - **********************************************************/ - if (input.endsWith('.eth') && input.length > 4) { - set_isCheckingValidity(true); - onSetValue({address: undefined, label: input, isValid: 'undetermined', source: 'typed'}); - const [address, isValid] = await checkENSValidity(input); - if (signal.aborted) { - reject(new Error('Aborted!')); - } - if (currentLabel.current === input && isAddress(address)) { - set_isCheckingValidity(false); - const fromAddressBook = await getEntry({label: input, address: toAddress(address)}); - if (fromAddressBook) { - currentLabel.current = fromAddressBook.label || fromAddressBook.ens || input; - onSetValue({ - address: toAddress(fromAddressBook.address), - label: fromAddressBook.label || fromAddressBook.ens || input, - isValid: true, - source: 'addressBook' - }); - return resolve(); - } + return { + address: toAddress(fromAddressBook.address), + label: fromAddressBook.label, + isValid: true, + error: undefined, + source: 'addressBook' + }; + } - currentAddress.current = address; - currentLabel.current = input; - onSetValue({address, label: input, isValid, source: 'typed'}); - } else { - set_isCheckingValidity(false); - onSetValue({ - address: undefined, - label: input, - isValid: false, - error: 'This ENS name looks invalid', - source: 'typed' - }); - } - return resolve(); - } + /********************************************************** + ** Check if the input is an ENS name + **********************************************************/ + if (input.endsWith('.eth') && input.length > 4) { + set_isCheckingValidity(true); + // onSetValue({address: undefined, label: input, isValid: 'undetermined', source: 'typed'}); + const [address, isValid] = await checkENSValidity(input); + if (signal?.aborted) { + console.log('aborted'); + throw new Error('Aborted!'); + } + if (isAddress(address)) { + set_isCheckingValidity(false); + const fromAddressBook = await getEntry({label: input, address: toAddress(address)}); + if (fromAddressBook && !fromAddressBook.isHidden) { + return { + address: toAddress(fromAddressBook.address), + label: fromAddressBook.label || fromAddressBook.ens || input, + isValid: true, + error: undefined, + source: 'addressBook' + }; + } - /********************************************************** - ** Check if the input is an address - **********************************************************/ - if (isAddress(input)) { - currentAddress.current = toAddress(input); - if (signal.aborted) { - reject(new Error('Aborted!')); - } - set_isCheckingValidity(true); - onSetValue({address: toAddress(input), label: input, isValid: true, source: 'typed'}); - const client = getPublicClient({chainId: 1}); - const ensName = await getEnsName(client, {address: toAddress(input)}); - if (signal.aborted) { - reject(new Error('Aborted!')); - } - currentLabel.current = ensName || input; - set_isCheckingValidity(false); - onSetValue({ - address: toAddress(input), - label: ensName || input, - isValid: true, - source: 'typed' - }); - return resolve(); - } + return {address, label: input, error: undefined, isValid, source: 'typed'}; + } + set_isCheckingValidity(false); - currentAddress.current = undefined; - onSetValue({ - address: undefined, - label: input, - isValid: input.startsWith('0x') && input.length === 42 ? false : 'undetermined', - error: 'This address looks invalid', - source: 'typed' - }); - resolve(); - } - }), - undefined - ); + return { + address: undefined, + label: input, + isValid: false, + error: 'This ENS name looks invalid', + source: 'typed' + }; + } - const onChange = useCallback( - (label: string): void => { + /********************************************************** + ** Check if the input is an address + **********************************************************/ + if (isAddress(input)) { + if (signal?.aborted) { + console.log('aborted'); + throw new Error('Aborted!'); + } + set_isCheckingValidity(true); + const ensName = await getEnsName(retrieveConfig(), {address: toAddress(input)}); + if (signal?.aborted) { + throw new Error('Aborted!'); + } set_isCheckingValidity(false); - currentInput.current = label; - actions.abort(); - actions.execute(label); - }, - [actions] - ); - useEffect(() => { - if (!initialStateFromUrl) { - return; + return { + address: toAddress(input), + label: ensName || toAddress(input), + error: undefined, + isValid: true, + source: 'typed' + }; } - onChange(initialStateFromUrl); - }, [initialStateFromUrl, onChange]); - const onSelectItem = useCallback((item: TAddressBookEntry): void => { - currentInput.current = item.label || item.ens || toAddress(item.address); - currentLabel.current = item.label || item.ens || toAddress(item.address); - currentAddress.current = toAddress(item.address); - onSetValue({ - address: toAddress(item.address), - label: item.label || item.ens || toAddress(item.address), - isValid: true, - source: 'addressBook' - }); - }, []); + return { + address: undefined, + label: input, + isValid: input.startsWith('0x') && input.length === 42 ? false : 'undetermined', + error: 'This address looks invalid', + source: 'typed' + }; + }; + + return {isCheckingValidity, validate}; +} + +export function SmolAddressInput({onSetValue, value}: TAddressInput): ReactElement { + const {onOpenCurtain} = useAddressBook(); + + const [isFocused, set_isFocused] = useState(false); + + const inputRef = useRef(null); + + const {isCheckingValidity, validate} = useValidateAddressInput(); + const [{result}, actions] = useAsyncAbortable(validate, undefined); + + const onChange = (input: string): void => { + actions.abort(); + onSetValue({label: input}); + actions.execute(input); + }; const getInputValue = useCallback((): string | undefined => { if (isFocused) { - return currentInput.current; + return value.label; } - if (!isFocused) { - if (value.source === 'addressBook' && addressBookEntry?.label) { - return addressBookEntry.label; - } - if (isAddress(currentLabel.current) && addressBookEntry) { - return truncateHex(currentLabel.current, 5); - } - if (isAddress(currentLabel.current)) { - return truncateHex(currentLabel.current, 5); - } - if (!isAddress(currentLabel.current)) { - return currentLabel.current; - } + + if (isAddress(value.label)) { + return truncateHex(value.label, 5); } - return undefined; - }, [addressBookEntry, isFocused, value.source, currentInput, currentLabel]); + + return value.label; + }, [isFocused, value.label]); const getBorderColor = useCallback((): string => { if (isFocused) { @@ -213,8 +165,16 @@ export function SmolAddressInput({onSetValue, value, initialStateFromUrl}: TAddr return 'border-neutral-400'; }, [isFocused, value.isValid]); + useEffect(() => { + if (!result) { + return; + } + onSetValue(result); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [result]); + const getHasStatusIcon = useCallback((): boolean => { - if (!currentInput.current) { + if (!value.label) { return false; } if (!isFocused) { @@ -224,10 +184,10 @@ export function SmolAddressInput({onSetValue, value, initialStateFromUrl}: TAddr return true; } return false; - }, [isFocused, value.isValid, isCheckingValidity]); + }, [value.label, value.isValid, isFocused, isCheckingValidity]); return ( -
    +
    + ); + } + if (value.error) { + return

    {value.error}

    ; + } + + return

    {formatCounterValue(value.normalizedBigAmount.normalized, price?.normalized ?? 0)}

    ; + }; + + /** Set the validation result to the context */ + useDeepCompareEffect(() => { + if (!result) { + return; + } + onSetValue(result); + }, [result]); + + /** Validate the field when token changes. Only filled inputs should be validated */ + useUpdateEffect(() => { + if (!value.amount) { + return; + } + validate(value.amount, token); + }, [token?.address]); + + return ( + <> +
    + +
    + + ); +} diff --git a/components/designSystem/SmolTokenAmountInput.tsx b/components/designSystem/SmolTokenAmountInput.tsx index 93d070f..0689b66 100644 --- a/components/designSystem/SmolTokenAmountInput.tsx +++ b/components/designSystem/SmolTokenAmountInput.tsx @@ -1,26 +1,27 @@ import React, {useCallback, useState} from 'react'; import {getNewInput} from 'components/sections/Send/useSendFlow'; -import {useBalancesCurtain} from 'contexts/useBalancesCurtain'; -import {parseUnits} from 'viem'; +import InputNumber from 'rc-input-number'; +import {useChainID} from '@builtbymom/web3/hooks/useChainID'; +import {usePrices} from '@builtbymom/web3/hooks/usePrices'; import { cl, + formatCounterValue, fromNormalized, - isAddress, percentOf, toBigInt, toNormalizedBN, zeroNormalizedBN } from '@builtbymom/web3/utils'; -import {IconChevron} from '@icons/IconChevron'; -import {IconWallet} from '@icons/IconWallet'; -import {useDeepCompareEffect} from '@react-hookz/web'; +import {useDeepCompareEffect, useUpdateEffect} from '@react-hookz/web'; import {handleLowAmount} from '@utils/helpers'; -import {ImageWithFallback} from '@common/ImageWithFallback'; + +import {SmolTokenSelectorButton} from './SmolTokenSelectorButton'; import type {ReactElement} from 'react'; import type {TNormalizedBN, TToken} from '@builtbymom/web3/types'; -export type TSendInputElement = { +// TODO: move to lib +export type TTokenAmountInputElement = { amount: string; normalizedBigAmount: TNormalizedBN; token: TToken | undefined; @@ -30,106 +31,107 @@ export type TSendInputElement = { UUID: string; }; -export const defaultTokenInputLike: TSendInputElement = getNewInput(); +export const defaultTokenInputLike: TTokenAmountInputElement = getNewInput(); type TTokenAmountInput = { showPercentButtons?: boolean; - onSetValue: (value: Partial) => void; - value: TSendInputElement; - initialValue?: Partial<{amount: bigint; token: TToken}>; + onSetValue: (value: Partial) => void; + value: TTokenAmountInputElement; }; const percentIntervals = [25, 50, 75]; -export function SmolTokenAmountInput({ - showPercentButtons = false, - onSetValue, - value, - initialValue -}: TTokenAmountInput): ReactElement { - const [isFocused, set_isFocused] = useState(false); - const {onOpenCurtain} = useBalancesCurtain(); - - const {token} = value; - - const selectedTokenBalance = token?.balance ?? zeroNormalizedBN; - const initialTokenBalance = initialValue?.token?.balance ?? zeroNormalizedBN; +export function useValidateAmountInput(): { + validate: (inputValue: string | undefined, token: TToken | undefined) => Partial; + result: Partial | undefined; +} { + const [result, set_result] = useState | undefined>(undefined); - const onChange = (amount: string, balance: TNormalizedBN, token?: TToken): void => { - if (amount === '') { - return onSetValue({ - amount, + const validate = (inputValue: string | undefined, token: TToken | undefined): Partial => { + if (!inputValue) { + const result = { + amount: inputValue, normalizedBigAmount: zeroNormalizedBN, isValid: false, + token, error: 'The amount is invalid' - }); + }; + set_result(result); + return result; } - if (+amount > 0) { - const inputBigInt = amount ? fromNormalized(amount, token?.decimals || 18) : toBigInt(0); + if (+inputValue > 0) { + const inputBigInt = inputValue ? fromNormalized(inputValue, token?.decimals || 18) : toBigInt(0); const asNormalizedBN = toNormalizedBN(inputBigInt, token?.decimals || 18); - if (inputBigInt > balance.raw) { - return onSetValue({ + + if (!token?.address) { + const result = { + amount: asNormalizedBN.display, + normalizedBigAmount: asNormalizedBN, + isValid: false, + token, + error: 'No token selected' + }; + set_result(result); + return result; + } + + if (inputBigInt > token.balance.raw) { + const result = { amount: asNormalizedBN.display, normalizedBigAmount: asNormalizedBN, isValid: false, + token, error: 'Insufficient Balance' - }); + }; + set_result(result); + return result; } - return onSetValue({ + const result = { amount: asNormalizedBN.display, normalizedBigAmount: asNormalizedBN, isValid: true, + token, error: undefined - }); + }; + set_result(result); + return result; } - - onSetValue({ + const result = { amount: '0', normalizedBigAmount: zeroNormalizedBN, isValid: false, + token, error: 'The amount is invalid' - }); + }; + set_result(result); + return result; }; + return {validate, result}; +} - const onSetFractional = (percentage: number): void => { - if (percentage === 100) { - return onSetValue({ - amount: selectedTokenBalance.display, - normalizedBigAmount: selectedTokenBalance, - isValid: true, - error: undefined - }); - } +export function SmolTokenAmountInput({showPercentButtons = false, onSetValue, value}: TTokenAmountInput): ReactElement { + const {safeChainID} = useChainID(); + const [isFocused, set_isFocused] = useState(false); + const {token: selectedToken} = value; + const selectedTokenBalance = selectedToken?.balance ?? zeroNormalizedBN; + const {result, validate} = useValidateAmountInput(); - const calculatedPercent = percentOf(+selectedTokenBalance.normalized, percentage); - onSetValue({ - amount: calculatedPercent.toString(), - normalizedBigAmount: toNormalizedBN( - parseUnits(String(calculatedPercent), token?.decimals || 18), - token?.decimals || 18 - ), + const {data: prices} = usePrices({tokens: selectedToken ? [selectedToken] : [], chainId: safeChainID}); + const price = prices && selectedToken ? prices[selectedToken.address] : undefined; + + const onSetMax = (): void => { + return onSetValue({ + amount: selectedTokenBalance.display, + normalizedBigAmount: selectedTokenBalance, isValid: true, error: undefined }); }; - const onSelectToken = (valueBigInt: bigint, token: TToken): void => { - if (token.balance.raw < valueBigInt) { - return onSetValue({ - token, - normalizedBigAmount: toNormalizedBN(valueBigInt, token?.decimals || 18), - isValid: false, - error: 'Insufficient balance' - }); - } - - onSetValue({ - token, - normalizedBigAmount: toNormalizedBN(valueBigInt, token?.decimals || 18), - isValid: true, - error: undefined - }); + const onSetFractional = (percentage: number): void => { + const calculatedPercent = percentOf(+selectedTokenBalance.normalized, percentage); + validate(calculatedPercent.toString(), selectedToken); }; const getBorderColor = useCallback((): string => { @@ -142,19 +144,56 @@ export function SmolTokenAmountInput({ return 'border-neutral-400'; }, [isFocused, value.isValid]); - useDeepCompareEffect(() => { - if (!initialValue) { - return; + const getErrorOrButton = (): JSX.Element => { + if (showPercentButtons) { + return ( +
    + {percentIntervals.map(percent => ( + + ))} +
    + ); } - if (initialValue.amount && initialValue.token?.address) { - const normalizedAmount = String( - toNormalizedBN(initialValue.amount, initialValue?.token?.decimals || 18).normalized + + if (!selectedTokenBalance.normalized) { + return

    {'No token selected'}

    ; + } + + if (!value.amount) { + return ( + ); - onSelectToken(initialValue.amount, initialValue.token); + } + + if (value.error) { + return

    {value.error}

    ; + } + + return

    {formatCounterValue(value.normalizedBigAmount.normalized, price?.normalized ?? 0)}

    ; + }; - onChange(normalizedAmount, initialTokenBalance, initialValue.token); + useDeepCompareEffect(() => { + if (!result) { + return; } - }, [initialValue, initialTokenBalance]); + onSetValue(result); + }, [result]); + + /* Remove selected token on network change */ + useUpdateEffect(() => { + validate(value.amount, undefined); + }, [safeChainID]); return (
    @@ -167,98 +206,44 @@ export function SmolTokenAmountInput({ getBorderColor() )}>
    - { - onChange(e.target.value, selectedTokenBalance, token); + onChange={value => { + validate(value || '', selectedToken); }} - max={selectedTokenBalance.normalized} + decimalSeparator={'.'} onFocus={() => set_isFocused(true)} onBlur={() => set_isFocused(false)} - min={0} - step={1} + min={'0'} + step={0.1} />
    - {value.error ? ( -

    {value.error}

    - ) : showPercentButtons ? ( -
    - {percentIntervals.map(percent => ( - - ))} -
    - ) : selectedTokenBalance.normalized ? ( - - ) : ( -

    {'No token selected'}

    - )} - + {getErrorOrButton()}
    - +
    + { + validate(value.amount, token); + }} + token={selectedToken} + /> +
    ); diff --git a/components/designSystem/SmolTokenButton.tsx b/components/designSystem/SmolTokenButton.tsx new file mode 100644 index 0000000..7447f3e --- /dev/null +++ b/components/designSystem/SmolTokenButton.tsx @@ -0,0 +1,80 @@ +import {cl, formatAmount, formatCounterValue, isAddress, truncateHex} from '@builtbymom/web3/utils'; +import {IconChevron} from '@icons/IconChevron'; +import {IconWallet} from '@icons/IconWallet'; +import {ImageWithFallback} from '@common/ImageWithFallback'; + +import type {ReactElement} from 'react'; +import type {TNormalizedBN, TToken} from '@builtbymom/web3/types'; + +export function SmolTokenButton({ + token, + isDisabled = false, + displayChevron = false, + price, + onClick +}: { + token: TToken | undefined; + isDisabled?: boolean; + displayChevron?: boolean; + onClick?: () => void; + price?: TNormalizedBN; +}): ReactElement { + return ( + + ); +} diff --git a/components/designSystem/SmolTokenSelector.tsx b/components/designSystem/SmolTokenSelector.tsx new file mode 100644 index 0000000..99133c3 --- /dev/null +++ b/components/designSystem/SmolTokenSelector.tsx @@ -0,0 +1,56 @@ +import {useCallback, useState} from 'react'; +import {useBalancesCurtain} from 'contexts/useBalancesCurtain'; +import {useChainID} from '@builtbymom/web3/hooks/useChainID'; +import {usePrices} from '@builtbymom/web3/hooks/usePrices'; +import {cl} from '@builtbymom/web3/utils'; +import {useUpdateEffect} from '@react-hookz/web'; + +import {SmolTokenButton} from './SmolTokenButton'; + +import type {TToken} from '@builtbymom/web3/types'; + +export function SmolTokenSelector({ + onSelectToken, + token +}: { + onSelectToken: (token: TToken | undefined) => void; + token: TToken | undefined; +}): JSX.Element { + const {safeChainID} = useChainID(); + const [isFocused] = useState(false); + const {onOpenCurtain} = useBalancesCurtain(); + const {data: price} = usePrices({tokens: token ? [token] : [], chainId: safeChainID}); + + const getBorderColor = useCallback((): string => { + if (isFocused) { + return 'border-neutral-600'; + } + + return 'border-neutral-400'; + }, [isFocused]); + + /* Remove selected token on network change */ + useUpdateEffect(() => { + onSelectToken(undefined); + }, [safeChainID]); + + return ( +
    +
    + onOpenCurtain(selected => onSelectToken(selected))} + token={token} + price={price && token?.address ? price[token?.address] : undefined} + displayChevron + /> +
    +
    + ); +} diff --git a/components/designSystem/SmolTokenSelectorButton.tsx b/components/designSystem/SmolTokenSelectorButton.tsx new file mode 100644 index 0000000..c63e19b --- /dev/null +++ b/components/designSystem/SmolTokenSelectorButton.tsx @@ -0,0 +1,60 @@ +import {useBalancesCurtain} from 'contexts/useBalancesCurtain'; +import {cl, isAddress} from '@builtbymom/web3/utils'; +import {IconChevron} from '@icons/IconChevron'; +import {IconWallet} from '@icons/IconWallet'; +import {ImageWithFallback} from '@common/ImageWithFallback'; + +import type {TToken} from '@builtbymom/web3/types'; + +export function SmolTokenSelectorButton({ + onSelectToken, + token +}: { + onSelectToken: (token: TToken) => void; + token: TToken | undefined; +}): JSX.Element { + const {onOpenCurtain} = useBalancesCurtain(); + + return ( + + ); +} diff --git a/components/icons/IconApps.tsx b/components/icons/IconApps.tsx index 12bc019..e87b9eb 100644 --- a/components/icons/IconApps.tsx +++ b/components/icons/IconApps.tsx @@ -193,6 +193,73 @@ export function IconAppEarn(props: React.SVGProps): ReactElement ); } +export function IconAppStream(props: React.SVGProps): ReactElement { + return ( + + + + + + + + + + ); +} + export function IconAppAddressBook(props: React.SVGProps): ReactElement { return ( ): ReactElement { + return ( + + + + ); +} diff --git a/components/icons/IconErrorTriangle.tsx b/components/icons/IconErrorTriangle.tsx new file mode 100644 index 0000000..e1ef21a --- /dev/null +++ b/components/icons/IconErrorTriangle.tsx @@ -0,0 +1,38 @@ +import type {ReactElement} from 'react'; + +export function IconErrorTriangle(props: React.SVGProps): ReactElement { + return ( + + + + + + + ); +} diff --git a/components/icons/IconHamburger.tsx b/components/icons/IconHamburger.tsx new file mode 100644 index 0000000..77843e1 --- /dev/null +++ b/components/icons/IconHamburger.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import type {ReactElement} from 'react'; + +export function IconHamburger(props: React.SVGProps): ReactElement { + return ( + + + + + + ); +} diff --git a/components/sections/Disperse/DisperseAddressAndAmountInputs.tsx b/components/sections/Disperse/DisperseAddressAndAmountInputs.tsx new file mode 100644 index 0000000..28cc699 --- /dev/null +++ b/components/sections/Disperse/DisperseAddressAndAmountInputs.tsx @@ -0,0 +1,58 @@ +import {IconCross} from '@icons/IconCross'; + +import {SmolAddressInput} from '../../designSystem/SmolAddressInput'; +import {SmolAmountInput} from '../../designSystem/SmolAmountInput'; +import {useDisperse} from './useDisperse'; + +import type {ReactElement} from 'react'; +import type {TNormalizedBN} from '@builtbymom/web3/types'; +import type {TInputAddressLike} from '@utils/tools.address'; +import type {TAmountInputElement} from '../../designSystem/SmolAmountInput'; +import type {TDisperseInput} from './useDisperse'; + +type TDisperseAddressAndAmountInputs = { + input: TDisperseInput; + price: TNormalizedBN | undefined; +}; + +export function DisperseAddressAndAmountInputs({input, price}: TDisperseAddressAndAmountInputs): ReactElement { + const {configuration, dispatchConfiguration} = useDisperse(); + + const onSetReceiver = (value: Partial): void => { + dispatchConfiguration({type: 'SET_RECEIVER', payload: {...value, UUID: input.UUID}}); + }; + + const onSetAmount = (value: Partial): void => { + dispatchConfiguration({type: 'SET_VALUE', payload: {...value, UUID: input.UUID}}); + }; + + const onRemoveInput = (): void => { + dispatchConfiguration({type: 'DEL_RECEIVER_BY_UUID', payload: input.UUID}); + }; + + return ( +
    +
    +
    + +
    +
    + +
    +
    + +
    + ); +} diff --git a/components/sections/Disperse/DisperseStatus.tsx b/components/sections/Disperse/DisperseStatus.tsx new file mode 100644 index 0000000..0726b53 --- /dev/null +++ b/components/sections/Disperse/DisperseStatus.tsx @@ -0,0 +1,38 @@ +import {type ReactElement, useMemo} from 'react'; +import {useAddressBook} from 'contexts/useAddressBook'; +import {Warning} from '@common/Primitives/Warning'; + +import {useDisperse} from './useDisperse'; + +import type {TWarningType} from '@common/Primitives/Warning'; + +export function DisperseStatus(): ReactElement | null { + const {configuration} = useDisperse(); + const {getCachedEntry} = useAddressBook(); + + const addresses = configuration.inputs.map(input => input.receiver.address).filter(Boolean); + + const status: {type: TWarningType; message: string | ReactElement} | null = useMemo(() => { + if (addresses.some(address => !getCachedEntry({address}))) { + return { + message: + "It's the first time you are sending tokens to some addresses on this lists. Make sure that's what you want to do", + type: 'warning' + }; + } + return null; + }, [addresses, getCachedEntry]); + + if (!status) { + return null; + } + + return ( +
    + +
    + ); +} diff --git a/components/sections/Disperse/Wizard.tsx b/components/sections/Disperse/Wizard.tsx new file mode 100644 index 0000000..1dd1ae3 --- /dev/null +++ b/components/sections/Disperse/Wizard.tsx @@ -0,0 +1,439 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import {usePlausible} from 'next-plausible'; +import {Button} from 'components/Primitives/Button'; +import {useAddressBook} from 'contexts/useAddressBook'; +import {approveERC20, disperseERC20, disperseETH} from 'utils/actions'; +import {notifyDisperse} from 'utils/notifier'; +import {getTransferTransaction} from 'utils/tools.gnosis'; +import {type BaseError, erc20Abi, type Hex} from 'viem'; +import {useReadContract} from 'wagmi'; +import useWallet from '@builtbymom/web3/contexts/useWallet'; +import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; +import {useChainID} from '@builtbymom/web3/hooks/useChainID'; +import { + formatAmount, + isZeroAddress, + slugify, + toAddress, + toBigInt, + toNormalizedValue, + truncateHex +} from '@builtbymom/web3/utils'; +import {defaultTxStatus} from '@builtbymom/web3/utils/wagmi/transaction'; +import {useSafeAppsSDK} from '@gnosis.pm/safe-apps-react-sdk'; +import {toast} from '@yearn-finance/web-lib/components/yToast'; +import {ETH_TOKEN_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {SuccessModal} from '@common/ConfirmationModal'; +import {ErrorModal} from '@common/ErrorModal'; + +import {ExportConfigurationButton} from '.'; +import {useDisperse} from './useDisperse'; + +import type {ReactElement} from 'react'; +import type {TAddress} from '@builtbymom/web3/types'; +import type {TTxResponse, TTxStatus} from '@builtbymom/web3/utils/wagmi/transaction'; +import type {BaseTransaction} from '@gnosis.pm/safe-apps-sdk'; + +type TApprovalWizardProps = { + onSuccess: () => void; + totalToDisperse: bigint; +}; + +const useApproveDisperse = ({ + onSuccess, + totalToDisperse +}: TApprovalWizardProps): { + approvalStatus: TTxStatus; + shouldApprove: boolean; + allowance: bigint; + isApproved: boolean; + isDisabled: boolean; + onApproveToken: () => void; +} => { + const {provider} = useWeb3(); + const {safeChainID} = useChainID(); + const {configuration} = useDisperse(); + const [approvalStatus, set_approvalStatus] = useState(defaultTxStatus); + const {address} = useWeb3(); + + const shouldApprove = useMemo((): boolean => { + return toAddress(configuration.tokenToSend?.address) !== ETH_TOKEN_ADDRESS; + }, [configuration.tokenToSend]); + + const {data: allowance = 0n, refetch} = useReadContract({ + abi: erc20Abi, + functionName: 'allowance', + args: [toAddress(address), toAddress(process.env.DISPERSE_ADDRESS)], + address: toAddress(configuration.tokenToSend?.address), + query: { + enabled: + configuration.tokenToSend !== undefined && + toAddress(configuration.tokenToSend?.address) !== ETH_TOKEN_ADDRESS + } + }); + + const isApproved = allowance >= totalToDisperse; + + const onApproveToken = useCallback((): void => { + if (isApproved) { + return; + } + approveERC20({ + connector: provider, + chainID: safeChainID, + contractAddress: toAddress(configuration.tokenToSend?.address), + spenderAddress: toAddress(process.env.DISPERSE_ADDRESS), + amount: totalToDisperse, + statusHandler: set_approvalStatus + }).then(result => { + if (result.isSuccessful) { + onSuccess(); + refetch(); + } + }); + }, [isApproved, provider, safeChainID, configuration.tokenToSend?.address, totalToDisperse, onSuccess, refetch]); + + return { + approvalStatus, + shouldApprove, + allowance, + isApproved, + isDisabled: !approvalStatus.none || !configuration.tokenToSend, + onApproveToken + }; +}; + +const useConfirmDisperse = ({ + onTrigger, + onSuccess, + onError, + totalToDisperse +}: { + onTrigger: () => void; + onSuccess: () => void; + onError: () => void; + totalToDisperse: bigint; +}): {onDisperseTokens: () => void} => { + const {address, provider, isWalletSafe} = useWeb3(); + const {safeChainID} = useChainID(); + const {configuration} = useDisperse(); + const {bumpEntryInteractions} = useAddressBook(); + const {onRefresh} = useWallet(); + const {sdk} = useSafeAppsSDK(); + const plausible = usePlausible(); + + const successDisperseCallback = useCallback( + (disperseAddresses: TAddress[], disperseAmount: bigint[], result: TTxResponse) => { + onSuccess(); + onRefresh([ + { + decimals: configuration.tokenToSend?.decimals, + name: configuration.tokenToSend?.name, + symbol: configuration.tokenToSend?.symbol, + address: toAddress(configuration.tokenToSend?.address), + chainID: Number(configuration.tokenToSend?.chainID) + } + ]); + disperseAddresses.forEach(address => { + bumpEntryInteractions({ + address: address, + label: truncateHex(address, 5), + chains: [safeChainID], + slugifiedLabel: slugify(address) + }); + }); + plausible('disperse', { + props: { + disperseChainID: safeChainID, + tokenToDisperse: configuration.tokenToSend?.address, + totalToDisperse: `${formatAmount( + toNormalizedValue(totalToDisperse, configuration.tokenToSend?.decimals || 18), + 6, + configuration.tokenToSend?.decimals || 18 + )} ${configuration.tokenToSend?.symbol || 'Tokens'}` + } + }); + if (result.receipt) { + notifyDisperse({ + chainID: safeChainID, + tokenToDisperse: configuration.tokenToSend, + receivers: disperseAddresses, + amounts: disperseAmount, + type: 'EOA', + from: result.receipt.from, + hash: result.receipt.transactionHash + }); + } + return; + }, + [ + bumpEntryInteractions, + configuration.tokenToSend, + onRefresh, + onSuccess, + plausible, + safeChainID, + totalToDisperse + ] + ); + /********************************************************************************************** + ** onDisperseTokensForGnosis will do just like disperseTokens but for Gnosis Safe and without + ** the use of a smartcontract. It will just batch standard transfers. + **********************************************************************************************/ + const onDisperseTokensForGnosis = useCallback((): void => { + const transactions: BaseTransaction[] = []; + const disperseAddresses: TAddress[] = []; + const disperseAmount: bigint[] = []; + for (const row of configuration.inputs) { + if (!row.value.amount || row.value.normalizedBigAmount.raw === 0n) { + continue; + } + if ( + !row.receiver.address || + row.receiver.address === ZERO_ADDRESS || + row.receiver.address === ETH_TOKEN_ADDRESS + ) { + continue; + } + disperseAddresses.push(row.receiver.address); + disperseAmount.push(row.value.normalizedBigAmount.raw); + const newTransactionForBatch = getTransferTransaction( + row.value.normalizedBigAmount.raw.toString(), + toAddress(configuration.tokenToSend?.address), + row.receiver.address + ); + transactions.push(newTransactionForBatch); + } + try { + sdk.txs.send({txs: transactions}).then(({safeTxHash}) => { + toast({ + type: 'success', + content: 'Your transaction has been created! You can now sign and execute it!' + }); + notifyDisperse({ + chainID: safeChainID, + tokenToDisperse: configuration.tokenToSend, + receivers: disperseAddresses, + amounts: disperseAmount, + type: 'SAFE', + from: toAddress(address), + hash: safeTxHash as Hex + }); + onSuccess(); + }); + } catch (error) { + toast({ + type: 'error', + content: (error as BaseError)?.message || 'An error occured while creating your transaction!' + }); + onError(); + } + }, [configuration.inputs, configuration.tokenToSend, sdk.txs, safeChainID, address, onSuccess, onError]); + + const onDisperseTokens = useCallback((): void => { + onTrigger(); + if (isWalletSafe) { + return onDisperseTokensForGnosis(); + } + + const [disperseAddresses, disperseAmount] = configuration.inputs + .filter((row): boolean => { + return ( + (toBigInt(row.value.normalizedBigAmount.raw) > 0n && + row.receiver.address && + !isZeroAddress(row.receiver.address)) || + false + ); + }) + .reduce( + (acc, row): [TAddress[], bigint[]] => { + acc[0].push(toAddress(row.receiver.address)); + acc[1].push(toBigInt(row.value.normalizedBigAmount.raw)); + return acc; + }, + [[] as TAddress[], [] as bigint[]] + ); + + if (configuration.tokenToSend?.address === ETH_TOKEN_ADDRESS) { + disperseETH({ + connector: provider, + chainID: safeChainID, + contractAddress: toAddress(process.env.DISPERSE_ADDRESS), + receivers: disperseAddresses, + amounts: disperseAmount + }).then(result => { + if (result.isSuccessful) { + return successDisperseCallback(disperseAddresses, disperseAmount, result); + } + onError(); + }); + } else { + disperseERC20({ + connector: provider, + chainID: safeChainID, + contractAddress: toAddress(process.env.DISPERSE_ADDRESS), + tokenToDisperse: toAddress(configuration.tokenToSend?.address), + receivers: disperseAddresses, + amounts: disperseAmount + }).then(result => { + if (result.isSuccessful) { + return successDisperseCallback(disperseAddresses, disperseAmount, result); + } + onError(); + }); + } + }, [ + onTrigger, + isWalletSafe, + configuration.inputs, + configuration.tokenToSend?.address, + onDisperseTokensForGnosis, + provider, + safeChainID, + onError, + successDisperseCallback + ]); + + return {onDisperseTokens}; +}; + +export function DisperseWizard(): ReactElement { + const {getBalance} = useWallet(); + const {isWalletSafe} = useWeb3(); + const {configuration, onResetDisperse} = useDisperse(); + const [disperseStatus, set_disperseStatus] = useState(defaultTxStatus); + + const totalToDisperse = useMemo((): bigint => { + return configuration.inputs.reduce((acc, row): bigint => acc + row.value.normalizedBigAmount.raw, 0n); + }, [configuration.inputs]); + + const {isApproved, approvalStatus, onApproveToken} = useApproveDisperse({ + onSuccess: () => { + set_disperseStatus(defaultTxStatus); + }, + totalToDisperse + }); + + const {onDisperseTokens} = useConfirmDisperse({ + onError: () => { + set_disperseStatus({...defaultTxStatus, error: true}); + }, + onSuccess: () => { + set_disperseStatus({...defaultTxStatus, success: true}); + }, + onTrigger: () => { + set_disperseStatus({...defaultTxStatus, pending: true}); + }, + totalToDisperse + }); + + const isAboveBalance = + totalToDisperse > + getBalance({ + address: toAddress(configuration.tokenToSend?.address), + chainID: Number(configuration.tokenToSend?.chainID) + }).raw; + + const checkAlreadyExists = useCallback( + (UUID: string, address: TAddress): boolean => { + if (isZeroAddress(address)) { + return false; + } + return configuration.inputs.some((row): boolean => row.UUID !== UUID && row.receiver.address === address); + }, + [configuration.inputs] + ); + + const isValid = useMemo((): boolean => { + return configuration.inputs.every((row): boolean => { + if (!row.receiver.label && !row.receiver.address && toBigInt(row.value.normalizedBigAmount.raw) === 0n) { + return false; + } + if (!row.receiver.address || isZeroAddress(row.receiver.address)) { + return false; + } + if (checkAlreadyExists(row.UUID, row.receiver.address)) { + return false; + } + if (!row.value.normalizedBigAmount || row.value.normalizedBigAmount.raw === 0n) { + return false; + } + return true; + }); + }, [configuration.inputs, checkAlreadyExists]); + + const getButtonTitle = (): string => { + if (isWalletSafe) { + return 'Disperse'; + } + if (toAddress(configuration.tokenToSend?.address) === ETH_TOKEN_ADDRESS) { + return 'Disperse'; + } + if (isApproved) { + return 'Disperse'; + } + return 'Approve'; + }; + + const getTotalToDisperseLabel = (): string => { + if (totalToDisperse) { + return `Total to Disperse: ${formatAmount( + toNormalizedValue(totalToDisperse, configuration.tokenToSend?.decimals || 18), + 6, + configuration.tokenToSend?.decimals || 18 + )} ${configuration.tokenToSend?.symbol || 'Tokens'}`; + } + return 'Nothing to Disperse yet'; + }; + + return ( +
    + {/* {'Summary'} */} + + {getTotalToDisperseLabel()} + + + + } + isOpen={disperseStatus.success} + onClose={(): void => { + onResetDisperse(); + set_disperseStatus(defaultTxStatus); + }} + /> + + { + set_disperseStatus(defaultTxStatus); + }} + /> +
    + ); +} diff --git a/components/sections/Disperse/index.tsx b/components/sections/Disperse/index.tsx new file mode 100644 index 0000000..b46f01b --- /dev/null +++ b/components/sections/Disperse/index.tsx @@ -0,0 +1,296 @@ +import React, {memo, useCallback, useEffect, useMemo, useState} from 'react'; +import {usePlausible} from 'next-plausible'; +import {useValidateAddressInput} from 'components/designSystem/SmolAddressInput'; +import {useValidateAmountInput} from 'components/designSystem/SmolTokenAmountInput'; +import {SmolTokenSelector} from 'components/designSystem/SmolTokenSelector'; +import {Button} from 'components/Primitives/Button'; +import {useDownloadFile} from 'hooks/useDownloadFile'; +import Papa from 'papaparse'; +import axios from 'axios'; +import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; +import {useBalances} from '@builtbymom/web3/hooks/useBalances.multichains'; +import {useChainID} from '@builtbymom/web3/hooks/useChainID'; +import {usePrices} from '@builtbymom/web3/hooks/usePrices'; +import {cl, toAddress, toNormalizedBN} from '@builtbymom/web3/utils'; +import IconImport from '@icons/IconImport'; + +import {DisperseAddressAndAmountInputs} from './DisperseAddressAndAmountInputs'; +import {DisperseStatus} from './DisperseStatus'; +import {newVoidRow, useDisperse} from './useDisperse'; +import {useDisperseQueryManagement} from './useDisperseQuery'; +import {DisperseWizard} from './Wizard'; + +import type {AxiosResponse} from 'axios'; +import type {ChangeEvent, ComponentPropsWithoutRef, ReactElement} from 'react'; +import type {TAddress, TToken} from '@builtbymom/web3/types'; +import type {TDisperseInput} from './useDisperse'; + +type TRecord = { + tokenAddress: TAddress; + receiverAddress: TAddress; + value: string; + chainId: string; +}; + +function ImportConfigurationButton({onSelectToken}: {onSelectToken: (token: TToken) => void}): ReactElement { + const {dispatchConfiguration} = useDisperse(); + + const {chainID: safeChainID} = useWeb3(); + // const {safeChainID} = useChainID(); + + const {validate: validateAddress} = useValidateAddressInput(); + const {validate: validateAmount} = useValidateAmountInput(); + + const [importedTokenToSend, set_importedTokenToSend] = useState(undefined); + const [records, set_records] = useState(undefined); + + /** Token in URL may not be present in csv file, so better to be fetched */ + const {data: initialTokenRaw} = useBalances({ + tokens: [{address: toAddress(importedTokenToSend), chainID: safeChainID}] + }); + + const initialToken = useMemo((): TToken | undefined => { + return initialTokenRaw[safeChainID] && importedTokenToSend + ? initialTokenRaw[safeChainID][importedTokenToSend] + : undefined; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [initialTokenRaw]); + + const getInitialAmount = (amount: string, token: TToken | undefined): string => { + return amount && token ? toNormalizedBN(amount, token.decimals).display : '0'; + }; + + const onAddInputs = (inputs: TDisperseInput[]): void => { + dispatchConfiguration({type: 'ADD_RECEIVERS', payload: inputs}); + }; + + const clearReceivers = (): void => { + dispatchConfiguration({type: 'CLEAR_RECEIVERS', payload: undefined}); + }; + + const handleFileUpload = (e: ChangeEvent): void => { + if (!e.target.files) { + return; + } + const [file] = e.target.files as unknown as Blob[]; + const reader = new FileReader(); + reader.onload = event => { + if (!event?.target?.result) { + return; + } + const {result} = event.target; + const parsedCSV = Papa.parse(result, {header: true}); + let records: TRecord[] = []; + + // If we are working with a safe file, we should get 4 columns. + const isProbablySafeFile = + parsedCSV.meta.fields.length === 4 && parsedCSV.meta.fields[0] === 'tokenAddress'; + + if (isProbablySafeFile) { + const [tokenAddress, chainId, receiverAddress, value] = parsedCSV.meta.fields; + records = parsedCSV.data.map((item: unknown[]) => { + return { + tokenAddress: item[tokenAddress] as TAddress, + receiverAddress: item[receiverAddress] as TAddress, + value: item[value] as string, + chainId: item[chainId] as string + }; + }); + set_importedTokenToSend(records[0].tokenAddress); + set_records(records); + } else { + console.error('The file you are trying to upload seems to be broken'); + } + }; + reader.readAsBinaryString(file); + }; + + /** Set imported token from url if present */ + useEffect(() => { + if (initialToken) { + onSelectToken(initialToken); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [initialToken]); + + useEffect(() => { + if (!records || !Array.isArray(records)) { + return; + } + + const resultInputs: TDisperseInput[] = []; + const promises = records.map(async record => validateAddress(undefined, record.receiverAddress)); + Promise.all(promises) + .then(values => { + values.forEach((validatedReceiver, index) => { + const stringAmount = getInitialAmount(records[index].value, initialToken); + console.log(records[index].value, initialToken); + const value = { + receiver: validatedReceiver, + value: {...newVoidRow().value, ...validateAmount(stringAmount, initialToken)}, + UUID: crypto.randomUUID() + }; + resultInputs.push(value); + }); + }) + .finally(() => { + clearReceivers(); + onAddInputs(resultInputs); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [initialToken]); + + return ( + + ); +} + +export function ExportConfigurationButton(buttonProps: ComponentPropsWithoutRef<'button'>): ReactElement { + const {configuration} = useDisperse(); + const plausible = usePlausible(); + + const downloadConfiguration = useCallback(async () => { + plausible('download configuration'); + const receiverEntries = configuration.inputs + .map((input, index) => ({ + tokenAddress: index === 0 ? configuration.tokenToSend?.address : '', + chainId: index === 0 ? configuration.tokenToSend?.chainID : '', + receiverAddress: input.receiver.address, + value: input.value.normalizedBigAmount.raw.toString() + })) + .filter(entry => entry.value && entry.receiverAddress); + + const csv = Papa.unparse(receiverEntries, {header: true}); + const blob = new Blob([csv], {type: 'text/csv;charset=utf-8'}); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + const name = `smol-disperse-${new Date().toISOString().split('T')[0]}.csv`; + a.setAttribute('hidden', ''); + a.setAttribute('href', url); + a.setAttribute('download', name); + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }, [configuration.inputs, configuration.tokenToSend?.address, configuration.tokenToSend?.chainID, plausible]); + + return ( + + ); +} + +const Disperse = memo(function Disperse(): ReactElement { + const {safeChainID} = useChainID(); + const {configuration, dispatchConfiguration} = useDisperse(); + + const {hasInitialInputs} = useDisperseQueryManagement(); + + const plausible = usePlausible(); + + const downloadFile = async (): Promise> => { + const url = + 'https://chocolate-gleaming-armadillo-579.mypinata.cloud/ipfs/QmQDj9Cwxx8YABPfbt65LvttrVGeb5qDG8Q6TPJDHy4Li2'; + + return axios.get(url, { + responseType: 'blob' + }); + }; + + const {download: downloadTemplate} = useDownloadFile({ + apiDefinition: downloadFile, + fileName: 'smol-disperse-template', + fileType: 'csv' + }); + + const {data: prices} = usePrices({ + tokens: configuration.tokenToSend ? [configuration.tokenToSend] : [], + chainId: safeChainID + }); + const price = prices && configuration.tokenToSend ? prices[configuration.tokenToSend.address] : undefined; + + const onSelectToken = (token: TToken | undefined): void => { + dispatchConfiguration({type: 'SET_TOKEN_TO_SEND', payload: token}); + }; + + const onAddReceivers = (amount: number): void => { + dispatchConfiguration({ + type: 'ADD_RECEIVERS', + payload: Array(amount) + .fill(null) + .map(() => newVoidRow()) + }); + }; + + /** Add initial inputs */ + useEffect(() => { + if (!hasInitialInputs) { + onAddReceivers(2); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [hasInitialInputs]); + + return ( +
    + +
    + + +
    +
    +

    {'Token'}

    + +
    +
    +

    {'Send to'}

    + {configuration.inputs.map(input => ( + + ))} +
    +
    + +
    + + +
    + ); +}); + +export default Disperse; diff --git a/components/sections/Disperse/useDisperse.tsx b/components/sections/Disperse/useDisperse.tsx new file mode 100755 index 0000000..a671dc1 --- /dev/null +++ b/components/sections/Disperse/useDisperse.tsx @@ -0,0 +1,166 @@ +import React, {createContext, useContext, useMemo, useReducer, useState} from 'react'; +import {zeroNormalizedBN} from '@builtbymom/web3/utils'; +import {optionalRenderProps} from '@utils/react/optionalRenderProps'; +import {defaultInputAddressLike} from '@utils/tools.address'; + +import type {TAmountInputElement} from 'components/designSystem/SmolAmountInput'; +import type {Dispatch, ReactElement} from 'react'; +import type {TToken} from '@builtbymom/web3/types'; +import type {TOptionalRenderProps} from '@utils/react/optionalRenderProps'; +import type {TInputAddressLike} from '@utils/tools.address'; +import type {TPartialExhaustive} from '@utils/types/types'; + +export type TDisperseInput = {receiver: TInputAddressLike; value: TAmountInputElement; UUID: string}; + +export type TDisperseConfiguration = { + tokenToSend: TToken | undefined; + inputs: TDisperseInput[]; +}; + +export type TDisperseActions = + | {type: 'SET_TOKEN_TO_SEND'; payload: TToken | undefined} + | {type: 'SET_RECEIVERS'; payload: TDisperseInput[]} + | {type: 'ADD_RECEIVERS'; payload: TDisperseInput[]} + | {type: 'DEL_RECEIVER_BY_UUID'; payload: string} + | {type: 'SET_RECEIVER'; payload: Partial & {UUID: string}} + | {type: 'SET_VALUE'; payload: Partial & {UUID: string}} + | {type: 'CLEAR_RECEIVERS'; payload: undefined} + | {type: 'RESET'; payload: undefined}; + +export type TDisperseQuery = TPartialExhaustive<{ + token: string; + addresses: string[]; + values: string[]; +}>; + +export type TDisperse = { + configuration: TDisperseConfiguration; + dispatchConfiguration: Dispatch; + isDispersed: boolean; + onResetDisperse: () => void; +}; + +export function newVoidRow(): TDisperseInput { + return { + receiver: defaultInputAddressLike, + value: { + amount: '', + normalizedBigAmount: zeroNormalizedBN, + isValid: 'undetermined', + status: 'none' + }, + UUID: crypto.randomUUID() + }; +} + +const defaultProps: TDisperse = { + isDispersed: false, + dispatchConfiguration: (): void => undefined, + onResetDisperse: (): void => undefined, + configuration: { + tokenToSend: undefined, + inputs: [] + } +}; + +const configurationReducer = (state: TDisperseConfiguration, action: TDisperseActions): TDisperseConfiguration => { + switch (action.type) { + case 'SET_TOKEN_TO_SEND': + return {...state, tokenToSend: action.payload}; + case 'SET_RECEIVERS': + return {...state, inputs: action.payload}; + case 'ADD_RECEIVERS': + return { + ...state, + inputs: [...state.inputs, ...action.payload] + }; + case 'CLEAR_RECEIVERS': + return {...state, inputs: []}; + + case 'DEL_RECEIVER_BY_UUID': + if (state.inputs.length === 1) { + return {...state, inputs: [newVoidRow()]}; + } + return { + ...state, + inputs: state.inputs.filter((input): boolean => input.UUID !== action.payload) + }; + + case 'SET_RECEIVER': { + return { + ...state, + inputs: state.inputs.map(input => + input.UUID === action.payload.UUID + ? { + ...input, + receiver: { + ...input.receiver, + ...action.payload + } + } + : input + ) + }; + } + case 'SET_VALUE': { + return { + ...state, + inputs: state.inputs.map(input => + input.UUID === action.payload.UUID + ? { + ...input, + value: { + ...input.value, + ...action.payload + } + } + : input + ) + }; + } + case 'RESET': + return {tokenToSend: undefined, inputs: [newVoidRow()]}; + } +}; + +const DisperseContext = createContext(defaultProps); +export const DisperseContextApp = ({ + children +}: { + children: TOptionalRenderProps; +}): React.ReactElement => { + const [isDispersed, set_isDispersed] = useState(false); + const [configuration, dispatch] = useReducer(configurationReducer, defaultProps.configuration); + + const onResetDisperse = (): void => { + set_isDispersed(true); + setTimeout((): void => { + dispatch({type: 'RESET', payload: undefined}); + set_isDispersed(false); + }, 500); + }; + + const contextValue = useMemo( + (): TDisperse => ({ + configuration, + dispatchConfiguration: dispatch, + isDispersed, + onResetDisperse + }), + [configuration, isDispersed] + ); + + return ( + + {optionalRenderProps(children, contextValue)} + + ); +}; + +export const useDisperse = (): TDisperse => { + const ctx = useContext(DisperseContext); + if (!ctx) { + throw new Error('DisperseContext not found'); + } + return ctx; +}; diff --git a/components/sections/Disperse/useDisperseQuery.tsx b/components/sections/Disperse/useDisperseQuery.tsx new file mode 100644 index 0000000..5f6afdd --- /dev/null +++ b/components/sections/Disperse/useDisperseQuery.tsx @@ -0,0 +1,163 @@ +import {createContext, useContext, useEffect, useMemo} from 'react'; +import {useRouter} from 'next/router'; +import {useValidateAddressInput} from 'components/designSystem/SmolAddressInput'; +import {useValidateAmountInput} from 'components/designSystem/SmolTokenAmountInput'; +import {useSyncUrlParams} from 'hooks/useSyncUrlParams'; +import {useBalances} from '@builtbymom/web3/hooks/useBalances.multichains'; +import {useChainID} from '@builtbymom/web3/hooks/useChainID'; +import {toAddress, toNormalizedBN} from '@builtbymom/web3/utils'; +import {useUpdateEffect} from '@react-hookz/web'; +import {optionalRenderProps} from '@utils/react/optionalRenderProps'; +import {isString} from '@utils/types/typeGuards'; +import {getStateFromUrlQuery} from '@utils/url/getStateFromUrlQuery'; + +import {newVoidRow, useDisperse} from './useDisperse'; + +import type {ReactElement} from 'react'; +import type {TToken} from '@builtbymom/web3/types'; +import type {TOptionalRenderProps} from '@utils/react/optionalRenderProps'; +import type {TDisperseInput, TDisperseQuery} from './useDisperse'; + +type TDisperseQueryManagement = { + stateFromUrl: TDisperseQuery; + initialStateFromUrl: TDisperseQuery | null; + hasInitialInputs: boolean; +}; + +const defaultProps = { + stateFromUrl: {token: undefined, addresses: undefined, values: undefined}, + initialStateFromUrl: null, + hasInitialInputs: false +}; + +const DisperseQueryManagementContext = createContext(defaultProps); + +export const DisperseQueryManagement = ({ + children +}: { + children: TOptionalRenderProps; +}): ReactElement => { + const {initialStateFromUrl, stateFromUrl, hasInitialInputs} = useDisperseQuery(); + const {configuration} = useDisperse(); + + /** + * Update the url query on every change in the UI + */ + useSyncUrlParams({ + token: configuration.tokenToSend?.address, + addresses: configuration.inputs.map(input => input.receiver.address).filter(isString), + values: configuration.inputs + .map(input => (input.value.amount === '' ? undefined : input.value.normalizedBigAmount?.raw.toString())) + .filter(isString) + }); + + const contextValue = useMemo( + (): TDisperseQueryManagement => ({ + stateFromUrl, + initialStateFromUrl, + hasInitialInputs + }), + [hasInitialInputs, initialStateFromUrl, stateFromUrl] + ); + + return ( + + {optionalRenderProps(children, contextValue)} + + ); +}; + +export function useDisperseQuery(): { + initialStateFromUrl: TDisperseQuery | null; + stateFromUrl: TDisperseQuery; + hasInitialInputs: boolean; +} { + const {safeChainID} = useChainID(); + const {dispatchConfiguration} = useDisperse(); + + const router = useRouter(); + const searchParams = new URLSearchParams(router.asPath.split('?')[1]); + + const queryParams = Object.fromEntries(searchParams.entries()); + const stateFromUrl = getStateFromUrlQuery(queryParams, ({string, array}) => ({ + token: string('token'), + addresses: array('addresses'), + values: array('values') + })); + + const initialStateFromUrl = useMemo(() => { + return stateFromUrl; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const hasInitialInputs = Array.isArray(initialStateFromUrl.addresses) || Array.isArray(initialStateFromUrl.values); + + /** Token in URL may not be present in token list, so better to be fetched */ + const {data: initialTokenRaw} = useBalances({ + tokens: [{address: toAddress(initialStateFromUrl?.token), chainID: safeChainID}] + }); + + const initialToken = + initialTokenRaw[safeChainID] && initialStateFromUrl?.token + ? initialTokenRaw[safeChainID][initialStateFromUrl?.token] + : undefined; + + const onSelectToken = (token: TToken): void => { + dispatchConfiguration({type: 'SET_TOKEN_TO_SEND', payload: token}); + }; + + const onAddInputs = (inputs: TDisperseInput[]): void => { + dispatchConfiguration({type: 'ADD_RECEIVERS', payload: inputs}); + }; + + const getInitialAmount = (index: number, token: TToken | undefined): string => { + return initialStateFromUrl?.values?.[index] && token + ? toNormalizedBN(initialStateFromUrl?.values[index], token.decimals).display + : '0'; + }; + + /** Set initial token from url if present */ + useEffect(() => { + if (initialToken) { + onSelectToken(initialToken); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [initialToken]); + + const {validate: validateAddress} = useValidateAddressInput(); + const {validate: validateAmount} = useValidateAmountInput(); + + /** Add inputs with inital validated values */ + useUpdateEffect(() => { + if (!Array.isArray(initialStateFromUrl.addresses)) { + return; + } + + const result: TDisperseInput[] = []; + + const promises = initialStateFromUrl.addresses.map(async address => validateAddress(undefined, address)); + Promise.all(promises) + .then(values => { + values.forEach((validatedReceiver, index) => { + const stringAmount = getInitialAmount(index, initialToken); + const value = { + receiver: validatedReceiver, + value: {...newVoidRow().value, ...validateAmount(stringAmount, initialToken)}, + UUID: crypto.randomUUID() + }; + result.push(value); + }); + }) + .finally(() => onAddInputs(result)); + }, [initialToken]); + + return {initialStateFromUrl, stateFromUrl, hasInitialInputs}; +} + +export function useDisperseQueryManagement(): TDisperseQueryManagement { + const ctx = useContext(DisperseQueryManagementContext); + if (!ctx) { + throw new Error('DisperseQueryManagement not found'); + } + return ctx; +} diff --git a/components/sections/Send/SendStatus.tsx b/components/sections/Send/SendStatus.tsx index 16dfb29..098cb90 100644 --- a/components/sections/Send/SendStatus.tsx +++ b/components/sections/Send/SendStatus.tsx @@ -1,6 +1,6 @@ import {useState} from 'react'; -import Link from 'next/link'; import {useAddressBook} from 'contexts/useAddressBook'; +import {useAddressBookCurtain} from 'contexts/useAddressBookCurtain'; import {useAsyncTrigger} from '@builtbymom/web3/hooks/useAsyncTrigger'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; import {isEthAddress} from '@builtbymom/web3/utils'; @@ -10,9 +10,34 @@ import {Warning} from '@common/Primitives/Warning'; import {useSendFlow} from './useSendFlow'; -import type {ReactElement} from 'react'; +import type {ReactElement, ReactNode} from 'react'; import type {TWarningType} from '@common/Primitives/Warning'; +function TriggerAddressBookButton({children}: {children: ReactNode}): ReactElement { + const {set_curtainStatus, dispatchConfiguration} = useAddressBookCurtain(); + const {configuration} = useSendFlow(); + + return ( + + ); +} + export function SendStatus({isReceiverERC20}: {isReceiverERC20: boolean}): ReactElement | null { const {configuration} = useSendFlow(); const {safeChainID} = useChainID(); @@ -35,13 +60,9 @@ export function SendStatus({isReceiverERC20}: {isReceiverERC20: boolean}): React return set_status({ message: ( <> - {'Hello. Looks like you’re sending to a '} - - {'smart contract address'} - - {'. If it’s intentional, go right ahead, otherwise you might want to double check.'} + { + 'Hello. Looks like you’re sending to a smart contract address. If it’s intentional, go right ahead, otherwise you might want to double check.' + } ), type: 'warning' @@ -61,8 +82,32 @@ export function SendStatus({isReceiverERC20}: {isReceiverERC20: boolean}): React type: 'error' }); } - if (configuration.receiver.address && !fromAddressBook) { - return set_status({message: 'This address isn’t in your address book. Wanna add it?', type: 'warning'}); + + if ( + configuration.receiver.address && + (!fromAddressBook || (fromAddressBook?.numberOfInteractions === 0 && fromAddressBook.isHidden)) + ) { + return set_status({ + message: ( + <> + {'This is the first time you interact with this address, please be careful.'} + {'Wanna add it to Address Book?'} + + ), + type: 'warning' + }); + } + + if (configuration.receiver.address && fromAddressBook?.isHidden) { + return set_status({ + message: ( + <> + {'This address isn’t in your address book.'}{' '} + {'Wanna add it?'} + + ), + type: 'warning' + }); } if (configuration.receiver.address && !fromAddressBook?.chains.includes(safeChainID)) { diff --git a/components/sections/Send/Wizard.tsx b/components/sections/Send/Wizard.tsx index 3bd9d8b..f0a248e 100644 --- a/components/sections/Send/Wizard.tsx +++ b/components/sections/Send/Wizard.tsx @@ -1,41 +1,52 @@ import React, {useCallback, useState} from 'react'; +import {usePlausible} from 'next-plausible'; import {Button} from 'components/Primitives/Button'; +import {useAddressBook} from 'contexts/useAddressBook'; import {transferERC20, transferEther} from 'utils/actions'; import {getTransferTransaction} from 'utils/tools.gnosis'; import {isAddressEqual} from 'viem'; import {useWallet} from '@builtbymom/web3/contexts/useWallet'; import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; -import {isEthAddress, isZeroAddress, toAddress, toBigInt} from '@builtbymom/web3/utils'; +import {isEthAddress, isZeroAddress, slugify, toAddress, toBigInt, truncateHex} from '@builtbymom/web3/utils'; import {getNetwork} from '@builtbymom/web3/utils/wagmi'; import {defaultTxStatus, type TTxResponse} from '@builtbymom/web3/utils/wagmi'; import {useSafeAppsSDK} from '@gnosis.pm/safe-apps-react-sdk'; +import {useDeepCompareMemo} from '@react-hookz/web'; import {notifySend} from '@utils/notifier'; -import {toast} from '@yearn-finance/web-lib/components/yToast'; import {ETH_TOKEN_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; import {SuccessModal} from '@common/ConfirmationModal'; +import {ErrorModal} from '@common/ErrorModal'; import {useSendFlow} from './useSendFlow'; -import type {TSendInputElement} from 'components/designSystem/SmolTokenAmountInput'; +import type {TTokenAmountInputElement} from 'components/designSystem/SmolTokenAmountInput'; import type {ReactElement} from 'react'; -import type {BaseError, Hex} from 'viem'; +import type {Hex} from 'viem'; import type {TUseBalancesTokens} from '@builtbymom/web3/hooks/useBalances.multichains'; import type {TAddress, TChainTokens, TToken} from '@builtbymom/web3/types'; import type {BaseTransaction} from '@gnosis.pm/safe-apps-sdk'; import type {TModify} from '@utils/types/types'; -type TInputWithToken = TModify; +type TInputWithToken = TModify; export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): ReactElement { const {safeChainID} = useChainID(); const {address} = useWeb3(); const {configuration, dispatchConfiguration} = useSendFlow(); const {getToken, getBalance, onRefresh} = useWallet(); + const {bumpEntryInteractions} = useAddressBook(); const {isWalletSafe, provider} = useWeb3(); const {sdk} = useSafeAppsSDK(); const [migrateStatus, set_migrateStatus] = useState(defaultTxStatus); + const plausible = usePlausible(); + + const migratedTokens = useDeepCompareMemo( + () => configuration.inputs.filter(input => input.status === 'success'), + [configuration.inputs] + ); + const onUpdateStatus = useCallback( (UUID: string, status: 'pending' | 'success' | 'error' | 'none'): void => { dispatchConfiguration({ @@ -152,7 +163,7 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React const onMigrateSelectedForGnosis = useCallback( async (allSelected: TInputWithToken[]): Promise => { const transactions: BaseTransaction[] = []; - const migratedTokens: TSendInputElement[] = []; + for (const input of allSelected) { const amount = toBigInt(input.normalizedBigAmount.raw); if (amount === 0n) { @@ -164,16 +175,13 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React toAddress(configuration.receiver?.address) ); transactions.push(newTransactionForBatch); - migratedTokens.push(input); } try { + allSelected.forEach(input => onUpdateStatus(input.UUID, 'pending')); const {safeTxHash} = await sdk.txs.send({txs: transactions}); - console.log({hash: safeTxHash}); + allSelected.forEach(input => onUpdateStatus(input.UUID, 'success')); set_migrateStatus({...defaultTxStatus, success: true}); - toast({ - type: 'success', - content: 'Your transaction has been created! You can now sign and execute it!' - }); + notifySend({ chainID: safeChainID, to: toAddress(configuration.receiver?.address), @@ -183,14 +191,10 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React from: toAddress(address) }); } catch (error) { - set_migrateStatus({...defaultTxStatus, success: false}); - toast({ - type: 'error', - content: (error as BaseError)?.message || 'An error occured while creating your transaction!' - }); + set_migrateStatus({...defaultTxStatus, error: true}); } }, - [address, configuration.receiver?.address, safeChainID, sdk.txs] + [address, configuration.receiver?.address, migratedTokens, onUpdateStatus, safeChainID, sdk.txs] ); /********************************************************************************************** @@ -210,7 +214,6 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React return onMigrateSelectedForGnosis(allSelected); } - const migratedTokens: TInputWithToken[] = []; const hashMessage: Hex[] = []; let ethToken: TInputWithToken | undefined = undefined; @@ -225,7 +228,6 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React const result = await onMigrateERC20(input); if (result.isSuccessful && result.receipt) { - migratedTokens.push(input); hashMessage.push(result.receipt.transactionHash); } else { areAllSuccess = false; @@ -237,7 +239,6 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React if (ethToken && toBigInt(ethAmountRaw) > 0n) { const result = await onMigrateETH(ethToken); if (result.isSuccessful && result.receipt) { - ethToken && migratedTokens.push(ethToken); hashMessage.push(result.receipt.transactionHash); } else { areAllSuccess = false; @@ -247,10 +248,16 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React if (areAllSuccess) { set_migrateStatus({...defaultTxStatus, success: true}); } else { - set_migrateStatus(defaultTxStatus); - dispatchConfiguration({type: 'RESET', payload: undefined}); + set_migrateStatus({...defaultTxStatus, error: true}); } + bumpEntryInteractions({ + address: configuration.receiver.address, + label: truncateHex(toAddress(configuration.receiver.address), 5), + chains: [safeChainID], + slugifiedLabel: slugify(configuration.receiver.address || '') + }); + notifySend({ chainID: safeChainID, to: toAddress(configuration.receiver?.address), @@ -259,18 +266,33 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React type: 'EOA', from: toAddress(address) }); + + plausible('send', { + props: { + sendChainID: safeChainID, + sendTo: toAddress(configuration.receiver?.address), + sendFrom: toAddress(address) + } + }); }, [ + plausible, configuration.inputs, - configuration.receiver?.address, + configuration.receiver.address, isWalletSafe, + bumpEntryInteractions, safeChainID, + migratedTokens, address, onMigrateSelectedForGnosis, onMigrateERC20, - onMigrateETH, - dispatchConfiguration + onMigrateETH ]); + const errorModalContent = + migratedTokens.length === 0 + ? 'No tokens were sent, please try again.' + : `${migratedTokens.map(token => token.token?.name).join(', ')} ${migratedTokens.length === 1 ? 'was' : 'were'} sent, please retry the rest.`; + const isSendButtonDisabled = isZeroAddress(configuration.receiver?.address) || isEthAddress(configuration.receiver.address) || @@ -299,6 +321,23 @@ export function SendWizard({isReceiverERC20}: {isReceiverERC20: boolean}): React set_migrateStatus(defaultTxStatus); }} /> + + { + set_migrateStatus(defaultTxStatus); + setTimeout(() => { + dispatchConfiguration({ + type: 'REMOVE_SUCCESFUL_INPUTS', + payload: undefined + }); + }, 500); + }} + /> ); } diff --git a/components/sections/Send/index.tsx b/components/sections/Send/index.tsx index 1896549..4bb343e 100644 --- a/components/sections/Send/index.tsx +++ b/components/sections/Send/index.tsx @@ -1,36 +1,26 @@ -import {useCallback} from 'react'; +import {useCallback, useEffect} from 'react'; import {SmolAddressInput} from 'components/designSystem/SmolAddressInput'; import {SmolTokenAmountInput} from 'components/designSystem/SmolTokenAmountInput'; import {useTokenList} from '@builtbymom/web3/contexts/WithTokenList'; -import {useBalances} from '@builtbymom/web3/hooks/useBalances.multichains'; -import {useChainID} from '@builtbymom/web3/hooks/useChainID'; -import {cl, toAddress, toBigInt} from '@builtbymom/web3/utils'; +import {cl} from '@builtbymom/web3/utils'; import {IconCircleCheck} from '@icons/IconCircleCheck'; import {IconCircleCross} from '@icons/IconCircleCross'; import {IconCross} from '@icons/IconCross'; import {IconSpinner} from '@icons/IconSpinner'; -import {useDeepCompareEffect} from '@react-hookz/web'; import {SendStatus} from './SendStatus'; import {useSendFlow} from './useSendFlow'; import {useSendQueryManagement} from './useSendQuery'; import {SendWizard} from './Wizard'; -import type {TSendInputElement} from 'components/designSystem/SmolTokenAmountInput'; +import type {TTokenAmountInputElement} from 'components/designSystem/SmolTokenAmountInput'; import type {ReactElement} from 'react'; -import type {TToken} from '@builtbymom/web3/types'; import type {TInputAddressLike} from '@utils/tools.address'; -function SendTokenRow({ - input, - initialValue -}: { - input: TSendInputElement; - initialValue: Partial<{amount: bigint; token: TToken}>; -}): ReactElement { +function SendTokenRow({input}: {input: TTokenAmountInputElement}): ReactElement { const {configuration, dispatchConfiguration} = useSendFlow(); - const onSetValue = (value: Partial): void => { + const onSetValue = (value: Partial): void => { dispatchConfiguration({type: 'SET_VALUE', payload: {...value, UUID: input.UUID}}); }; @@ -58,7 +48,6 @@ function SendTokenRow({ {configuration.inputs.length > 1 && input.status === 'none' && ( +
    + )} + + {isLoading && } +
    +
    + ); +} diff --git a/contexts/useAddressBook.tsx b/contexts/useAddressBook.tsx index fad8e41..462516f 100755 --- a/contexts/useAddressBook.tsx +++ b/contexts/useAddressBook.tsx @@ -9,6 +9,7 @@ import {useChainID} from '@builtbymom/web3/hooks/useChainID'; import {isAddress, toAddress} from '@builtbymom/web3/utils'; import {useMountEffect} from '@react-hookz/web'; import {slugify} from '@utils/helpers'; +import {supportedNetworks} from '@utils/tools.chains'; import type {IndexedDBConfig} from 'use-indexeddb/dist/interfaces'; import type {TAddress} from '@builtbymom/web3/types'; @@ -26,7 +27,7 @@ export type TAddressBookEntry = { tags?: string[]; // List of tags associated with the address. }; export type TSelectCallback = (item: TAddressBookEntry) => void; -export type TAddressBookCurtainProps = { +export type TAddressBookProps = { shouldOpenCurtain: boolean; listEntries: () => Promise; listCachedEntries: () => TAddressBookEntry[]; @@ -39,7 +40,7 @@ export type TAddressBookCurtainProps = { onOpenCurtain: (callbackFn: TSelectCallback) => void; onCloseCurtain: () => void; }; -const defaultProps: TAddressBookCurtainProps = { +const defaultProps: TAddressBookProps = { shouldOpenCurtain: false, listEntries: async (): Promise => [], listCachedEntries: (): TAddressBookEntry[] => [], @@ -78,16 +79,33 @@ const addressBookIDBConfig: IndexedDBConfig = { ] }; -const AddressBookContext = createContext(defaultProps); +const AddressBookContext = createContext(defaultProps); export const WithAddressBook = ({children}: {children: React.ReactElement}): React.ReactElement => { const [shouldOpenCurtain, set_shouldOpenCurtain] = useState(false); const [cachedEntries, set_cachedEntries] = useState([]); const [entryNonce, set_entryNonce] = useState(0); const [currentCallbackFunction, set_currentCallbackFunction] = useState(undefined); - const {add, getAll, getOneByKey, deleteByID, update} = useIndexedDBStore('address-book'); + const {add, getAll, getOneByKey, update} = useIndexedDBStore('address-book'); const {safeChainID} = useChainID(); - useMountEffect(async () => setupIndexedDB(addressBookIDBConfig)); + useMountEffect(async () => { + setupIndexedDB(addressBookIDBConfig); + + /* Initially add smol address in the AB */ + const entriesFromDB = await getAll(); + if (entriesFromDB.length === 0) { + add({ + address: '0x10001192576E8079f12d6695b0948C2F41320040', + label: 'smol', + isFavorite: false, + chains: supportedNetworks.map(chain => chain.id), + isHidden: false, + numberOfInteractions: 0, + slugifiedLabel: 'smol' + }); + set_entryNonce(nonce => nonce + 1); + } + }); useAsyncTrigger(async (): Promise => { entryNonce; @@ -164,7 +182,7 @@ export const WithAddressBook = ({children}: {children: React.ReactElement}): Rea try { const existingEntry = await getEntry({address: entry.address}); if (existingEntry) { - const mergedChains = [...(existingEntry.chains || []), ...(entry.chains || [])]; + const mergedChains = [...(entry.chains || [])]; if (mergedChains.length === 0) { mergedChains.push(safeChainID); } @@ -211,7 +229,13 @@ export const WithAddressBook = ({children}: {children: React.ReactElement}): Rea mergedChains.push(safeChainID); } const mergedTags = [...(entry.tags || []), ...(existingEntry.tags || [])]; - const mergedFields = {...entry, ...existingEntry, chains: mergedChains, tags: mergedTags}; + const mergedFields = { + ...entry, + ...existingEntry, + chains: mergedChains, + tags: mergedTags, + isHidden: false + }; mergedFields.chains = [...new Set(mergedFields.chains)].filter(chain => chain !== 0); update({...mergedFields, slugifiedLabel: slugify(mergedFields.label)}); set_entryNonce(nonce => nonce + 1); @@ -246,14 +270,14 @@ export const WithAddressBook = ({children}: {children: React.ReactElement}): Rea try { const existingEntry = await getEntry({address: address}); if (existingEntry) { - deleteByID(existingEntry.id); + update({...existingEntry, isHidden: true}); set_entryNonce(nonce => nonce + 1); } } catch { // Do nothing } }, - [deleteByID, getEntry] + [getEntry, update] ); /************************************************************************** @@ -295,7 +319,7 @@ export const WithAddressBook = ({children}: {children: React.ReactElement}): Rea * Context value that is passed to all children of this component. *************************************************************************/ const contextValue = useMemo( - (): TAddressBookCurtainProps => ({ + (): TAddressBookProps => ({ shouldOpenCurtain, listEntries, listCachedEntries, @@ -336,4 +360,4 @@ export const WithAddressBook = ({children}: {children: React.ReactElement}): Rea ); }; -export const useAddressBook = (): TAddressBookCurtainProps => useContext(AddressBookContext); +export const useAddressBook = (): TAddressBookProps => useContext(AddressBookContext); diff --git a/contexts/useAddressBookCurtain.tsx b/contexts/useAddressBookCurtain.tsx new file mode 100644 index 0000000..fc59e77 --- /dev/null +++ b/contexts/useAddressBookCurtain.tsx @@ -0,0 +1,110 @@ +import {createContext, type ReactElement, useContext, useReducer, useState} from 'react'; +import {AddressBookCurtain} from 'components/designSystem/Curtains/AddressBookCurtain'; +import {toAddress} from '@builtbymom/web3/utils'; + +import {useAddressBook} from './useAddressBook'; + +import type {TAddress} from '@builtbymom/web3/types'; +import type {TAddressBookEntry} from './useAddressBook'; + +export type TAddressBookEntryReducer = + | {type: 'SET_SELECTED_ENTRY'; payload: TAddressBookEntry} + | {type: 'SET_ADDRESS'; payload: TAddress | undefined} + | {type: 'SET_LABEL'; payload: string} + | {type: 'SET_CHAINS'; payload: number[]} + | {type: 'SET_IS_FAVORITE'; payload: boolean}; + +type TCurtainStatus = {isOpen: boolean; isEditing: boolean; label?: string}; + +type TAddressBookCurtainProps = { + selectedEntry: TAddressBookEntry | undefined; + dispatchConfiguration: React.Dispatch; + curtainStatus: TCurtainStatus; + set_curtainStatus: React.Dispatch>; +}; + +const deafultCurtainStatus = { + isOpen: false, + isEditing: false +}; + +const defaultProps: TAddressBookCurtainProps = { + selectedEntry: undefined, + dispatchConfiguration: (): void => undefined, + curtainStatus: deafultCurtainStatus, + set_curtainStatus: (): void => undefined +}; +const AddressBookCurtainContext = createContext(defaultProps); + +export const WithAddressBookCurtain = ({children}: {children: ReactElement}): ReactElement => { + const {updateEntry} = useAddressBook(); + const [curtainStatus, set_curtainStatus] = useState(deafultCurtainStatus); + + const entryReducer = (state: TAddressBookEntry, action: TAddressBookEntryReducer): TAddressBookEntry => { + switch (action.type) { + case 'SET_SELECTED_ENTRY': + return action.payload; + case 'SET_ADDRESS': + return {...state, address: toAddress(action.payload)}; + case 'SET_LABEL': + return {...state, label: action.payload}; + case 'SET_CHAINS': + return {...state, chains: action.payload}; + case 'SET_IS_FAVORITE': + updateEntry({...state, isFavorite: action.payload}); + return {...state, isFavorite: action.payload}; + } + }; + + const [selectedEntry, dispatch] = useReducer(entryReducer, { + address: undefined, + label: '', + slugifiedLabel: '', + chains: [], + isFavorite: false + }); + + const contextValue = { + selectedEntry, + dispatchConfiguration: dispatch, + curtainStatus, + set_curtainStatus + }; + + return ( + + {children} + + { + set_curtainStatus(status); + if (!status.isOpen) { + dispatch({ + type: 'SET_SELECTED_ENTRY', + payload: { + address: undefined, + label: '', + slugifiedLabel: '', + chains: [], + isFavorite: false + } + }); + } + }} + /> + + ); +}; + +export const useAddressBookCurtain = (): TAddressBookCurtainProps => { + const ctx = useContext(AddressBookCurtainContext); + if (!ctx) { + throw new Error('AddressBookCurtainContext not found'); + } + return ctx; +}; diff --git a/contexts/useBalancesCurtain.tsx b/contexts/useBalancesCurtain.tsx index 6e8823e..2dbdee4 100644 --- a/contexts/useBalancesCurtain.tsx +++ b/contexts/useBalancesCurtain.tsx @@ -2,6 +2,7 @@ import React, {createContext, useContext, useEffect, useMemo, useState} from 'react'; import {CloseCurtainButton} from 'components/designSystem/Curtains/InfoCurtain'; +import {SmolTokenButton} from 'components/designSystem/SmolTokenButton'; import {CurtainContent} from 'components/Primitives/Curtain'; import {useTokensWithBalance} from 'hooks/useTokensWithBalance'; import {isAddressEqual} from 'viem'; @@ -9,11 +10,12 @@ import {useWeb3} from '@builtbymom/web3/contexts/useWeb3'; import {useTokenList} from '@builtbymom/web3/contexts/WithTokenList'; import {useBalances} from '@builtbymom/web3/hooks/useBalances.multichains'; import {useChainID} from '@builtbymom/web3/hooks/useChainID'; -import {cl, formatAmount, isAddress, toAddress, truncateHex} from '@builtbymom/web3/utils'; +import {usePrices} from '@builtbymom/web3/hooks/usePrices'; +import {cl, isAddress, toAddress} from '@builtbymom/web3/utils'; import * as Dialog from '@radix-ui/react-dialog'; import {useDeepCompareMemo} from '@react-hookz/web'; import {IconLoader} from '@yearn-finance/web-lib/icons/IconLoader'; -import {ImageWithFallback} from '@common/ImageWithFallback'; +import {Warning} from '@common/Primitives/Warning'; import type {ReactElement} from 'react'; import type {TAddress, TToken} from '@builtbymom/web3/types'; @@ -34,60 +36,22 @@ const defaultProps: TBalancesCurtainProps = { onCloseCurtain: (): void => undefined }; -function Token({ - token, - isDisabled, - onSelect -}: { - token: TToken; - isDisabled: boolean; - onSelect: (token: TToken) => void; -}): ReactElement { - return ( - - ); -} - -function FetchedToken({ +// TODO: move to common +export function FetchedToken({ tokenAddress, + displayInfo = false, onSelect }: { tokenAddress: TAddress; - onSelect: (token: TToken) => void; + displayInfo?: boolean; + onSelect?: (token: TToken) => void; }): ReactElement { const {safeChainID} = useChainID(); const {data} = useBalances({tokens: [{address: tokenAddress, chainID: safeChainID}]}); const token = data[safeChainID]?.[tokenAddress]; + + const {data: price} = usePrices({tokens: [token], chainId: safeChainID}); + console.warn(data); if (!token) { @@ -95,11 +59,22 @@ function FetchedToken({ } return ( - + <> + {displayInfo && ( +
    + +
    + )} + onSelect?.(token)} + /> + ); } @@ -111,6 +86,7 @@ function BalancesCurtain(props: { onSelect: TSelectCallback | undefined; selectedTokenAddresses?: TAddress[]; }): ReactElement { + const {safeChainID} = useChainID(); const [searchValue, set_searchValue] = useState(''); const {address} = useWeb3(); const {onConnect} = useWeb3(); @@ -157,6 +133,8 @@ function BalancesCurtain(props: { ); }, [searchValue, props.tokensWithBalance]); + const {data: prices} = usePrices({tokens: filteredTokens, chainId: safeChainID}); + const balancesTextLayout = useMemo(() => { let balancesText = undefined; @@ -175,7 +153,7 @@ function BalancesCurtain(props: { } return null; - }, [address, filteredTokens.length]); + }, [address, filteredTokens.length, searchTokenAddress]); return ( set_searchValue(e.target.value)} /> -
    +
    {balancesTextLayout} {searchTokenAddress && ( ( - { - props.onSelect?.(selected); + onClick={() => { + props.onSelect?.(token); props.onOpenChange(false); }} /> diff --git a/contexts/useTokenListModal.tsx b/contexts/useTokenListModal.tsx index f49af25..c8fc78f 100644 --- a/contexts/useTokenListModal.tsx +++ b/contexts/useTokenListModal.tsx @@ -71,7 +71,6 @@ export const TokenListModalContextApp = ({children}: {children: React.ReactEleme chainID: eachToken.chainId, logoURI: eachToken.logoURI, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN }; } @@ -97,7 +96,6 @@ export const TokenListModalContextApp = ({children}: {children: React.ReactEleme chainID: eachToken.chainId, logoURI: eachToken.logoURI, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN }; } @@ -123,7 +121,6 @@ export const TokenListModalContextApp = ({children}: {children: React.ReactEleme chainID: eachToken.chainId, logoURI: eachToken.logoURI, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN }; } @@ -151,7 +148,6 @@ export const TokenListModalContextApp = ({children}: {children: React.ReactEleme chainID: eachToken.chainId, logoURI: eachToken.logoURI, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN }; } diff --git a/hooks/useDownloadFile.ts b/hooks/useDownloadFile.ts new file mode 100644 index 0000000..731a489 --- /dev/null +++ b/hooks/useDownloadFile.ts @@ -0,0 +1,42 @@ +import type {AxiosResponse} from 'axios'; + +type TDownloadFileProps = { + apiDefinition: () => Promise>; + preDownloading?: () => void; + postDownloading?: () => void; + onError?: () => void; + fileType: string; + fileName?: string; +}; + +type TDownloadedFileInfo = { + download: () => Promise; +}; + +// TODO: move to lib +export const useDownloadFile = ({ + apiDefinition, + preDownloading, + postDownloading, + onError, + fileType, + fileName = 'Token Asset' +}: TDownloadFileProps): TDownloadedFileInfo => { + const download = async (): Promise => { + try { + preDownloading?.(); + const {data} = await apiDefinition(); + const url = URL.createObjectURL(new Blob([data])); + const link = document.createElement('a'); + link.download = `${fileName}.${fileType}`; + link.href = url; + link.click(); + link.parentElement?.removeChild(link); + postDownloading?.(); + } catch (error) { + onError?.(); + } + }; + + return {download}; +}; diff --git a/hooks/useNFTs.tsx b/hooks/useNFTs.tsx index 02f029a..86e444d 100644 --- a/hooks/useNFTs.tsx +++ b/hooks/useNFTs.tsx @@ -2,14 +2,12 @@ import {useCallback} from 'react'; import {ETHEREUM_ENS_ADDRESS, POLYGON_LENS_ADDRESS} from 'utils/constants'; import {decodeAsset} from 'utils/decodeAsset'; import {retrieveENSNameFromNode} from 'utils/tools.ens'; -import {getAbiItem, parseAbi} from 'viem'; -import {erc721ABI} from 'wagmi'; +import {erc721Abi, getAbiItem, parseAbi} from 'viem'; import {toAddress, toBigInt} from '@builtbymom/web3/utils'; -import {getClient} from '@builtbymom/web3/utils/wagmi'; +import {getClient, retrieveConfig} from '@builtbymom/web3/utils/wagmi'; import {multicall} from '@wagmi/core'; import type {TNFT} from 'utils/types/nftMigratooor'; -import type {ContractFunctionConfig} from 'viem'; import type {TAddress} from '@builtbymom/web3/types'; type TNFTLogged = { @@ -19,7 +17,7 @@ type TNFTLogged = { type: 'ERC721' | 'ERC1155'; }; -type TMulticallContract = Parameters[0]['contracts'][0]; +type TMulticallContract = Parameters; function useNFTs(): (userAddress: TAddress, chainID: number) => Promise { const filterEvents = useCallback(async (userAddress: TAddress, chainID: number): Promise => { @@ -31,7 +29,7 @@ function useNFTs(): (userAddress: TAddress, chainID: number) => Promise const detectedNFTs: TNFTLogged[] = []; for (let i = initialBlockNumber; i < currentBlockNumber; i += rangeLimit) { console.log(`Scanning block ${i} to ${i + rangeLimit}`); - const abiItem = getAbiItem({abi: erc721ABI, name: 'Transfer'}); + const abiItem = getAbiItem({abi: erc721Abi, name: 'Transfer'}); const [erc721Sent, erc721Received] = await Promise.all([ publicClient.getLogs({ event: abiItem, @@ -71,23 +69,23 @@ function useNFTs(): (userAddress: TAddress, chainID: number) => Promise } const calls = detectedNFTs.map((detected): TMulticallContract[] => { - const basicCalls: TMulticallContract[] = [ + const basicCalls: any[] = [ { - abi: erc721ABI, + abi: erc721Abi, functionName: 'tokenURI', args: [detected.tokenID], address: detected.address - } satisfies ContractFunctionConfig, + }, { - abi: erc721ABI, + abi: erc721Abi, functionName: 'name', address: detected.address - } satisfies ContractFunctionConfig, + }, { - abi: erc721ABI, + abi: erc721Abi, functionName: 'symbol', address: detected.address - } satisfies ContractFunctionConfig + } ]; if (toAddress(detected.address) === POLYGON_LENS_ADDRESS) { @@ -97,11 +95,11 @@ function useNFTs(): (userAddress: TAddress, chainID: number) => Promise functionName: 'getHandle', args: [detected.tokenID], address: detected.address - } satisfies ContractFunctionConfig); + }); } return basicCalls; }); - const result = await multicall({contracts: calls.flat(), chainId: chainID}); + const result = await multicall(retrieveConfig(), {contracts: calls.flat() as any, chainId: chainID}); let resultIndex = 0; const allDetectedNFTs: TNFT[] = []; diff --git a/hooks/useTokensWithBalance.ts b/hooks/useTokensWithBalance.ts index de56bd9..14983fd 100644 --- a/hooks/useTokensWithBalance.ts +++ b/hooks/useTokensWithBalance.ts @@ -26,7 +26,6 @@ export function useTokensWithBalance(): {tokensWithBalance: TToken[]; isLoading: symbol: wrappedToken.coinSymbol, decimals: wrappedToken.decimals, value: 0, - price: zeroNormalizedBN, balance: zeroNormalizedBN, logoURI: `${process.env.SMOL_ASSETS_URL}/token/${safeChainID}/${ETH_TOKEN_ADDRESS}/logo-32.png` }; diff --git a/next.config.js b/next.config.js index 7c40dcd..e211a23 100755 --- a/next.config.js +++ b/next.config.js @@ -69,7 +69,6 @@ module.exports = phase => destination: '/migratooor', permanent: true }, - // {source: '/', has: [{type: 'host', value: 'migrate.smold.app'}], destination: '/migratooor', permanent: true}, { source: '/github', destination: 'https://github.com/SmolDapp/smoldapp', diff --git a/package.json b/package.json index 8cc01f2..763f8d4 100644 --- a/package.json +++ b/package.json @@ -25,27 +25,29 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-tooltip": "^1.0.7", - "@rainbow-me/rainbowkit": "^1.3.3", + "@rainbow-me/rainbowkit": "^2.0.2", "@react-hookz/web": "^24.0.4", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@vercel/analytics": "^1.2.2", - "@wagmi/core": "^1.4.3", - "@yearn-finance/web-lib": "^3.0.133", - "axios": "^1.6.7", - "cmdk": "^0.2.0", - "date-fns": "^3.3.1", + "@wagmi/core": "^2.6.9", + "@yearn-finance/web-lib": "^3.0.184", + "axios": "^1.6.8", + "cmdk": "^1.0.0", + "date-fns": "^3.6.0", "dayjs": "^1.11.10", "formidable": "^3.5.1", - "framer-motion": "^11.0.8", + "framer-motion": "^11.0.20", "graphql-request": "^6.1.0", "html2canvas": "^1.4.1", "identicon.js": "^2.3.3", "lottie-react": "^2.4.0", - "next": "^13.5.4", + "next": "14.0.4", + "next-plausible": "^3.12.0", "next-pwa": "^5.6.0", "next-seo": "^6.5.0", "papaparse": "^5.4.1", + "rc-input-number": "^9.0.0", "react": "^18.2.0", "react-day-picker": "^8.10.0", "react-dom": "^18.2.0", @@ -58,46 +60,46 @@ "telegraf": "^4.16.3", "use-indexeddb": "^2.0.2", "uuid": "^9.0.1", - "viem": "^1.15.4", - "wagmi": "^1.4.3", - "web3-eth-abi": "^1.10.0" + "viem": "^2.8.18", + "wagmi": "^2.5.12", + "web3-eth-abi": "1.10.0" }, "devDependencies": { - "@builtbymom/web3": "^0.0.36", - "@commitlint/cli": "^19.0.3", - "@commitlint/config-conventional": "^19.0.3", + "@builtbymom/web3": "^0.0.67", + "@commitlint/cli": "^19.2.1", + "@commitlint/config-conventional": "^19.1.0", "@total-typescript/ts-reset": "^0.5.1", - "@types/node": "^20.11.25", + "@types/node": "^20.11.30", "@types/nprogress": "^0.2.3", - "@types/react": "^18.2.64", - "@types/react-dom": "^18.2.21", - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "autoprefixer": "^10.4.18", + "@types/react": "^18.2.67", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", + "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", - "bun-types": "^1.0.30", + "bun-types": "^1.0.34", "eslint": "^8.57.0", - "eslint-config-next": "^14.1.3", + "eslint-config-next": "^14.1.4", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-brackets": "^0.1.3", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-simple-import-sort": "^12.0.0", - "eslint-plugin-tailwindcss": "^3.15.0", + "eslint-plugin-tailwindcss": "^3.15.1", "eslint-plugin-unused-imports": "^3.1.0", "husky": "^9.0.11", "lint-staged": "^15.2.2", "next-transpile-modules": "^10.0.1", - "postcss": "^8.4.35", - "postcss-import": "^16.0.1", + "postcss": "^8.4.38", + "postcss-import": "^16.1.0", "postcss-nesting": "^12.1.0", "prettier": "^3.2.5", - "sass": "^1.71.1", + "sass": "^1.72.0", "stylelint": "^16.2.1", "stylelint-config-standard": "^36.0.0", "ts-loader": "^9.5.1", - "typescript": "^5.4.2" + "typescript": "^5.4.3" } } diff --git a/pages/_app.tsx b/pages/_app.tsx index ac927c5..b562b0b 100755 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,9 +1,9 @@ import React from 'react'; import {Rubik, Source_Code_Pro} from 'next/font/google'; +import PlausibleProvider from 'next-plausible'; import Layout from 'components/designSystem/Layout'; import {WalletContextApp} from '@builtbymom/web3/contexts/useWallet'; import {WithMom} from '@builtbymom/web3/contexts/WithMom'; -import {WithTokenList} from '@builtbymom/web3/contexts/WithTokenList'; import {localhost} from '@builtbymom/web3/utils/wagmi'; import {SafeProvider} from '@gnosis.pm/safe-apps-react-sdk'; import {useLocalStorageValue} from '@react-hookz/web'; @@ -45,18 +45,24 @@ function MyApp(props: AppProps): ReactElement { } `} - - - - + + + +
    {!shouldHidePopover && } -
    -
    -
    + + +
    diff --git a/pages/apps/address-book.tsx b/pages/apps/address-book.tsx index f7fbb95..9514803 100644 --- a/pages/apps/address-book.tsx +++ b/pages/apps/address-book.tsx @@ -1,8 +1,8 @@ -import {Fragment, useCallback, useMemo, useReducer, useState} from 'react'; +import {Fragment, useCallback, useMemo, useState} from 'react'; import {AddressBookEntry} from 'components/designSystem/AddressBookEntry'; -import {AddressBookCurtain} from 'components/designSystem/Curtains/AddressBookCurtain'; import {TextInput} from 'components/Primitives/TextInput'; import {useAddressBook} from 'contexts/useAddressBook'; +import {useAddressBookCurtain} from 'contexts/useAddressBookCurtain'; import Papa from 'papaparse'; import {LayoutGroup, motion} from 'framer-motion'; import {cl, toAddress} from '@builtbymom/web3/utils'; @@ -15,13 +15,6 @@ import type {TAddressBookEntry} from 'contexts/useAddressBook'; import type {ChangeEvent, ReactElement} from 'react'; import type {TAddress} from '@builtbymom/web3/types'; -export type TAddressBookEntryReducer = - | {type: 'SET_SELECTED_ENTRY'; payload: TAddressBookEntry} - | {type: 'SET_ADDRESS'; payload: TAddress | undefined} - | {type: 'SET_LABEL'; payload: string} - | {type: 'SET_CHAINS'; payload: number[]} - | {type: 'SET_IS_FAVORITE'; payload: boolean}; - function AddContactButton(props: {onOpenCurtain: VoidFunction; label?: string}): ReactElement { return (
    ); } diff --git a/pages/apps/disperse.tsx b/pages/apps/disperse.tsx index bf8ee38..1f6e033 100755 --- a/pages/apps/disperse.tsx +++ b/pages/apps/disperse.tsx @@ -1,12 +1,27 @@ import React, {Fragment} from 'react'; import {DefaultSeo} from 'next-seo'; -import Disperse from '@disperse/index'; -import {DisperseContextApp} from '@disperse/useDisperse'; +import Disperse from 'components/sections/Disperse/index'; +import {DisperseContextApp} from 'components/sections/Disperse/useDisperse'; +import {DisperseQueryManagement} from 'components/sections/Disperse/useDisperseQuery'; +import {BalancesCurtainContextApp} from 'contexts/useBalancesCurtain'; import type {ReactElement} from 'react'; function DispersePage(): ReactElement { - return ; + return ( + + {({configuration}) => ( + + + + + + )} + + ); } DispersePage.getLayout = function getLayout(page: ReactElement): ReactElement { @@ -38,7 +53,7 @@ DispersePage.getLayout = function getLayout(page: ReactElement): ReactElement { cardType: 'summary_large_image' }} /> - {page} + {page} ); }; diff --git a/pages/apps/wallet.tsx b/pages/apps/wallet.tsx new file mode 100644 index 0000000..4f5c970 --- /dev/null +++ b/pages/apps/wallet.tsx @@ -0,0 +1,14 @@ +import {Fragment} from 'react'; +import {Wallet} from 'components/sections/Wallet'; + +import type {ReactElement} from 'react'; + +export default function WalletPage(): ReactElement { + return ; +} + +WalletPage.AppName = 'Wallet'; +WalletPage.AppDescription = 'If you want to see tokens form another chains - switch chain in the side bar.'; +WalletPage.getLayout = function getLayout(page: ReactElement): ReactElement { + return {page}; +}; diff --git a/pages/index.tsx b/pages/index.tsx index ba979b8..e5781b5 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,128 +1,14 @@ -import React, {Fragment, useState} from 'react'; -import useWallet from '@builtbymom/web3/contexts/useWallet'; -import {useTokenList} from '@builtbymom/web3/contexts/WithTokenList'; -import {useChainID} from '@builtbymom/web3/hooks/useChainID'; -import {toAddress, zeroNormalizedBN} from '@builtbymom/web3/utils'; -import {getNetwork} from '@builtbymom/web3/utils/wagmi'; -import {useDeepCompareEffect, useDeepCompareMemo} from '@react-hookz/web'; -import {ETH_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {Counter} from '@common/Counter'; -import {ImageWithFallback} from '@common/ImageWithFallback'; +import React, {Fragment} from 'react'; +import {Wallet} from 'components/sections/Wallet'; import type {ReactElement} from 'react'; -import type {TDict, TToken} from '@builtbymom/web3/types'; -function SectionYourTokens(): ReactElement { - const {safeChainID} = useChainID(); - const {currentNetworkTokenList} = useTokenList(); - const [possibleTokens, set_possibleTokens] = useState>({}); - const {getBalance} = useWallet(); - - /* 🔵 - Yearn Finance ************************************************************************** - ** On mount, fetch the token list from the tokenlistooor repo for the cowswap token list, which - ** will be used to populate the tokenToDisperse token combobox. - ** Only the tokens in that list will be displayed as possible destinations. - **********************************************************************************************/ - useDeepCompareEffect((): void => { - const possibleDestinationsTokens: TDict = {}; - const {wrappedToken} = getNetwork(safeChainID).contracts; - if (wrappedToken) { - possibleDestinationsTokens[ETH_TOKEN_ADDRESS] = { - address: ETH_TOKEN_ADDRESS, - chainID: safeChainID, - name: wrappedToken.coinName, - symbol: wrappedToken.coinSymbol, - decimals: wrappedToken.decimals, - value: 0, - price: zeroNormalizedBN, - balance: zeroNormalizedBN, - logoURI: `${process.env.SMOL_ASSETS_URL}/token/${safeChainID}/${ETH_TOKEN_ADDRESS}/logo-32.png` - }; - } - for (const eachToken of Object.values(currentNetworkTokenList)) { - if (eachToken.address === ETH_TOKEN_ADDRESS) { - continue; - } - if (eachToken.chainID === safeChainID) { - possibleDestinationsTokens[toAddress(eachToken.address)] = eachToken; - } - } - set_possibleTokens(possibleDestinationsTokens); - }, [currentNetworkTokenList, safeChainID]); - - const filteredBalances = useDeepCompareMemo((): TToken[] => { - const withBalance = []; - for (const dest of Object.values(possibleTokens)) { - if (getBalance({address: dest.address, chainID: safeChainID}).raw > 0n) { - withBalance.push(dest); - } - } - return withBalance; - }, [possibleTokens, getBalance, safeChainID]); - - return ( - - {filteredBalances.map(token => ( -
    -
    -
    - -
    -
    - {token.symbol} - {toAddress(token.address)} -
    -
    -
    -

    - - - - {'$ 1414'} -

    -
    -
    - ))} -
    - ); +export default function Index(): ReactElement { + return ; } -function Index(): ReactElement { - return ( - -
    -
    -
    - -
    -
    -
    -

    {'Your tokens'}

    -
    - -
    -
    -
    - - ); -} - -Index.AppName = 'Send'; -Index.AppDescription = 'Deliver any of your tokens anywhere'; +Index.AppName = 'Wallet'; +Index.AppDescription = 'If you want to see tokens form another chains - switch chain in the side bar.'; Index.getLayout = function getLayout(page: ReactElement): ReactElement { return {page}; }; - -export default Index; diff --git a/pages/tokenlistooor/[list].tsx b/pages/tokenlistooor/[list].tsx index 3ea61ab..8275445 100755 --- a/pages/tokenlistooor/[list].tsx +++ b/pages/tokenlistooor/[list].tsx @@ -190,7 +190,7 @@ function TokenListContent({list}: {list: TTokenListItem}): ReactElement { if (!networks.find((network): boolean => network.value === item.chainId)) { networks.push({ value: item.chainId, - label: (SUPPORTED_CHAIN_IDS[item.chainId] as any) || `Chain #${item.chainId}` + label: (SUPPORTED_CHAIN_IDS[item.chainId] as string) || `Chain #${item.chainId}` }); } }); diff --git a/utils/actions.ts b/utils/actions.ts index 002d9ed..c5cf6b7 100644 --- a/utils/actions.ts +++ b/utils/actions.ts @@ -1,18 +1,10 @@ import assert from 'assert'; import {SINGLETON_L2} from 'components/apps/safe/utils'; import DISPERSE_ABI from 'utils/abi/disperse.abi'; -import {isAddressEqual} from 'viem'; -import {assertAddress, toBigInt} from '@builtbymom/web3/utils'; -import {defaultTxStatus, handleTx, toWagmiProvider} from '@builtbymom/web3/utils/wagmi'; -import { - erc20ABI, - erc721ABI, - getPublicClient, - prepareSendTransaction, - readContract, - sendTransaction, - waitForTransaction -} from '@wagmi/core'; +import {erc20Abi, erc721Abi, isAddressEqual} from 'viem'; +import {assertAddress, toAddress, toBigInt} from '@builtbymom/web3/utils'; +import {defaultTxStatus, handleTx, retrieveConfig, toWagmiProvider} from '@builtbymom/web3/utils/wagmi'; +import {readContract, sendTransaction, waitForTransactionReceipt} from '@wagmi/core'; import {MAX_UINT_256} from '@yearn-finance/web-lib/utils/constants'; import ERC1155_ABI from './abi/ERC1155.abi'; @@ -56,10 +48,10 @@ type TIsApprovedERC20 = { }; export async function isApprovedERC20(props: TIsApprovedERC20): Promise { const wagmiProvider = await toWagmiProvider(props.connector); - const result = await readContract({ + const result = await readContract(retrieveConfig(), { ...wagmiProvider, - abi: erc20ABI, - address: props.contractAddress, + abi: erc20Abi, + address: toAddress(props.contractAddress), functionName: 'allowance', args: [wagmiProvider.address, props.spenderAddress] }); @@ -83,7 +75,7 @@ export async function approveERC20(props: TApproveERC20): Promise { props.onTrySomethingElse = async (): Promise => { assertAddress(props.spenderAddress, 'spenderAddress'); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: ALTERNATE_ERC20_APPROVE_ABI, functionName: 'approve', args: [props.spenderAddress, props.amount] @@ -91,8 +83,8 @@ export async function approveERC20(props: TApproveERC20): Promise { }; return await handleTx(props, { - address: props.contractAddress, - abi: erc20ABI, + address: toAddress(props.contractAddress), + abi: erc20Abi, functionName: 'approve', args: [props.spenderAddress, props.amount] }); @@ -114,8 +106,8 @@ export async function approveAllERC721(props: TApproveAllERC721): Promise 0, 'No tokens to transfer'); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: ERC1155_ABI, functionName: 'safeBatchTransferFrom', args: [wagmiProvider.address, props.receiverAddress, filteredTokenIDs, filteredAmounts, '0x'] @@ -222,10 +214,10 @@ export async function listERC1155(props: TListERC1155): Promise<[bigint[], bigin const wagmiProvider = await toWagmiProvider(props.connector); assertAddress(wagmiProvider.address, 'User address'); - const balanceOfBatch = await readContract({ + const balanceOfBatch = await readContract(retrieveConfig(), { ...wagmiProvider, abi: ERC1155_ABI, - address: props.contractAddress, + address: toAddress(props.contractAddress), functionName: 'balanceOfBatch', args: [Array(props.tokenIDs.length).fill(wagmiProvider.address), props.tokenIDs] }); @@ -255,8 +247,8 @@ export async function transferERC20(props: TTransferERC20): Promise assertAddress(props.contractAddress); return await handleTx(props, { - address: props.contractAddress, - abi: isAddressEqual(props.contractAddress, usdtAddress) ? (usdtAbi as Abi) : erc20ABI, + address: toAddress(props.contractAddress), + abi: isAddressEqual(props.contractAddress, usdtAddress) ? (usdtAbi as Abi) : erc20Abi, functionName: 'transfer', args: [props.receiverAddress, props.amount] }); @@ -282,26 +274,12 @@ export async function transferEther(props: TTransferEther): Promise assertAddress(wagmiProvider.address, 'userAddress'); try { - let config = await prepareSendTransaction({ + const hash = await sendTransaction(retrieveConfig(), { ...wagmiProvider, to: props.receiverAddress, value: props.amount }); - if (props.shouldAdjustForGas) { - if (!config.maxPriorityFeePerGas) { - const client = await getPublicClient({chainId: wagmiProvider.chainId}); - const gasPrice = await client.getGasPrice(); - config.maxPriorityFeePerGas = gasPrice; - } - const newAmount = toBigInt(config.gas) * toBigInt(config.maxPriorityFeePerGas) + 21_000n; - config = await prepareSendTransaction({ - ...wagmiProvider, - to: props.receiverAddress, - value: props.amount - newAmount - }); - } - const {hash} = await sendTransaction(config); - const receipt = await waitForTransaction({chainId: wagmiProvider.chainId, hash}); + const receipt = await waitForTransactionReceipt(retrieveConfig(), {chainId: wagmiProvider.chainId, hash}); if (receipt.status === 'success') { props.statusHandler?.({...defaultTxStatus, success: true}); } else if (receipt.status === 'reverted') { @@ -341,7 +319,7 @@ export async function disperseETH(props: TDisperseETH): Promise { assert(props.receivers.length === props.amounts.length, 'receivers and amounts must be the same length'); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: DISPERSE_ABI, functionName: 'disperseEther', args: [props.receivers, props.amounts], @@ -373,7 +351,7 @@ export async function disperseERC20(props: TDisperseERC20): Promise assert(props.receivers.length === props.amounts.length, 'receivers and amounts must be the same length'); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: DISPERSE_ABI, functionName: 'disperseToken', args: [props.tokenToDisperse, props.receivers, props.amounts] @@ -395,7 +373,7 @@ export async function cloneSafe(props: TCloneSafe): Promise { assertAddress(props.contractAddress); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: GNOSIS_SAFE_PROXY_FACTORY, functionName: 'createProxyWithNonce', args: [SINGLETON_L2, props.initializers, props.salt] @@ -424,7 +402,7 @@ export async function multicall(props: TMulticall): Promise { const value = props.multicallData.reduce((a, b): bigint => a + b.value, 0n); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: MULTICALL_ABI, functionName: 'aggregate3Value', args: [props.multicallData], @@ -456,7 +434,7 @@ type TNewVestingContract = TWriteTransaction & { export async function deployVestingContract(props: TNewVestingContract): Promise { assertAddress(props.contractAddress); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: YVESTING_FACTORY_ABI, functionName: 'deploy_vesting_contract', args: [ @@ -483,7 +461,7 @@ type TClaimFromVesting = TWriteTransaction & { export async function claimFromVesting(props: TClaimFromVesting): Promise { assertAddress(props.contractAddress); return await handleTx(props, { - address: props.contractAddress, + address: toAddress(props.contractAddress), abi: YVESTING_SIMPLE_ABI, functionName: 'claim', args: [props.streamOwner] diff --git a/utils/notifier.ts b/utils/notifier.ts index 29ee74c..27d84c8 100644 --- a/utils/notifier.ts +++ b/utils/notifier.ts @@ -1,10 +1,10 @@ import axios from 'axios'; import {formatAmount, toNormalizedBN, truncateHex, zeroNormalizedBN} from '@builtbymom/web3/utils'; -import {getNetwork} from '@wagmi/core'; +import {getNetwork} from '@builtbymom/web3/utils/wagmi'; import {EIP3770_PREFIX} from './eip-3770'; -import type {TSendInputElement} from 'components/designSystem/SmolTokenAmountInput'; +import type {TTokenAmountInputElement} from 'components/designSystem/SmolTokenAmountInput'; import type {Hex} from 'viem'; import type {TAddress, TToken} from '@builtbymom/web3/types'; @@ -49,8 +49,7 @@ export function notifyDisperse(props: { if (!props.tokenToDisperse) { return; } - const {chains} = getNetwork(); - const currentChain = chains.find((chain): boolean => chain.id === props.chainID); + const currentChain = getNetwork(props.chainID); const explorerBaseURI = currentChain?.blockExplorers?.default?.url || 'https://etherscan.io'; const decimals = props.tokenToDisperse.decimals || 18; const sumDispersed = props.amounts.reduce((sum, amount): bigint => sum + amount, 0n); @@ -85,14 +84,13 @@ export function notifyDisperse(props: { export function notifySend(props: { chainID: number; - tokensMigrated: TSendInputElement[]; + tokensMigrated: TTokenAmountInputElement[]; hashes: Hex[]; to: TAddress; from: TAddress; type: 'EOA' | 'SAFE'; }): void { - const {chains} = getNetwork(); - const currentChain = chains.find((chain): boolean => chain.id === props.chainID); + const currentChain = getNetwork(props.chainID); const explorerBaseURI = currentChain?.blockExplorers?.default?.url || 'https://etherscan.io'; const getChainPrefix = EIP3770_PREFIX.find((item): boolean => item.chainId === props.chainID); const chainPrefix = getChainPrefix?.shortName || 'eth'; diff --git a/utils/tools.chains.ts b/utils/tools.chains.ts index 763447c..762b03f 100644 --- a/utils/tools.chains.ts +++ b/utils/tools.chains.ts @@ -16,9 +16,10 @@ import {indexedWagmiChains} from '@builtbymom/web3/utils/wagmi'; import {COINGECKO_GAS_COIN_IDS, NFTMIGRATOOOR_CONTRACT_PER_CHAIN, SAFE_API_URI} from './constants'; +import type {Chain} from 'wagmi/chains'; import type {TChainContract, TExtendedChain} from '@builtbymom/web3/utils/wagmi'; -export const supportedNetworks = [ +export const supportedNetworks: Chain[] = [ mainnet, {...optimism, name: 'Optimism'}, bsc, @@ -30,7 +31,7 @@ export const supportedNetworks = [ base, arbitrum ]; -export const supportedTestNetworks = [goerli, baseGoerli]; +export const supportedTestNetworks: Chain[] = [goerli, baseGoerli]; export type TAppExtendedChain = TExtendedChain & { safeApiUri?: string; diff --git a/utils/tools.ens.ts b/utils/tools.ens.ts index 99ae456..0960721 100644 --- a/utils/tools.ens.ts +++ b/utils/tools.ens.ts @@ -1,7 +1,8 @@ import {gql, request} from 'graphql-request'; import {isAddress, toHex} from 'viem'; import {toAddress} from '@builtbymom/web3/utils'; -import {fetchEnsAddress} from '@wagmi/core'; +import {retrieveConfig} from '@builtbymom/web3/utils/wagmi'; +import {getEnsAddress} from '@wagmi/core'; import type {TAddress} from '@builtbymom/web3/types'; @@ -21,7 +22,7 @@ export async function retrieveENSNameFromNode(tokenId: bigint): Promise export async function checkENSValidity(ens: string): Promise<[TAddress, boolean]> { try { - const resolvedAddress = await fetchEnsAddress({name: ens, chainId: 1}); + const resolvedAddress = await getEnsAddress(retrieveConfig(), {name: ens, chainId: 1}); if (resolvedAddress) { if (isAddress(resolvedAddress)) { return [toAddress(resolvedAddress), true]; diff --git a/yarn.lock b/yarn.lock index f5d3e4a..b940dc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -183,6 +183,13 @@ dependencies: "@babel/types" "^7.22.15" +"@babel/helper-module-imports@^7.16.7": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" @@ -936,13 +943,27 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.2", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.4", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.1", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": version "7.23.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -977,48 +998,57 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@builtbymom/web3@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@builtbymom/web3/-/web3-0.0.20.tgz#5685e11f2b3a90c0a5d7b06692aaa9d500792fc5" - integrity sha512-no59LxzMChgZZd6XnJuh69go3PtD/3k1dTQ7KX3dpYhXZxLX2LdaDqnPVMsXmz6IovMpjAmKrkCEqEN6jlPRmA== +"@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: - "@rainbow-me/rainbowkit" "^1.3.0" - "@react-hookz/web" "^24.0.2" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@builtbymom/web3@^0.0.59": + version "0.0.59" + resolved "https://registry.yarnpkg.com/@builtbymom/web3/-/web3-0.0.59.tgz#a909ec5138dc90a9f284b57fc91d3d61ae1bd510" + integrity sha512-gwjDfdmRxvW1q9ROME98yrJDIW4i3qUo+okpGxRXRZoqIRftQx/3XkqekLscGLNBZIUZ6/gH5Lw51DpSqGAoiw== + dependencies: + "@rainbow-me/rainbowkit" "^2.0.2" + "@react-hookz/web" "^24.0.4" + "@tanstack/react-query" "^5.28.2" "@total-typescript/ts-reset" "^0.5.1" - "@wagmi/chains" "1.8.0" - "@wagmi/core" "^1.4.7" - bun-types "^1.0.22" + "@wagmi/core" "^2.6.5" + bun-types "^1.0.30" ethers "5.7.2" eventemitter3 "^5.0.1" - lint-staged "^15.2.0" - next "^14.0.4" - prettier "2.8.8" + lint-staged "^15.2.2" + next "^14.1.3" + prettier "^3.2.5" react-hot-toast "2.4.1" - swr "^2.2.4" - viem "^1.19.9" - wagmi "^1.4.7" + swr "^2.2.5" + viem "^2.8.9" + wagmi "^2.5.7" zod "^3.22.4" -"@builtbymom/web3@^0.0.36": - version "0.0.36" - resolved "https://registry.yarnpkg.com/@builtbymom/web3/-/web3-0.0.36.tgz#b60771a6fd95edde36bc26ec38767a3972190c9a" - integrity sha512-Ch5uusYPx963mxjm3RVLPAy1WdnQ+NLbSNtOl4+RTAnxZEOljPJDRlPecBDGpYDo+A4QsQ6oMF6HocZ/+CfAig== +"@builtbymom/web3@^0.0.67": + version "0.0.67" + resolved "https://registry.yarnpkg.com/@builtbymom/web3/-/web3-0.0.67.tgz#fb97fdcd26797f8b61afc9c9557c167d64175994" + integrity sha512-6zWmUO8ZWJAC2IssMe22OZxuPzC6LWbPhsoSfkAZETHaPMfMYV1KVIujyWbv8G1PaqbCEvLhr9gNF0BHegG+zw== dependencies: - "@rainbow-me/rainbowkit" "^1.3.0" - "@react-hookz/web" "^24.0.2" + "@rainbow-me/rainbowkit" "^2.0.2" + "@react-hookz/web" "^24.0.4" + "@tanstack/react-query" "^5.28.2" "@total-typescript/ts-reset" "^0.5.1" - "@wagmi/chains" "1.8.0" - "@wagmi/core" "^1.4.7" - bun-types "^1.0.22" + "@wagmi/core" "^2.6.5" + bun-types "^1.0.30" ethers "5.7.2" eventemitter3 "^5.0.1" - lint-staged "^15.2.0" - next "^14.0.4" - prettier "2.8.8" + lint-staged "^15.2.2" + next "^14.1.3" + prettier "^3.2.5" react-hot-toast "2.4.1" - swr "^2.2.4" - viem "^1.19.9" - wagmi "^1.4.7" + swr "^2.2.5" + viem "^2.8.9" + wagmi "^2.5.7" zod "^3.22.4" "@closeio/use-abortable-effect@^1.0.0": @@ -1026,46 +1056,38 @@ resolved "https://registry.yarnpkg.com/@closeio/use-abortable-effect/-/use-abortable-effect-1.0.0.tgz#b1ae42106509ce888899c20465d9a33236cfe1a1" integrity sha512-bIElhRN/Oy54uqL0biIcKDK2gV+bbtdXTbbexEzBQBVvpWfP9i9qFR/nW9eUQWUYJjDZpSv+dJlfCm3c8sBQkw== -"@coinbase/wallet-sdk@^3.6.6": - version "3.7.2" - resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.7.2.tgz#7a89bd9e3a06a1f26d4480d8642af33fb0c7e3aa" - integrity sha512-lIGvXMsgpsQWci/XOMQIJ2nIZ8JUy/L+bvC0wkRaYarr0YylwpXrJ2gRM3hCXPS477pkyO7N/kSiAoRgEXUdJQ== +"@coinbase/wallet-sdk@3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.1.tgz#503a14671bb392d653623ef2340934e213ac971f" + integrity sha512-cGUE8wm1/cMI8irRMVOqbFWYcnNugqCtuy2lnnHfgloBg+GRLs9RsrkOUDMdv/StfUeeKhCDyYudsXXvcL1xIA== dependencies: - "@metamask/safe-event-emitter" "2.0.0" - "@solana/web3.js" "^1.70.1" - bind-decorator "^1.0.11" - bn.js "^5.1.1" + bn.js "^5.2.1" buffer "^6.0.3" - clsx "^1.1.0" - eth-block-tracker "6.1.0" - eth-json-rpc-filters "5.1.0" - eth-rpc-errors "4.0.2" - json-rpc-engine "6.1.0" - keccak "^3.0.1" - preact "^10.5.9" - qs "^6.10.3" - rxjs "^6.6.3" + clsx "^1.2.1" + eth-block-tracker "^7.1.0" + eth-json-rpc-filters "^6.0.0" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" sha.js "^2.4.11" - stream-browserify "^3.0.0" - util "^0.12.4" -"@commitlint/cli@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.0.3.tgz#a415069099864b75dc65bb22c703c11a3837f258" - integrity sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g== +"@commitlint/cli@^19.2.1": + version "19.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.2.1.tgz#8f00d27a8b7c7780e75b06fd4658fdc1e9209f1b" + integrity sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg== dependencies: "@commitlint/format" "^19.0.3" - "@commitlint/lint" "^19.0.3" - "@commitlint/load" "^19.0.3" - "@commitlint/read" "^19.0.3" + "@commitlint/lint" "^19.1.0" + "@commitlint/load" "^19.2.0" + "@commitlint/read" "^19.2.1" "@commitlint/types" "^19.0.3" execa "^8.0.1" yargs "^17.0.0" -"@commitlint/config-conventional@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.0.3.tgz#28b8b9e7561366bf663c2955e4fe8e3fd954675d" - integrity sha512-vh0L8XeLaEzTe8VCxSd0gAFvfTK0RFolrzw4o431bIuWJfi/yRCHJlsDwus7wW2eJaFFDR0VFXJyjGyDQhi4vA== +"@commitlint/config-conventional@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz#6b4b7938aa3bc308214a683247520f602e55961e" + integrity sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA== dependencies: "@commitlint/types" "^19.0.3" conventional-changelog-conventionalcommits "^7.0.2" @@ -1111,27 +1133,27 @@ "@commitlint/types" "^19.0.3" semver "^7.6.0" -"@commitlint/lint@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.0.3.tgz#7db83188310c1a5fbdffebbb32a35aa1b0aacee3" - integrity sha512-uHPyRqIn57iIplYa5xBr6oNu5aPXKGC4WLeuHfqQHclwIqbJ33g3yA5fIA+/NYnp5ZM2EFiujqHFaVUYj6HlKA== +"@commitlint/lint@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.1.0.tgz#0f4b26b1452d59a92a28b5fa6de9bdbee18399a1" + integrity sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw== dependencies: "@commitlint/is-ignored" "^19.0.3" "@commitlint/parse" "^19.0.3" "@commitlint/rules" "^19.0.3" "@commitlint/types" "^19.0.3" -"@commitlint/load@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.0.3.tgz#f05ce3830482e3908799f8e6eb202c8d9713efd8" - integrity sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw== +"@commitlint/load@^19.2.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295" + integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ== dependencies: "@commitlint/config-validator" "^19.0.3" "@commitlint/execute-rule" "^19.0.0" - "@commitlint/resolve-extends" "^19.0.3" + "@commitlint/resolve-extends" "^19.1.0" "@commitlint/types" "^19.0.3" chalk "^5.3.0" - cosmiconfig "^8.3.6" + cosmiconfig "^9.0.0" cosmiconfig-typescript-loader "^5.0.0" lodash.isplainobject "^4.0.6" lodash.merge "^4.6.2" @@ -1151,20 +1173,21 @@ conventional-changelog-angular "^7.0.0" conventional-commits-parser "^5.0.0" -"@commitlint/read@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.0.3.tgz#b04abaa4daae2ba84f5f77a3800a6c3bc27cd94d" - integrity sha512-b5AflTyAXkUx5qKw4TkjjcOccXZHql3JqMi522knTQktq2AubKXFz60Sws+K4FsefwPws6fGz9mqiI/NvsvxFA== +"@commitlint/read@^19.2.1": + version "19.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.2.1.tgz#7296b99c9a989e60e5927fff8388a1dd44299c2f" + integrity sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw== dependencies: "@commitlint/top-level" "^19.0.0" "@commitlint/types" "^19.0.3" + execa "^8.0.1" git-raw-commits "^4.0.0" minimist "^1.2.8" -"@commitlint/resolve-extends@^19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.0.3.tgz#04d0e95f9119983765741df603d36f4457f56c13" - integrity sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA== +"@commitlint/resolve-extends@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa" + integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg== dependencies: "@commitlint/config-validator" "^19.0.3" "@commitlint/types" "^19.0.3" @@ -1241,7 +1264,35 @@ dependencies: tslib "^2.4.0" -"@emotion/hash@^0.9.0": +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.0", "@emotion/hash@^0.9.1": version "0.9.1" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== @@ -1253,11 +1304,85 @@ dependencies: "@emotion/memoize" "0.7.4" +"@emotion/is-prop-valid@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.10.6": + version "11.11.4" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0" + integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.10.6": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1290,11 +1415,29 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@ethereumjs/common@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" + integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== + dependencies: + "@ethereumjs/util" "^8.1.0" + crc-32 "^1.2.0" + "@ethereumjs/rlp@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== +"@ethereumjs/tx@^4.1.2", "@ethereumjs/tx@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" + integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== + dependencies: + "@ethereumjs/common" "^3.2.0" + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.1.0" + ethereum-cryptography "^2.0.0" + "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -1914,21 +2057,168 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": +"@metamask/eth-json-rpc-provider@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz#3fd5316c767847f4ca107518b611b15396a5a32c" + integrity sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA== + dependencies: + "@metamask/json-rpc-engine" "^7.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + +"@metamask/json-rpc-engine@^7.0.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" + integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== + dependencies: + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + +"@metamask/object-multiplex@^1.1.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@metamask/object-multiplex/-/object-multiplex-1.3.0.tgz#459de4862aa5a5a025dabceadda0ffd553ca4b25" + integrity sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ== + dependencies: + end-of-stream "^1.4.4" + once "^1.4.0" + readable-stream "^2.3.3" + +"@metamask/onboarding@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/onboarding/-/onboarding-1.0.1.tgz#14a36e1e175e2f69f09598e2008ab6dc1b3297e6" + integrity sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ== + dependencies: + bowser "^2.9.0" + +"@metamask/post-message-stream@^6.1.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@metamask/post-message-stream/-/post-message-stream-6.2.0.tgz#3db0a50adc2b2206d1bb95739e7fff49e36e0324" + integrity sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw== + dependencies: + "@metamask/utils" "^5.0.0" + readable-stream "2.3.3" + +"@metamask/providers@^10.2.1": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@metamask/providers/-/providers-10.2.1.tgz#61304940adeccc7421dcda30ffd1d834273cc77b" + integrity sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA== + dependencies: + "@metamask/object-multiplex" "^1.1.0" + "@metamask/safe-event-emitter" "^2.0.0" + "@types/chrome" "^0.0.136" + detect-browser "^5.2.0" + eth-rpc-errors "^4.0.2" + extension-port-stream "^2.0.1" + fast-deep-equal "^2.0.1" + is-stream "^2.0.0" + json-rpc-engine "^6.1.0" + json-rpc-middleware-stream "^4.2.1" + pump "^3.0.0" + webextension-polyfill-ts "^0.25.0" + +"@metamask/rpc-errors@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.2.1.tgz#f5daf429ededa7cb83069dc621bd5738fe2a1d80" + integrity sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw== + dependencies: + "@metamask/utils" "^8.3.0" + fast-safe-stringify "^2.0.6" + +"@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== -"@metamask/utils@^3.0.1": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-3.6.0.tgz#b218b969a05ca7a8093b5d1670f6625061de707d" - integrity sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ== +"@metamask/safe-event-emitter@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz#e89b840a7af8097a8ed4953d8dc8470d1302d3ef" + integrity sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw== + +"@metamask/sdk-communication-layer@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.14.3.tgz#0e7ec8e472641273da5802f3b357687ce12369c3" + integrity sha512-yjSbj8y7fFbQXv2HBzUX6D9C8BimkCYP6BDV7hdw53W8b/GlYCtXVxUFajQ9tuO1xPTRjR/xt/dkdr2aCi6WGw== dependencies: + bufferutil "^4.0.8" + cross-fetch "^3.1.5" + date-fns "^2.29.3" + eciesjs "^0.3.16" + eventemitter2 "^6.4.5" + socket.io-client "^4.5.1" + utf-8-validate "^6.0.3" + uuid "^8.3.2" + +"@metamask/sdk-install-modal-web@0.14.1": + version "0.14.1" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.14.1.tgz#c8e64b4f7d2dac262c2ec28025c541b258478c31" + integrity sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q== + dependencies: + "@emotion/react" "^11.10.6" + "@emotion/styled" "^11.10.6" + i18next "22.5.1" + qr-code-styling "^1.6.0-rc.1" + react "^18.2.0" + react-dom "^18.2.0" + react-i18next "^13.2.2" + +"@metamask/sdk@0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.14.3.tgz#ec1ecf00edef981fd17e2c5cf4ec40ce0a43a55c" + integrity sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg== + dependencies: + "@metamask/onboarding" "^1.0.1" + "@metamask/post-message-stream" "^6.1.0" + "@metamask/providers" "^10.2.1" + "@metamask/sdk-communication-layer" "0.14.3" + "@metamask/sdk-install-modal-web" "0.14.1" + "@react-native-async-storage/async-storage" "^1.17.11" + "@types/dom-screen-wake-lock" "^1.0.0" + bowser "^2.9.0" + cross-fetch "^4.0.0" + eciesjs "^0.3.15" + eth-rpc-errors "^4.0.3" + eventemitter2 "^6.4.7" + extension-port-stream "^2.0.1" + i18next "22.5.1" + i18next-browser-languagedetector "^7.1.0" + obj-multiplex "^1.0.0" + pump "^3.0.0" + qrcode-terminal-nooctal "^0.12.1" + react-i18next "^13.2.2" + react-native-webview "^11.26.0" + readable-stream "^2.3.7" + rollup-plugin-visualizer "^5.9.2" + socket.io-client "^4.5.1" + util "^0.12.4" + uuid "^8.3.2" + +"@metamask/utils@^5.0.0", "@metamask/utils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" + integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== + dependencies: + "@ethereumjs/tx" "^4.1.2" "@types/debug" "^4.1.7" debug "^4.3.4" semver "^7.3.8" superstruct "^1.0.3" +"@metamask/utils@^8.3.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.4.0.tgz#f44812c96467a4e1b70b2edff6ee89a9caa4e354" + integrity sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + superstruct "^1.0.3" + uuid "^9.0.1" + "@motionone/animation@^10.15.1", "@motionone/animation@^10.17.0": version "10.17.0" resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca" @@ -1998,113 +2288,163 @@ "@motionone/dom" "^10.16.4" tslib "^2.3.1" -"@next/env@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc" - integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw== +"@next/env@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.4.tgz#d5cda0c4a862d70ae760e58c0cd96a8899a2e49a" + integrity sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ== "@next/env@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== -"@next/eslint-plugin-next@14.1.3": - version "14.1.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.3.tgz#31ffb36dbd5d04537aff83eb69ec23007d081608" - integrity sha512-VCnZI2cy77Yaj3L7Uhs3+44ikMM1VD/fBMwvTBb3hIaTIuqa+DmG4dhUDq+MASu3yx97KhgsVJbsas0XuiKyww== +"@next/env@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" + integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== + +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz#b15d139d8971360fca29be3bdd703c108c9a45fb" - integrity sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA== +"@next/swc-darwin-arm64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618" + integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg== "@next/swc-darwin-arm64@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== -"@next/swc-darwin-x64@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz#9c72ee31cc356cb65ce6860b658d807ff39f1578" - integrity sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA== +"@next/swc-darwin-arm64@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" + integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== + +"@next/swc-darwin-x64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz#9940c449e757d0ee50bb9e792d2600cc08a3eb3b" + integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== "@next/swc-darwin-x64@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== -"@next/swc-linux-arm64-gnu@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz#59f5f66155e85380ffa26ee3d95b687a770cfeab" - integrity sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg== +"@next/swc-darwin-x64@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" + integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== + +"@next/swc-linux-arm64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21" + integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w== "@next/swc-linux-arm64-gnu@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== -"@next/swc-linux-arm64-musl@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz#f012518228017052736a87d69bae73e587c76ce2" - integrity sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q== +"@next/swc-linux-arm64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" + integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== + +"@next/swc-linux-arm64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd" + integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ== "@next/swc-linux-arm64-musl@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== -"@next/swc-linux-x64-gnu@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz#339b867a7e9e7ee727a700b496b269033d820df4" - integrity sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw== +"@next/swc-linux-arm64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" + integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== + +"@next/swc-linux-x64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32" + integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A== "@next/swc-linux-x64-gnu@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== -"@next/swc-linux-x64-musl@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz#ae0ae84d058df758675830bcf70ca1846f1028f2" - integrity sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ== +"@next/swc-linux-x64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" + integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== + +"@next/swc-linux-x64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247" + integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw== "@next/swc-linux-x64-musl@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== -"@next/swc-win32-arm64-msvc@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz#a5cc0c16920485a929a17495064671374fdbc661" - integrity sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg== +"@next/swc-linux-x64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" + integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== + +"@next/swc-win32-arm64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3" + integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w== "@next/swc-win32-arm64-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== -"@next/swc-win32-ia32-msvc@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz#6a2409b84a2cbf34bf92fe714896455efb4191e4" - integrity sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg== +"@next/swc-win32-arm64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" + integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== + +"@next/swc-win32-ia32-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600" + integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg== "@next/swc-win32-ia32-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== -"@next/swc-win32-x64-msvc@13.5.6": - version "13.5.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz#4a3e2a206251abc729339ba85f60bc0433c2865d" - integrity sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ== +"@next/swc-win32-ia32-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" + integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== + +"@next/swc-win32-x64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1" + integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A== "@next/swc-win32-x64-msvc@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== +"@next/swc-win32-x64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" + integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== + "@noble/curves@1.1.0", "@noble/curves@~1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" @@ -2119,13 +2459,6 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" - integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== - dependencies: - "@noble/hashes" "1.3.3" - "@noble/hashes@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" @@ -2136,7 +2469,12 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@1.3.3", "@noble/hashes@^1.3.2", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1", "@noble/hashes@~1.3.2": +"@noble/hashes@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1", "@noble/hashes@~1.3.2": version "1.3.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== @@ -2271,13 +2609,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/primitive@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" - integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" @@ -2304,13 +2635,6 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-slot" "1.0.2" -"@radix-ui/react-compose-refs@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" - integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" @@ -2318,13 +2642,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-context@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" - integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-context@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" @@ -2332,28 +2649,7 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dialog@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz#997e97cb183bc90bd888b26b8e23a355ac9fe5f0" - integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-dismissable-layer" "1.0.0" - "@radix-ui/react-focus-guards" "1.0.0" - "@radix-ui/react-focus-scope" "1.0.0" - "@radix-ui/react-id" "1.0.0" - "@radix-ui/react-portal" "1.0.0" - "@radix-ui/react-presence" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-slot" "1.0.0" - "@radix-ui/react-use-controllable-state" "1.0.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.4" - -"@radix-ui/react-dialog@^1.0.5": +"@radix-ui/react-dialog@1.0.5", "@radix-ui/react-dialog@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz#71657b1b116de6c7a0b03242d7d43e01062c7300" integrity sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q== @@ -2381,18 +2677,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dismissable-layer@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" - integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.0" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-escape-keydown" "1.0.0" - "@radix-ui/react-dismissable-layer@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" @@ -2419,13 +2703,6 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-focus-guards@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" - integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" @@ -2433,16 +2710,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-focus-scope@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz#95a0c1188276dc8933b1eac5f1cdb6471e01ade5" - integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-focus-scope@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" @@ -2453,14 +2720,6 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-callback-ref" "1.0.1" -"@radix-ui/react-id@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" - integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-id@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" @@ -2533,14 +2792,6 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" -"@radix-ui/react-portal@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" - integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.0" - "@radix-ui/react-portal@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" @@ -2549,15 +2800,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" -"@radix-ui/react-presence@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" - integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-use-layout-effect" "1.0.0" - "@radix-ui/react-presence@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" @@ -2567,14 +2809,6 @@ "@radix-ui/react-compose-refs" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" -"@radix-ui/react-primitive@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" - integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "1.0.0" - "@radix-ui/react-primitive@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" @@ -2627,14 +2861,6 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-slot@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" - integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - "@radix-ui/react-slot@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" @@ -2662,13 +2888,6 @@ "@radix-ui/react-use-controllable-state" "1.0.1" "@radix-ui/react-visually-hidden" "1.0.3" -"@radix-ui/react-use-callback-ref@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" - integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" @@ -2676,14 +2895,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-use-controllable-state@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" - integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-controllable-state@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" @@ -2692,14 +2903,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" -"@radix-ui/react-use-escape-keydown@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" - integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.0" - "@radix-ui/react-use-escape-keydown@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" @@ -2708,13 +2911,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" -"@radix-ui/react-use-layout-effect@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" - integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" @@ -2760,32 +2956,31 @@ dependencies: "@babel/runtime" "^7.13.10" -"@rainbow-me/rainbowkit@^1.3.0", "@rainbow-me/rainbowkit@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-1.3.3.tgz#3826f7a4e6827c35f876a4c3008da43a8cbfed28" - integrity sha512-IsUlBCy4SZfo6zFEZgPvGr1MLe/rK4sZzoBtYHRPjRqDHTXrYqDsp3ThTIZWh2HSIq0jU5gMA/94mFnT5kwMLA== +"@rainbow-me/rainbowkit@^2.0.1", "@rainbow-me/rainbowkit@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.0.2.tgz#6122e349b7b87e4bb57ece374747c21915816ae7" + integrity sha512-xm/3iWxwL/ATVVWjtYVGviTJ4ldXwcvaic+bQnGg/pqzf8zKONkuzd5gNWLw0ft1iNG2IPHL1ABP9UoR2Trlaw== dependencies: "@vanilla-extract/css" "1.14.0" "@vanilla-extract/dynamic" "2.1.0" "@vanilla-extract/sprinkles" "1.6.1" clsx "2.1.0" - i18n-js "^4.3.2" qrcode "1.5.3" react-remove-scroll "2.5.7" ua-parser-js "^1.0.37" +"@rc-component/mini-decimal@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" + integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== + dependencies: + "@babel/runtime" "^7.18.0" + "@react-hookz/deep-equal@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@react-hookz/deep-equal/-/deep-equal-1.0.4.tgz#68a71f36cbc88724b3ce6f4036183778b6e7f282" integrity sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg== -"@react-hookz/web@^24.0.2": - version "24.0.2" - resolved "https://registry.yarnpkg.com/@react-hookz/web/-/web-24.0.2.tgz#8db0e083ffdf1c1419c65960cb36fb7d3acf330c" - integrity sha512-LhWw/LzhxKYRZDRIKd42mCMqRa9pTMSpwpwnfpa0hYoUNcrHw//3NlpoPlynkmKT3G88mumTTuV0HeWnNkarog== - dependencies: - "@react-hookz/deep-equal" "^1.0.4" - "@react-hookz/web@^24.0.4": version "24.0.4" resolved "https://registry.yarnpkg.com/@react-hookz/web/-/web-24.0.4.tgz#7a13d4c2cc65861b926ef6c4452fba00408c8778" @@ -2793,6 +2988,13 @@ dependencies: "@react-hookz/deep-equal" "^1.0.4" +"@react-native-async-storage/async-storage@^1.17.11": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz#cad3cd4fab7dacfe9838dce6ecb352f79150c883" + integrity sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA== + dependencies: + merge-options "^3.0.4" + "@rollup/plugin-babel@^5.2.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -2835,15 +3037,15 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.0.tgz#b5bc1e081428794f6a4d239707b359404be35ce2" integrity sha512-Jh4t/593gxs0lJZ/z3NnasKlplXT2f+4y/LZYuaKZW5KAaiVFL/fThhs+17EbUd53jUVJ0QudYCBGbN/psvaqg== -"@safe-global/safe-apps-provider@^0.18.1": - version "0.18.2" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.2.tgz#336f3f4bb6ebbad9354e6551687491efc73991bc" - integrity sha512-yHHAcppwE7aIUWEeZiYAClQzZCdP5l0Kbd0CBlhKAsTcqZnx4Gh3G3G3frY5LlWcGzp9qmQ5jv+J1GBpaZLDgw== +"@safe-global/safe-apps-provider@0.18.1": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" + integrity sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg== dependencies: - "@safe-global/safe-apps-sdk" "^9.0.0" + "@safe-global/safe-apps-sdk" "^8.1.0" events "^3.3.0" -"@safe-global/safe-apps-sdk@^8.1.0": +"@safe-global/safe-apps-sdk@8.1.0", "@safe-global/safe-apps-sdk@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w== @@ -2851,19 +3053,16 @@ "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" viem "^1.0.0" -"@safe-global/safe-apps-sdk@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.0.0.tgz#56635663f5a73773c5929d9c45ffea2b75dab69b" - integrity sha512-fEqmQBU3JqTjORSl3XYrcaxdxkUqeeM39qsQjqCzzTHioN8DEfg3JCLq6EBoXzcKTVOYi8SPzLV7KJccdDw+4w== - dependencies: - "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" - viem "^1.6.0" - "@safe-global/safe-gateway-typescript-sdk@^3.5.3": version "3.14.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.14.0.tgz#9581c524c1ea4956555f40761eb6b4007392aa82" integrity sha512-/dqU66RvHw50n+7x3nwnJedq8V6iLQyoWitNdjx5cFTBmae+rpP+LvHq+LqZfXJVkB1qNytMdjFjdyES0t79gQ== +"@scure/base@^1.1.3": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" + integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== + "@scure/base@~1.1.0", "@scure/base@~1.1.2": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" @@ -2895,33 +3094,10 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@solana/buffer-layout@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" - integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.70.1": - version "1.89.1" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.89.1.tgz#52df6820f2d088c4558aa359af40580a03d10ec9" - integrity sha512-t9TTLtPQxtQB3SAf/5E8xPXfVDsC6WGOsgKY02l2cbe0HLymT7ynE8Hu48Lk5qynHCquj6nhISfEHcjMkYpu/A== - dependencies: - "@babel/runtime" "^7.23.4" - "@noble/curves" "^1.2.0" - "@noble/hashes" "^1.3.2" - "@solana/buffer-layout" "^4.0.1" - agentkeepalive "^4.5.0" - bigint-buffer "^1.1.5" - bn.js "^5.2.1" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.3" - fast-stable-stringify "^1.0.0" - jayson "^4.1.0" - node-fetch "^2.7.0" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== "@stablelib/aead@^1.0.1": version "1.0.1" @@ -3091,39 +3267,17 @@ lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" -"@tanstack/query-core@4.36.1": - version "4.36.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.36.1.tgz#79f8c1a539d47c83104210be2388813a7af2e524" - integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA== - -"@tanstack/query-persist-client-core@4.36.1": - version "4.36.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.36.1.tgz#4d7284994bdc2a15fe6cbe7161be21e03033fe12" - integrity sha512-eocgCeI7D7TRv1IUUBMfVwOI0wdSmMkBIbkKhqEdTrnUHUQEeOaYac8oeZk2cumAWJdycu6P/wB+WqGynTnzXg== - dependencies: - "@tanstack/query-core" "4.36.1" +"@tanstack/query-core@5.28.6": + version "5.28.6" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.28.6.tgz#a3bdb108f9f8d4e2ba3163068dbe6ff55b905a81" + integrity sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA== -"@tanstack/query-sync-storage-persister@^4.27.1": - version "4.36.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.36.1.tgz#bf5d800d54416bc88f150792a53e25ed8aa8769f" - integrity sha512-yMEt5hWe2+1eclf1agMtXHnPIkxEida0lYWkfdhR8U6KXk/lO4Vca6piJmhKI85t0NHlx3l/z6zX+t/Fn5O9NA== +"@tanstack/react-query@^5.28.2": + version "5.28.6" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.28.6.tgz#0d52b0a98a1d842debf9c65496e20a9981a23bc4" + integrity sha512-/DdYuDBSsA21Qbcder1R8Cr/3Nx0ZnA2lgtqKsLMvov8wL4+g0HBz/gWYZPlIsof7iyfQafyhg4wUVUsS3vWZw== dependencies: - "@tanstack/query-persist-client-core" "4.36.1" - -"@tanstack/react-query-persist-client@^4.28.0": - version "4.36.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.36.1.tgz#d96fa44cdc661534379623423da596a7b5dc13a7" - integrity sha512-32I5b9aAu4NCiXZ7Te/KEQLfHbYeTNriVPrKYcvEThnZ9tlW01vLcSoxpUIsMYRsembvJUUAkzYBAiZHLOd6pQ== - dependencies: - "@tanstack/query-persist-client-core" "4.36.1" - -"@tanstack/react-query@^4.28.0": - version "4.36.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.36.1.tgz#acb589fab4085060e2e78013164868c9c785e5d2" - integrity sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw== - dependencies: - "@tanstack/query-core" "4.36.1" - use-sync-external-store "^1.2.0" + "@tanstack/query-core" "5.28.6" "@tanstack/react-virtual@^3.0.0-beta.60": version "3.0.2" @@ -3147,13 +3301,21 @@ resolved "https://registry.yarnpkg.com/@total-typescript/ts-reset/-/ts-reset-0.5.1.tgz#93b0535d00faa588518bcfb0db30182e63e4f7af" integrity sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ== -"@types/connect@^3.4.33": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== +"@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== dependencies: "@types/node" "*" +"@types/chrome@^0.0.136": + version "0.0.136" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.136.tgz#7c011b9f997b0156f25a140188a0c5689d3f368f" + integrity sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + "@types/conventional-commits-parser@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" @@ -3168,11 +3330,28 @@ dependencies: "@types/ms" "*" +"@types/dom-screen-wake-lock@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz#c3588a5f6f40fae957f9ce5be9bc4927a61bb9a0" + integrity sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw== + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/filesystem@*": + version "0.0.36" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" + integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" + integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -3181,6 +3360,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/har-format@*": + version "1.2.15" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" + integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== + "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -3208,12 +3392,14 @@ dependencies: undici-types "~5.26.4" -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^20.11.30": + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" -"@types/node@^20.11.25", "@types/node@~20.11.3": +"@types/node@~20.11.3": version "20.11.25" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.25.tgz#0f50d62f274e54dd7a49f7704cc16bfbcccaf49f" integrity sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw== @@ -3225,15 +3411,27 @@ resolved "https://registry.yarnpkg.com/@types/nprogress/-/nprogress-0.2.3.tgz#b2150b054a13622fabcba12cf6f0b54c48b14287" integrity sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA== +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + "@types/prop-types@*": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== -"@types/react-dom@^18.2.21": - version "18.2.21" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.21.tgz#b8c81715cebdebb2994378616a8d54ace54f043a" - integrity sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw== +"@types/react-dom@^18.2.22": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== dependencies: "@types/react" "*" @@ -3246,10 +3444,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.2.64": - version "18.2.64" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.64.tgz#3700fbb6b2fa60a6868ec1323ae4cbd446a2197d" - integrity sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg== +"@types/react@^18.2.67": + version "18.2.67" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.67.tgz#96b7af0b5e79c756f4bdd981de2ca28472c858e5" + integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3267,6 +3465,13 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== +"@types/secp256k1@^4.0.1", "@types/secp256k1@^4.0.4": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + "@types/semver@^7.5.0": version "7.5.6" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" @@ -3277,30 +3482,23 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/ws@*", "@types/ws@~8.5.10": +"@types/ws@~8.5.10": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz#dd71fc5c7ecec745ca26ece506d84d203a205c0e" - integrity sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw== +"@typescript-eslint/eslint-plugin@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz#0d8f38a6c8a1802139e62184ee7a68ed024f30a1" + integrity sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.1.1" - "@typescript-eslint/type-utils" "7.1.1" - "@typescript-eslint/utils" "7.1.1" - "@typescript-eslint/visitor-keys" "7.1.1" + "@typescript-eslint/scope-manager" "7.3.1" + "@typescript-eslint/type-utils" "7.3.1" + "@typescript-eslint/utils" "7.3.1" + "@typescript-eslint/visitor-keys" "7.3.1" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -3319,15 +3517,15 @@ "@typescript-eslint/visitor-keys" "6.19.0" debug "^4.3.4" -"@typescript-eslint/parser@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.1.tgz#6a9d0a5c9ccdf5dbd3cb8c949728c64e24e07d1f" - integrity sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ== +"@typescript-eslint/parser@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.3.1.tgz#c4ba7dc2744318a5e4506596cbc3a0086255c526" + integrity sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw== dependencies: - "@typescript-eslint/scope-manager" "7.1.1" - "@typescript-eslint/types" "7.1.1" - "@typescript-eslint/typescript-estree" "7.1.1" - "@typescript-eslint/visitor-keys" "7.1.1" + "@typescript-eslint/scope-manager" "7.3.1" + "@typescript-eslint/types" "7.3.1" + "@typescript-eslint/typescript-estree" "7.3.1" + "@typescript-eslint/visitor-keys" "7.3.1" debug "^4.3.4" "@typescript-eslint/scope-manager@6.19.0": @@ -3338,21 +3536,21 @@ "@typescript-eslint/types" "6.19.0" "@typescript-eslint/visitor-keys" "6.19.0" -"@typescript-eslint/scope-manager@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz#9e301803ff8e21a74f50c6f89a4baccad9a48f93" - integrity sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA== +"@typescript-eslint/scope-manager@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz#73fd0cb4211a7be23e49e5b6efec8820caa6ec36" + integrity sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag== dependencies: - "@typescript-eslint/types" "7.1.1" - "@typescript-eslint/visitor-keys" "7.1.1" + "@typescript-eslint/types" "7.3.1" + "@typescript-eslint/visitor-keys" "7.3.1" -"@typescript-eslint/type-utils@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz#aee820d5bedd39b83c18585a526cc520ddb7a226" - integrity sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g== +"@typescript-eslint/type-utils@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz#cbf90d3d7e788466aa8a5c0ab3f46103f098aa0d" + integrity sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw== dependencies: - "@typescript-eslint/typescript-estree" "7.1.1" - "@typescript-eslint/utils" "7.1.1" + "@typescript-eslint/typescript-estree" "7.3.1" + "@typescript-eslint/utils" "7.3.1" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -3361,10 +3559,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.0.tgz#689b0498c436272a6a2059b09f44bcbd90de294a" integrity sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A== -"@typescript-eslint/types@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.1.tgz#ca33ba7cf58224fb46a84fea62593c2c53cd795f" - integrity sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q== +"@typescript-eslint/types@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.3.1.tgz#ae104de8efa4227a462c0874d856602c5994413c" + integrity sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw== "@typescript-eslint/typescript-estree@6.19.0": version "6.19.0" @@ -3380,13 +3578,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz#09c54af0151a1b05d0875c0fc7fe2ec7a2476ece" - integrity sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw== +"@typescript-eslint/typescript-estree@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz#598848195fad34c7aa73f548bd00a4d4e5f5e2bb" + integrity sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ== dependencies: - "@typescript-eslint/types" "7.1.1" - "@typescript-eslint/visitor-keys" "7.1.1" + "@typescript-eslint/types" "7.3.1" + "@typescript-eslint/visitor-keys" "7.3.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3394,17 +3592,17 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.1.tgz#bdeeb789eee4af5d3fb5400a69566d4dbf97ff3b" - integrity sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg== +"@typescript-eslint/utils@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.3.1.tgz#fc28fd508ccf89495012561b7c02a6fdad162460" + integrity sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.1.1" - "@typescript-eslint/types" "7.1.1" - "@typescript-eslint/typescript-estree" "7.1.1" + "@typescript-eslint/scope-manager" "7.3.1" + "@typescript-eslint/types" "7.3.1" + "@typescript-eslint/typescript-estree" "7.3.1" semver "^7.5.4" "@typescript-eslint/visitor-keys@6.19.0": @@ -3415,12 +3613,12 @@ "@typescript-eslint/types" "6.19.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz#e6538a58c9b157f03bcbb29e3b6a92fe39a6ab0d" - integrity sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ== +"@typescript-eslint/visitor-keys@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz#6ddef14a3ce2a79690f01176f5305c34d7b93d8c" + integrity sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw== dependencies: - "@typescript-eslint/types" "7.1.1" + "@typescript-eslint/types" "7.3.1" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -3474,35 +3672,31 @@ resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-1.8.0.tgz#70e5fd0d50c8f9b8e63585eaf8544481e71707d3" integrity sha512-UXo0GF0Cl0+neKC2KAmVAahv8L/5rACbFRRqkDvHMefzY6Fh7yzJd8F4GaGNNG3w4hj8eUB/E3+dEpaTYDN62w== -"@wagmi/connectors@3.1.11": - version "3.1.11" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-3.1.11.tgz#98c3a73555bd4c96e562b0258bb2c770fa37b621" - integrity sha512-wzxp9f9PtSUFjDUP/QDjc1t7HON4D8wrVKsw35ejdO8hToDpx1gU9lwH/47Zo/1zExGezQc392sjoHSszYd7OA== +"@wagmi/connectors@4.1.18": + version "4.1.18" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" + integrity sha512-K/iLH/Z8jwvgPAYESU/uCQtQBvcIR1Jrqk+t2uCDSxew/tYtkOo2yOjtaPuOb+xJ5OrMGg+0tVHhGChYXry9Ow== dependencies: - "@coinbase/wallet-sdk" "^3.6.6" - "@safe-global/safe-apps-provider" "^0.18.1" - "@safe-global/safe-apps-sdk" "^8.1.0" - "@walletconnect/ethereum-provider" "2.11.0" - "@walletconnect/legacy-provider" "^2.0.0" + "@coinbase/wallet-sdk" "3.9.1" + "@metamask/sdk" "0.14.3" + "@safe-global/safe-apps-provider" "0.18.1" + "@safe-global/safe-apps-sdk" "8.1.0" + "@walletconnect/ethereum-provider" "2.11.2" "@walletconnect/modal" "2.6.2" - "@walletconnect/utils" "2.11.0" - abitype "0.8.7" - eventemitter3 "^4.0.7" -"@wagmi/core@1.4.13", "@wagmi/core@^1.4.3", "@wagmi/core@^1.4.7": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-1.4.13.tgz#8a29bb0370141d48232e3d0b60011dbd8f91a37d" - integrity sha512-ytMCvXbBOgfDu9Qw67279wq/jNEe7EZLjLyekX7ROnvHRADqFr3lwZI6ih41UmtRZAmXAx8Ghyuqy154EjB5mQ== +"@wagmi/core@2.6.9", "@wagmi/core@^2.6.5", "@wagmi/core@^2.6.9": + version "2.6.9" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.6.9.tgz#6b2659c7a4420c1d3876902a051ac9487aa604eb" + integrity sha512-AbNbHK+m60mfMTds0flv5YYJGp+JSz8O8ikzX+T7MdemFrYA9tZr6G+iSEnf+JLtcgiaCgQqUwac/WmmTkDiMA== dependencies: - "@wagmi/connectors" "3.1.11" - abitype "0.8.7" - eventemitter3 "^4.0.7" - zustand "^4.3.1" + eventemitter3 "5.0.1" + mipd "0.0.5" + zustand "4.4.1" -"@walletconnect/core@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.0.tgz#3a4e301077b2f858fd916b7a20b5b984d1afce63" - integrity sha512-2Tjp5BCevI7dbmqo/OrCjX4tqgMqwJNQLlQAlphqPfvwlF9+tIu6pGcVbSN3U9zyXzWIZCeleqEaWUeSeET4Ew== +"@walletconnect/core@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.2.tgz#35286be92c645fa461fecc0dfe25de9f076fca8f" + integrity sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g== dependencies: "@walletconnect/heartbeat" "1.2.1" "@walletconnect/jsonrpc-provider" "1.0.13" @@ -3515,34 +3709,13 @@ "@walletconnect/relay-auth" "^1.0.4" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.0" - "@walletconnect/utils" "2.11.0" + "@walletconnect/types" "2.11.2" + "@walletconnect/utils" "2.11.2" events "^3.3.0" isomorphic-unfetch "3.1.0" lodash.isequal "4.5.0" uint8arrays "^3.1.0" -"@walletconnect/crypto@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" - integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== - dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - "@walletconnect/randombytes" "^1.0.3" - aes-js "^3.1.2" - hash.js "^1.1.7" - tslib "1.14.1" - -"@walletconnect/encoding@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" - integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== - dependencies: - is-typedarray "1.0.0" - tslib "1.14.1" - typedarray-to-buffer "3.1.5" - "@walletconnect/environment@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" @@ -3550,20 +3723,20 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.11.0.tgz#feb90368d8b2608d7d120ac8feeb3e26eac8c709" - integrity sha512-YrTeHVjuSuhlUw7SQ6xBJXDuJ6iAC+RwINm9nVhoKYJSHAy3EVSJZOofMKrnecL0iRMtD29nj57mxAInIBRuZA== +"@walletconnect/ethereum-provider@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.11.2.tgz#914f773e37a879bc00cf367437c4e98a826247b1" + integrity sha512-BUDqee0Uy2rCZVkW5Ao3q6Ado/3fePYnFdryVF+YL6bPhj+xQZ5OfKodl+uvs7Rwq++O5wTX2RqOTzpW7+v+Mg== dependencies: "@walletconnect/jsonrpc-http-connection" "^1.0.7" "@walletconnect/jsonrpc-provider" "^1.0.13" "@walletconnect/jsonrpc-types" "^1.0.3" "@walletconnect/jsonrpc-utils" "^1.0.8" "@walletconnect/modal" "^2.6.2" - "@walletconnect/sign-client" "2.11.0" - "@walletconnect/types" "2.11.0" - "@walletconnect/universal-provider" "2.11.0" - "@walletconnect/utils" "2.11.0" + "@walletconnect/sign-client" "2.11.2" + "@walletconnect/types" "2.11.2" + "@walletconnect/universal-provider" "2.11.2" + "@walletconnect/utils" "2.11.2" events "^3.3.0" "@walletconnect/events@^1.0.1": @@ -3583,7 +3756,7 @@ "@walletconnect/time" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-http-connection@^1.0.4", "@walletconnect/jsonrpc-http-connection@^1.0.7": +"@walletconnect/jsonrpc-http-connection@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98" integrity sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ== @@ -3593,7 +3766,7 @@ cross-fetch "^3.1.4" tslib "1.14.1" -"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13", "@walletconnect/jsonrpc-provider@^1.0.6": +"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13": version "1.0.13" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== @@ -3610,7 +3783,7 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -3638,66 +3811,6 @@ idb-keyval "^6.2.1" unstorage "^1.9.0" -"@walletconnect/legacy-client@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-client/-/legacy-client-2.0.0.tgz#9f2c09694789fd4b6c5d68d6423b44bac55aed30" - integrity sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA== - dependencies: - "@walletconnect/crypto" "^1.0.3" - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.4" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - "@walletconnect/safe-json" "^1.0.1" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" - detect-browser "^5.3.0" - query-string "^6.13.5" - -"@walletconnect/legacy-modal@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-modal/-/legacy-modal-2.0.0.tgz#d0fab01a1337a8f5d88cdb1430cbef2d46072bbf" - integrity sha512-jckNd8lMhm4X7dX9TDdxM3bXKJnaqkRs6K2Mo5j6GmbIF9Eyx40jZ5+q457RVxvM6ciZEDT5s1wBHWdWoOo+9Q== - dependencies: - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - copy-to-clipboard "^3.3.3" - preact "^10.12.0" - qrcode "^1.5.1" - -"@walletconnect/legacy-provider@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-provider/-/legacy-provider-2.0.0.tgz#08e2db1e4c234743b2f30422bc8100bc42e8fc44" - integrity sha512-A8xPebMI1A+50HbWwTpFCbwP7G+1NGKdTKyg8BUUg3h3Y9JucpC1W6w/x0v1Xw7qFEqQnz74LoIN/A3ytH9xrQ== - dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.4" - "@walletconnect/jsonrpc-provider" "^1.0.6" - "@walletconnect/legacy-client" "^2.0.0" - "@walletconnect/legacy-modal" "^2.0.0" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - -"@walletconnect/legacy-types@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-types/-/legacy-types-2.0.0.tgz#224278ae2874c6a2ca805c2d1d062a511dcf7227" - integrity sha512-sOVrA7HUdbI1OwKyPOQU0/DdvTSVFlsXWpAk2K2WvP2erTkBWPMTJq6cv2BmKdoJ3p6gLApT7sd+jHi3OF71uw== - dependencies: - "@walletconnect/jsonrpc-types" "^1.0.2" - -"@walletconnect/legacy-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-utils/-/legacy-utils-2.0.0.tgz#e3a637c00783f9cd2ae139b640f82223ab78ed9d" - integrity sha512-CPWxSVVXw0kgNCxvU126g4GiV3mzXmC8IPJ15twE46aJ1FX+RHEIfAzFMFz2F2+fEhBxL63A7dwNQKDXorRPcQ== - dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.4" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/safe-json" "^1.0.1" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" - detect-browser "^5.3.0" - query-string "^6.13.5" - "@walletconnect/logger@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" @@ -3731,16 +3844,6 @@ "@walletconnect/modal-core" "2.6.2" "@walletconnect/modal-ui" "2.6.2" -"@walletconnect/randombytes@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" - integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== - dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - randombytes "^2.1.0" - tslib "1.14.1" - "@walletconnect/relay-api@^1.0.9": version "1.0.9" resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" @@ -3768,19 +3871,19 @@ dependencies: tslib "1.14.1" -"@walletconnect/sign-client@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.11.0.tgz#de10f976cc1b8ab04b7f7c27f6a298e4e083ab25" - integrity sha512-H2ukscibBS+6WrzQWh+WyVBqO5z4F5et12JcwobdwgHnJSlqIoZxqnUYYWNCI5rUR5UKsKWaUyto4AE9N5dw4Q== +"@walletconnect/sign-client@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.11.2.tgz#855609653855f0d23b0502cdbdcf43402e34c459" + integrity sha512-MfBcuSz2GmMH+P7MrCP46mVE5qhP0ZyWA0FyIH6/WuxQ6G+MgKsGfaITqakpRPsykWOJq8tXMs3XvUPDU413OQ== dependencies: - "@walletconnect/core" "2.11.0" + "@walletconnect/core" "2.11.2" "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" "@walletconnect/jsonrpc-utils" "1.0.8" "@walletconnect/logger" "^2.0.1" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.0" - "@walletconnect/utils" "2.11.0" + "@walletconnect/types" "2.11.2" + "@walletconnect/utils" "2.11.2" events "^3.3.0" "@walletconnect/time@^1.0.2": @@ -3790,10 +3893,10 @@ dependencies: tslib "1.14.1" -"@walletconnect/types@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.11.0.tgz#474a009c56faa9ef4063b76ed84415c801dc9f1e" - integrity sha512-AB5b1lrEbCGHxqS2vqfCkIoODieH+ZAUp9rA1O2ftrhnqDJiJK983Df87JhYhECsQUBHHfALphA8ydER0q+9sw== +"@walletconnect/types@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.11.2.tgz#d0359dd4106fcaa1634241a00428d3ea08d0d3c7" + integrity sha512-p632MFB+lJbip2cvtXPBQslpUdiw1sDtQ5y855bOlAGquay+6fZ4h1DcDePeKQDQM3P77ax2a9aNPZxV6y/h1Q== dependencies: "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" @@ -3802,25 +3905,25 @@ "@walletconnect/logger" "^2.0.1" events "^3.3.0" -"@walletconnect/universal-provider@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.11.0.tgz#89053c2360b5ce766c213ca4e33bb4ce4976b0be" - integrity sha512-zgJv8jDvIMP4Qse/D9oIRXGdfoNqonsrjPZanQ/CHNe7oXGOBiQND2IIeX+tS0H7uNA0TPvctljCLiIN9nw4eA== +"@walletconnect/universal-provider@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.11.2.tgz#bec3038f51445d707bbec75f0cb8af0a1f1e04db" + integrity sha512-cNtIn5AVoDxKAJ4PmB8m5adnf5mYQMUamEUPKMVvOPscfGtIMQEh9peKsh2AN5xcRVDbgluC01Id545evFyymw== dependencies: "@walletconnect/jsonrpc-http-connection" "^1.0.7" "@walletconnect/jsonrpc-provider" "1.0.13" "@walletconnect/jsonrpc-types" "^1.0.2" "@walletconnect/jsonrpc-utils" "^1.0.7" "@walletconnect/logger" "^2.0.1" - "@walletconnect/sign-client" "2.11.0" - "@walletconnect/types" "2.11.0" - "@walletconnect/utils" "2.11.0" + "@walletconnect/sign-client" "2.11.2" + "@walletconnect/types" "2.11.2" + "@walletconnect/utils" "2.11.2" events "^3.3.0" -"@walletconnect/utils@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.11.0.tgz#31c95151c823022077883dda61800cdea71879b7" - integrity sha512-hxkHPlTlDQILHfIKXlmzgNJau/YcSBC3XHUSuZuKZbNEw3duFT6h6pm3HT/1+j1a22IG05WDsNBuTCRkwss+BQ== +"@walletconnect/utils@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.11.2.tgz#dee0f19adf5e38543612cbe9fa4de7ed28eb7e85" + integrity sha512-LyfdmrnZY6dWqlF4eDrx5jpUwsB2bEPjoqR5Z6rXPiHJKUOdJt7az+mNOn5KTSOlRpd1DmozrBrWr+G9fFLYVw== dependencies: "@stablelib/chacha20poly1305" "1.0.1" "@stablelib/hkdf" "1.0.1" @@ -3830,7 +3933,7 @@ "@walletconnect/relay-api" "^1.0.9" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.11.0" + "@walletconnect/types" "2.11.2" "@walletconnect/window-getters" "^1.0.1" "@walletconnect/window-metadata" "^1.0.1" detect-browser "5.3.0" @@ -3852,36 +3955,37 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@yearn-finance/web-lib@^3.0.133": - version "3.0.133" - resolved "https://registry.yarnpkg.com/@yearn-finance/web-lib/-/web-lib-3.0.133.tgz#8c4e13246debd114511f6b7e433716e1b5f7503b" - integrity sha512-1Hnh2cAyTyRXv8EL5VxkTlHT+zltqm5oBG6KKzwC+c4zaQl4byyM2YA8s2Wfmj1WhD/8jxASQtiFDbO+3FbEAA== +"@yearn-finance/web-lib@^3.0.184": + version "3.0.184" + resolved "https://registry.yarnpkg.com/@yearn-finance/web-lib/-/web-lib-3.0.184.tgz#7fc9b833cd917cfa6632674d0c4337260b373390" + integrity sha512-f024c0ZILsEf5Nv209eUVcgyTUObPvLGKS1ECCwT2tdPKGJRrYzEpqKR2Wf4HaeZkFKg6dIcHN1/lUMtjMOhgQ== dependencies: - "@builtbymom/web3" "^0.0.20" + "@builtbymom/web3" "^0.0.59" "@headlessui/react" "^1.7.18" - "@rainbow-me/rainbowkit" "^1.3.3" - "@react-hookz/web" "^24.0.2" + "@rainbow-me/rainbowkit" "^2.0.1" + "@react-hookz/web" "^24.0.4" "@tailwindcss/forms" "^0.5.7" "@total-typescript/ts-reset" "^0.5.1" "@wagmi/chains" "1.8.0" - "@wagmi/core" "^1.4.7" - bun-types "^1.0.25" + "@wagmi/core" "^2.6.5" + bun-types "^1.0.30" dayjs "^1.11.10" ethers "5.7.2" eventemitter3 "^5.0.1" + framer-motion "^11.0.8" graphql "^16.8.1" - lint-staged "^15.2.0" + lint-staged "^15.2.2" next "^14.0.4" - next-seo "^6.4.0" - prettier "^3.2.4" + next-seo "^6.5.0" + prettier "^3.2.5" react-hot-toast "2.4.1" react-paginate "^8.2.0" - sass "^1.70.0" - stylelint "^16.2.0" - swr "^2.2.4" + sass "^1.71.1" + stylelint "^16.2.1" + swr "^2.2.5" tailwindcss "^3.4.1" - viem "^1.19.9" - wagmi "^1.4.7" + viem "^2.7.22" + wagmi "^2.5.7" zod "^3.22.4" JSONStream@^1.3.5: @@ -3892,16 +3996,16 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abitype@0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.8.7.tgz#e4b3f051febd08111f486c0cc6a98fa72d033622" - integrity sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w== - abitype@0.9.8: version "0.9.8" resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -3924,18 +4028,6 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== -aes-js@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - -agentkeepalive@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -4247,13 +4339,13 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== -autoprefixer@^10.4.18: - version "10.4.18" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163" - integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g== +autoprefixer@^10.4.19: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: browserslist "^4.23.0" - caniuse-lite "^1.0.30001591" + caniuse-lite "^1.0.30001599" fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -4276,12 +4368,12 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axios@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== +axios@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: - follow-redirects "^1.15.4" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -4310,6 +4402,15 @@ babel-loader@^9.1.3: find-cache-dir "^4.0.0" schema-utils "^4.0.0" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + babel-plugin-polyfill-corejs2@^0.4.7: version "0.4.8" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" @@ -4371,34 +4472,15 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -bignumber.js@*: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bind-decorator@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" - integrity sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg== - -bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bn.js@4.11.6: version "4.11.6" @@ -4410,19 +4492,15 @@ bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" +bowser@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== brace-expansion@^1.1.7: version "1.1.11" @@ -4451,6 +4529,18 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + browserslist@^4.22.2: version "4.22.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" @@ -4471,13 +4561,22 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" -bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -4501,7 +4600,12 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -4509,7 +4613,7 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bufferutil@^4.0.1: +bufferutil@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== @@ -4521,24 +4625,6 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bun-types@^1.0.22: - version "1.0.23" - resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.0.23.tgz#c9fbe8794358c53c73b1d02bdd3df0e7a06db9f9" - integrity sha512-K3eFQrZk2LWAdp7qcMz+m40Mz+RQc3jpgroQRlQqvQLSFL4qQ3tULBrKHzSwh0P9P7vyHbhyJ5IGKj/cmQFLGg== - dependencies: - "@types/node" "*" - "@types/ws" "*" - undici-types "^5.26.4" - -bun-types@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.0.25.tgz#ef38ac40e9c9e2db188061474081426934a464a7" - integrity sha512-9lxeUR/OJsvlZH4GOWteiAdx7ikrSxCUX7Rr0JJux+DrR3LejouVLxIZnTeQ3UPAZovvSgKivWeHPJ2wlo7/Kg== - dependencies: - "@types/node" "*" - "@types/ws" "*" - undici-types "^5.26.4" - bun-types@^1.0.30: version "1.0.30" resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.0.30.tgz#46388a1551dd166c390060c006b84a6443df160e" @@ -4547,6 +4633,14 @@ bun-types@^1.0.30: "@types/node" "~20.11.3" "@types/ws" "~8.5.10" +bun-types@^1.0.34: + version "1.0.34" + resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.0.34.tgz#7cfaa1086f28fd0a979fa2895cbb0f1764e9502d" + integrity sha512-yF/8CTiy90VI3fuzNZCWGUNLp9puzUpFdYrWy+XrDG6W5AJhso9S9tWxU/eanZndkeM6t78OS663iqxaQ14KSQ== + dependencies: + "@types/node" "~20.11.3" + "@types/ws" "~8.5.10" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -4594,11 +4688,16 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001565, caniuse-lite@^1.0.300015 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz#45c065216110f46d6274311a4b3fcf6278e0852a" integrity sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA== -caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591: +caniuse-lite@^1.0.30001587: version "1.0.30001597" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz#8be94a8c1d679de23b22fbd944232aa1321639e6" integrity sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w== +caniuse-lite@^1.0.30001599: + version "1.0.30001600" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" + integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== + chalk@5.3.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -4636,6 +4735,14 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: optionalDependencies: fsevents "~2.3.2" +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + citty@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" @@ -4643,6 +4750,11 @@ citty@^0.1.5: dependencies: consola "^3.2.3" +classnames@^2.2.1, classnames@^2.2.5: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-webpack-plugin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729" @@ -4702,7 +4814,7 @@ clsx@2.1.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== -clsx@^1.1.0: +clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -4712,12 +4824,13 @@ cluster-key-slot@^1.1.0: resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== -cmdk@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cmdk/-/cmdk-0.2.1.tgz#aa8e1332bb0b8d8484e793017c82537351188d9a" - integrity sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g== +cmdk@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cmdk/-/cmdk-1.0.0.tgz#0a095fdafca3dfabed82d1db78a6262fb163ded9" + integrity sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q== dependencies: - "@radix-ui/react-dialog" "1.0.0" + "@radix-ui/react-dialog" "1.0.5" + "@radix-ui/react-primitive" "1.0.3" color-convert@^1.9.0: version "1.9.3" @@ -4781,7 +4894,7 @@ commander@11.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== -commander@^2.20.0, commander@^2.20.3: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4848,6 +4961,11 @@ conventional-commits-parser@^5.0.0: meow "^12.0.1" split2 "^4.0.0" +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -4858,13 +4976,6 @@ cookie-es@^1.0.0: resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.0.0.tgz#4759684af168dfc54365b2c2dda0a8d7ee1e4865" integrity sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ== -copy-to-clipboard@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" - core-js-compat@^3.31.0, core-js-compat@^3.33.1: version "3.35.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" @@ -4872,6 +4983,11 @@ core-js-compat@^3.31.0, core-js-compat@^3.33.1: dependencies: browserslist "^4.22.2" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig-typescript-loader@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" @@ -4879,15 +4995,16 @@ cosmiconfig-typescript-loader@^5.0.0: dependencies: jiti "^1.19.1" -cosmiconfig@^8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" path-type "^4.0.0" + yaml "^1.10.0" cosmiconfig@^9.0.0: version "9.0.0" @@ -4899,6 +5016,34 @@ cosmiconfig@^9.0.0: js-yaml "^4.1.0" parse-json "^5.2.0" +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-fetch@^3.1.4, cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" @@ -4906,6 +5051,13 @@ cross-fetch@^3.1.4, cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4965,17 +5117,24 @@ dargs@^8.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== -date-fns@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.3.1.tgz#7581daca0892d139736697717a168afbb908cfed" - integrity sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw== +date-fns@^2.29.3: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +date-fns@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== dayjs@^1.11.10: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== -debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4994,7 +5153,7 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -5032,6 +5191,11 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -5059,11 +5223,6 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5084,7 +5243,7 @@ destr@^2.0.1, destr@^2.0.2: resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.2.tgz#8d3c0ee4ec0a76df54bc8b819bca215592a8c218" integrity sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg== -detect-browser@5.3.0, detect-browser@^5.3.0: +detect-browser@5.3.0, detect-browser@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== @@ -5175,6 +5334,15 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +eciesjs@^0.3.15, eciesjs@^0.3.16: + version "0.3.18" + resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.3.18.tgz#67b5d73a8466e40a45bbc2f2a3177e71e9c0643d" + integrity sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw== + dependencies: + "@types/secp256k1" "^4.0.4" + futoin-hkdf "^1.5.3" + secp256k1 "^5.0.0" + ejs@^3.1.6: version "3.1.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" @@ -5205,6 +5373,19 @@ elliptic@6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.4: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^10.3.0: version "10.3.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" @@ -5230,13 +5411,29 @@ encode-utf8@^1.0.3: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== -end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -5436,23 +5633,16 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -5463,12 +5653,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-next@^14.1.3: - version "14.1.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.3.tgz#f5c75c088c5df35da2a02129cbf5dec9defb3f13" - integrity sha512-sUCpWlGuHpEhI0pIT0UtdSLJk5Z8E2DYinPTwsBiWaSYQomchdl0i60pjynY48+oXvtyWMQ7oE+G3m49yrfacg== +eslint-config-next@^14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== dependencies: - "@next/eslint-plugin-next" "14.1.3" + "@next/eslint-plugin-next" "14.1.4" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" @@ -5591,10 +5781,10 @@ eslint-plugin-react@^7.33.2: semver "^6.3.1" string.prototype.matchall "^4.0.8" -eslint-plugin-react@^7.34.0: - version "7.34.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz#ab71484d54fc409c37025c5eca00eb4177a5e88c" - integrity sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ== +eslint-plugin-react@^7.34.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: array-includes "^3.1.7" array.prototype.findlast "^1.2.4" @@ -5620,10 +5810,10 @@ eslint-plugin-simple-import-sort@^12.0.0: resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.0.0.tgz#3cfa05d74509bd4dc329a956938823812194dbb6" integrity sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ== -eslint-plugin-tailwindcss@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.15.0.tgz#86a36855f721ebd96701e7ea2349ffb93f373f97" - integrity sha512-mRs8OGJMxkCl8cD0wGjr9NbcRYJCN3D1TfgmIGb1L+3opqYyTT1jjVau1s6SUdVJqci3EfbxG60TJQtgqfEtTw== +eslint-plugin-tailwindcss@^3.15.1: + version "3.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.15.1.tgz#9120f58e4a1b3666629e7b7e45dbb6521d98b7bc" + integrity sha512-4RXRMIaMG07C2TBEW1k0VM4+dDazz1kxcZhkK4zirvmHGZTA4jnlSO2kq5mamuSPi+Wo17dh2SlC8IyFBuCd7Q== dependencies: fast-glob "^3.2.5" postcss "^8.4.4" @@ -5735,22 +5925,23 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eth-block-tracker@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-6.1.0.tgz#0481f97bbb88a100b9d45806fe7e37af741cbefc" - integrity sha512-K9SY8+/xMBi4M5HHTDdxnpEqEEGjbNpzHFqvxyjMZej8InV/B+CkFRKM6W+uvrFJ7m8Zd1E0qUkseU3vdIDFYQ== +eth-block-tracker@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz#dfc16085c6817cc30caabba381deb8d204c1c766" + integrity sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg== dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - "@metamask/utils" "^3.0.1" + "@metamask/eth-json-rpc-provider" "^1.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" json-rpc-random-id "^1.0.1" pify "^3.0.0" -eth-json-rpc-filters@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-5.1.0.tgz#f0c2aeaec2a45e2dc6ca1b9843d8e85447821427" - integrity sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ== +eth-json-rpc-filters@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz#0b3e370f017f5c6f58d3e7bd0756d8099ed85c56" + integrity sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig== dependencies: - "@metamask/safe-event-emitter" "^2.0.0" + "@metamask/safe-event-emitter" "^3.0.0" async-mutex "^0.2.6" eth-query "^2.1.2" json-rpc-engine "^6.1.0" @@ -5764,14 +5955,7 @@ eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-rpc-errors@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" - integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-rpc-errors@^4.0.2: +eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== @@ -5785,7 +5969,28 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== @@ -5795,6 +6000,17 @@ ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: "@scure/bip32" "1.3.1" "@scure/bip39" "1.2.1" +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethers@5.7.2, ethers@^5.6.8: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" @@ -5844,12 +6060,12 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter2@^6.4.5, eventemitter2@^6.4.7: + version "6.4.9" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" + integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== -eventemitter3@^5.0.1: +eventemitter3@5.0.1, eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== @@ -5859,6 +6075,14 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@8.0.1, execa@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -5874,10 +6098,17 @@ execa@8.0.1, execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== +extension-port-stream@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-2.1.1.tgz#ec11f2a5ed95655d8c40805d7cb0c39939ee9ef4" + integrity sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow== + dependencies: + webextension-polyfill ">=0.10.0 <1.0" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -5915,11 +6146,6 @@ fast-safe-stringify@^2.0.6: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -5946,11 +6172,6 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -5987,6 +6208,11 @@ find-cache-dir@^4.0.0: common-path-prefix "^3.0.0" pkg-dir "^7.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -6043,10 +6269,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.15.4: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" @@ -6086,6 +6312,13 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +framer-motion@^11.0.20: + version "11.0.20" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.20.tgz#6bb72bd0b8020fc417a40453b9247d596acbea78" + integrity sha512-YSDmWznt3hpdERosbE0UAPYWoYhTnmQ0J1qWPsgpCia9NgY8Xsz5IpOiUEGGj/nzCAW29fSrWugeLRkdp5de7g== + dependencies: + tslib "^2.4.0" + framer-motion@^11.0.8: version "11.0.8" resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.8.tgz#8f97a18cbad5858d85b53bc325c40a03d0a5c203" @@ -6135,6 +6368,11 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +futoin-hkdf@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz#6c8024f2e1429da086d4e18289ef2239ad33ee35" + integrity sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6443,6 +6681,15 @@ has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -6484,6 +6731,20 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + html-tags@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" @@ -6507,26 +6768,24 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - husky@^9.0.11: version "9.0.11" resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== -i18n-js@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/i18n-js/-/i18n-js-4.3.2.tgz#ec5391f23c76f5374b53645c83d272914eb81291" - integrity sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA== +i18next-browser-languagedetector@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz#de0321cba6881be37d82e20e4d6f05aa75f6e37f" + integrity sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA== + dependencies: + "@babel/runtime" "^7.23.2" + +i18next@22.5.1: + version "22.5.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" + integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== dependencies: - bignumber.js "*" - lodash "*" - make-plural "*" + "@babel/runtime" "^7.20.6" idb-keyval@^6.2.1: version "6.2.1" @@ -6584,7 +6843,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6617,7 +6876,7 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -invariant@^2.2.4: +invariant@2.2.4, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -6727,6 +6986,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -6853,6 +7117,11 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" @@ -6933,12 +7202,7 @@ is-typed-array@^1.1.13: resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.14" - -is-typedarray@1.0.0, is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + which-typed-array "^1.1.14" is-weakmap@^2.0.1: version "2.0.1" @@ -6960,6 +7224,13 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + is-wsl@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" @@ -6979,6 +7250,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6992,11 +7268,6 @@ isomorphic-unfetch@3.1.0: node-fetch "^2.6.1" unfetch "^4.2.0" -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - isows@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" @@ -7032,24 +7303,6 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jayson@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" - integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - uuid "^8.3.2" - ws "^7.4.5" - jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -7110,7 +7363,7 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: +json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== @@ -7118,6 +7371,15 @@ json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: "@metamask/safe-event-emitter" "^2.0.0" eth-rpc-errors "^4.0.2" +json-rpc-middleware-stream@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/json-rpc-middleware-stream/-/json-rpc-middleware-stream-4.2.3.tgz#08340846ffaa2a60287930773546eb4b7f7dbba2" + integrity sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w== + dependencies: + "@metamask/safe-event-emitter" "^3.0.0" + json-rpc-engine "^6.1.0" + readable-stream "^2.3.3" + json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" @@ -7143,11 +7405,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -7194,7 +7451,7 @@ jsonpointer@^5.0.0: object.assign "^4.1.4" object.values "^1.1.6" -keccak@^3.0.1: +keccak@^3.0.0, keccak@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== @@ -7265,22 +7522,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.0.tgz#3111534ca58096a3c8f70b044b6e7fe21b36f859" - integrity sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ== - dependencies: - chalk "5.3.0" - commander "11.1.0" - debug "4.3.4" - execa "8.0.1" - lilconfig "3.0.0" - listr2 "8.0.0" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.4" - lint-staged@^15.2.2: version "15.2.2" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f" @@ -7320,18 +7561,6 @@ listhen@^1.5.5: untun "^0.1.3" uqr "^0.1.2" -listr2@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.0.tgz#aa7c230995f8ce378585f7c96c0c6d1cefa4700d" - integrity sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.0.0" - rfdc "^1.3.0" - wrap-ansi "^9.0.0" - listr2@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34" @@ -7479,7 +7708,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@*, lodash@^4.17.2, lodash@^4.17.20: +lodash@^4.17.2, lodash@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7547,16 +7776,20 @@ make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-plural@*: - version "7.3.0" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-7.3.0.tgz#2889dbafca2fb097037c47967d3e3afa7e48a52c" - integrity sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw== - mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + mdn-data@2.0.30: version "2.0.30" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" @@ -7579,6 +7812,13 @@ meow@^13.1.0: resolved "https://registry.yarnpkg.com/meow/-/meow-13.1.0.tgz#62995b0e8c3951739fe6e0a4becdd4d0df23eb37" integrity sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA== +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7675,6 +7915,13 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +mipd@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.5.tgz#367ee796531c23f0631f129038700b1406663aec" + integrity sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA== + dependencies: + viem "^1.1.4" + mlly@^1.2.0, mlly@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.5.0.tgz#8428a4617d54cc083d3009030ac79739a0e5447a" @@ -7712,7 +7959,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7746,6 +7993,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +next-plausible@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/next-plausible/-/next-plausible-3.12.0.tgz#b54f344c63bd1bb743ce6ef4e54b39446b0f3840" + integrity sha512-SSkEqKQ6PgR8fx3sYfIAT69k2xuCUXO5ngkSS19CjxY97lAoZxsfZpYednxB4zo0mHYv87JzhPynrdBPlCBVHg== + next-pwa@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/next-pwa/-/next-pwa-5.6.0.tgz#f7b1960c4fdd7be4253eb9b41b612ac773392bf4" @@ -7758,11 +8010,6 @@ next-pwa@^5.6.0: workbox-webpack-plugin "^6.5.4" workbox-window "^6.5.4" -next-seo@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.4.0.tgz#05a75b8acae881f856eb690b1f66b5e8741aa16e" - integrity sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA== - next-seo@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.5.0.tgz#5ccfbcfaced9d296499aa88f074b9e82e252a9c8" @@ -7775,28 +8022,29 @@ next-transpile-modules@^10.0.1: dependencies: enhanced-resolve "^5.10.0" -next@^13.5.4: - version "13.5.6" - resolved "https://registry.yarnpkg.com/next/-/next-13.5.6.tgz#e964b5853272236c37ce0dd2c68302973cf010b1" - integrity sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw== +next@14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.0.4.tgz#bf00b6f835b20d10a5057838fa2dfced1d0d84dc" + integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== dependencies: - "@next/env" "13.5.6" + "@next/env" "14.0.4" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" + graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "13.5.6" - "@next/swc-darwin-x64" "13.5.6" - "@next/swc-linux-arm64-gnu" "13.5.6" - "@next/swc-linux-arm64-musl" "13.5.6" - "@next/swc-linux-x64-gnu" "13.5.6" - "@next/swc-linux-x64-musl" "13.5.6" - "@next/swc-win32-arm64-msvc" "13.5.6" - "@next/swc-win32-ia32-msvc" "13.5.6" - "@next/swc-win32-x64-msvc" "13.5.6" + "@next/swc-darwin-arm64" "14.0.4" + "@next/swc-darwin-x64" "14.0.4" + "@next/swc-linux-arm64-gnu" "14.0.4" + "@next/swc-linux-arm64-musl" "14.0.4" + "@next/swc-linux-x64-gnu" "14.0.4" + "@next/swc-linux-x64-musl" "14.0.4" + "@next/swc-win32-arm64-msvc" "14.0.4" + "@next/swc-win32-ia32-msvc" "14.0.4" + "@next/swc-win32-x64-msvc" "14.0.4" next@^14.0.4: version "14.1.0" @@ -7821,11 +8069,39 @@ next@^14.0.4: "@next/swc-win32-ia32-msvc" "14.1.0" "@next/swc-win32-x64-msvc" "14.1.0" +next@^14.1.3: + version "14.1.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" + integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== + dependencies: + "@next/env" "14.1.4" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.1.4" + "@next/swc-darwin-x64" "14.1.4" + "@next/swc-linux-arm64-gnu" "14.1.4" + "@next/swc-linux-arm64-musl" "14.1.4" + "@next/swc-linux-x64-gnu" "14.1.4" + "@next/swc-linux-x64-musl" "14.1.4" + "@next/swc-win32-arm64-msvc" "14.1.4" + "@next/swc-win32-ia32-msvc" "14.1.4" + "@next/swc-win32-x64-msvc" "14.1.4" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-addon-api@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" @@ -7883,6 +8159,15 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" +obj-multiplex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/obj-multiplex/-/obj-multiplex-1.0.0.tgz#2f2ae6bfd4ae11befe742ea9ea5b36636eabffc1" + integrity sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA== + dependencies: + end-of-stream "^1.4.0" + once "^1.4.0" + readable-stream "^2.3.3" + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -7972,7 +8257,7 @@ on-exit-leak-free@^0.2.0: resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -7993,6 +8278,15 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -8079,7 +8373,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.2.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -8142,6 +8436,17 @@ pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -8252,6 +8557,11 @@ pngjs@^5.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== +pony-cause@^2.1.10: + version "2.1.10" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" + integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -8266,10 +8576,10 @@ postcss-import@^15.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-16.0.1.tgz#c2e0478c5af8cb39ab3964c35d8fee8e70c362b8" - integrity sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g== +postcss-import@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-16.1.0.tgz#258732175518129667fe1e2e2a05b19b5654b96a" + integrity sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -8355,35 +8665,25 @@ postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.35: - version "8.4.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" -preact@^10.12.0, preact@^10.5.9: - version "10.19.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" - integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== +preact@^10.16.0: + version "10.20.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.0.tgz#191c10a2ee3b9fca1a7ded6375266266380212f6" + integrity sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@2.8.8: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -prettier@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" - integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== - prettier@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" @@ -8394,6 +8694,16 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process-warning@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" @@ -8418,12 +8728,37 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qrcode@1.5.3, qrcode@^1.5.1: +qr-code-styling@^1.6.0-rc.1: + version "1.6.0-rc.1" + resolved "https://registry.yarnpkg.com/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz#6c89e185fa50cc9135101085c12ae95b06f1b290" + integrity sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q== + dependencies: + qrcode-generator "^1.4.3" + +qrcode-generator@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" + integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== + +qrcode-terminal-nooctal@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/qrcode-terminal-nooctal/-/qrcode-terminal-nooctal-0.12.1.tgz#45016aca0d82b2818de7af0a06d072ad671fbe2e" + integrity sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg== + +qrcode@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== @@ -8433,13 +8768,6 @@ qrcode@1.5.3, qrcode@^1.5.1: pngjs "^5.0.0" yargs "^15.3.1" -qs@^6.10.3: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - query-string@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -8450,16 +8778,6 @@ query-string@7.1.3: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^6.13.5: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -8482,6 +8800,34 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +rc-input-number@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-9.0.0.tgz#47da6eaf95b0cf566fcdf68196c4dc82b8c8f166" + integrity sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-input "~1.4.0" + rc-util "^5.28.0" + +rc-input@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.4.3.tgz#03f720f88cb56924cd1d5f78f859f41f2d62d1e0" + integrity sha512-aHyQUAIRmTlOnvk5EcNqEpJ+XMtfMpYRAJayIlJfsvvH9cAKUWboh4egm23vgMA7E+c/qm4BZcnrDcA960GC1w== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-util@^5.18.1, rc-util@^5.28.0: + version "5.38.2" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.38.2.tgz#240da546b51ee838e616f7a2e3fcf62c753b0330" + integrity sha512-yRGRPKyi84H7NkRSP6FzEIYBdUt4ufdsmXUZ7qM2H5qoByPax70NnGPkfo36N+UKUnUBj2f2Q2eUbwYMuAsIOQ== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + react-day-picker@^8.10.0: version "8.10.0" resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-8.10.0.tgz#729c5b9564967a924213978fb9c0751884a60595" @@ -8514,11 +8860,32 @@ react-hot-toast@2.4.1: dependencies: goober "^2.1.10" -react-is@^16.13.1: +react-i18next@^13.2.2: + version "13.5.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.5.0.tgz#44198f747628267a115c565f0c736a50a76b1ab0" + integrity sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA== + dependencies: + "@babel/runtime" "^7.22.5" + html-parse-stringify "^3.0.1" + +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-native-webview@^11.26.0: + version "11.26.1" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.26.1.tgz#658c09ed5162dc170b361e48c2dd26c9712879da" + integrity sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + react-paginate@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/react-paginate/-/react-paginate-8.2.0.tgz#947c3dcb444a6c16c1bcf8361871aa135baa3dcd" @@ -8542,17 +8909,6 @@ react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: react-style-singleton "^2.2.1" tslib "^2.0.0" -react-remove-scroll@2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" - integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - react-remove-scroll@2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" @@ -8598,7 +8954,33 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@^2.3.3, readable-stream@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8792,6 +9174,21 @@ rimraf@^5.0.5: dependencies: glob "^10.3.7" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rollup-plugin-terser@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" @@ -8802,6 +9199,16 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" +rollup-plugin-visualizer@^5.9.2: + version "5.12.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" + integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + rollup@^2.43.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" @@ -8809,19 +9216,6 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rpc-websockets@^7.5.1: - version "7.9.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.9.0.tgz#a3938e16d6f134a3999fdfac422a503731bf8973" - integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8829,13 +9223,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-array-concat@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" @@ -8856,11 +9243,16 @@ safe-array-concat@^1.1.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-compare@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/safe-compare/-/safe-compare-1.1.4.tgz#5e0128538a82820e2e9250cd78e45da6786ba593" @@ -8896,19 +9288,19 @@ sandwich-stream@^2.0.2: resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== -sass@^1.70.0: - version "1.70.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.70.0.tgz#761197419d97b5358cb25f9dd38c176a8a270a75" - integrity sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ== +sass@^1.71.1: + version "1.71.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" + integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@^1.71.1: - version "1.71.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" - integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== +sass@^1.72.0: + version "1.72.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" + integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -8949,11 +9341,29 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -scrypt-js@3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +secp256k1@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" + integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + semver@^6.0.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -9029,7 +9439,12 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" -sha.js@^2.4.11: +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -9134,6 +9549,24 @@ slice-ansi@^7.0.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" +socket.io-client@^4.5.1: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" + integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + sonic-boom@^2.2.1: version "2.8.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" @@ -9151,6 +9584,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -9159,6 +9597,11 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -9201,14 +9644,6 @@ std-env@^3.7.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - stream-shift@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" @@ -9305,6 +9740,20 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -9374,50 +9823,6 @@ stylelint-config-standard@^36.0.0: dependencies: stylelint-config-recommended "^14.0.0" -stylelint@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.2.0.tgz#60678f64d7660350fdd06415fd449f332b4fcbf6" - integrity sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA== - dependencies: - "@csstools/css-parser-algorithms" "^2.5.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/media-query-list-parser" "^2.1.7" - "@csstools/selector-specificity" "^3.0.1" - balanced-match "^2.0.0" - colord "^2.9.3" - cosmiconfig "^9.0.0" - css-functions-list "^3.2.1" - css-tree "^2.3.1" - debug "^4.3.4" - fast-glob "^3.3.2" - fastest-levenshtein "^1.0.16" - file-entry-cache "^8.0.0" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.3.1" - ignore "^5.3.0" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.29.0" - mathml-tag-names "^2.1.3" - meow "^13.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.33" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^7.0.0" - postcss-selector-parser "^6.0.15" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - strip-ansi "^7.1.0" - supports-hyperlinks "^3.0.0" - svg-tags "^1.0.0" - table "^6.8.1" - write-file-atomic "^5.0.1" - stylelint@^16.2.1: version "16.2.1" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.2.1.tgz#895d6d42523c5126ec0895f0ca2a58febeb77e89" @@ -9462,6 +9867,11 @@ stylelint@^16.2.1: table "^6.8.1" write-file-atomic "^5.0.1" +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + sucrase@^3.32.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" @@ -9475,11 +9885,6 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - superstruct@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.3.tgz#de626a5b49c6641ff4d37da3c7598e7a87697046" @@ -9524,14 +9929,6 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== -swr@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.4.tgz#03ec4c56019902fbdc904d78544bd7a9a6fa3f07" - integrity sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ== - dependencies: - client-only "^0.0.1" - use-sync-external-store "^1.2.0" - swr@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" @@ -9644,11 +10041,6 @@ terser@^5.0.0, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - text-extensions@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" @@ -9704,11 +10096,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -9752,7 +10139,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.9.0: +tslib@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9867,17 +10254,10 @@ typed-array-length@^1.0.5: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typedarray-to-buffer@3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" - integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== +typescript@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== ua-parser-js@^1.0.37: version "1.0.37" @@ -9911,11 +10291,6 @@ uncrypto@^0.1.3: resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== -undici-types@^5.26.4: - version "5.28.2" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.28.2.tgz#6d86278547d81c2cad72425cf275e8dfbaa8bc42" - integrity sha512-W71OLwDqzIO0d3k07qg1xc7d4cX8SsSwuCO4bQ4V7ITwduXXie/lcImofabP5VV+NvuvSe8ovKvHVJcizVc1JA== - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -10053,10 +10428,10 @@ use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== +utf-8-validate@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" + integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== dependencies: node-gyp-build "^4.3.0" @@ -10065,7 +10440,7 @@ utf8@3.0.0: resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -10106,7 +10481,7 @@ valtio@1.11.2: proxy-compare "2.5.1" use-sync-external-store "1.2.0" -viem@^1.0.0, viem@^1.15.4, viem@^1.19.9, viem@^1.6.0: +viem@^1.0.0, viem@^1.1.4: version "1.21.4" resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== @@ -10120,17 +10495,33 @@ viem@^1.0.0, viem@^1.15.4, viem@^1.19.9, viem@^1.6.0: isows "1.0.3" ws "8.13.0" -wagmi@^1.4.3, wagmi@^1.4.7: - version "1.4.13" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-1.4.13.tgz#dc8dc077c7c2195877d7e33477b0417f5d2add4f" - integrity sha512-AScVYFjqNt1wMgL99Bob7MLdhoTZ3XKiOZL5HVBdy4W1sh7QodA3gQ8IsmTuUrQ7oQaTxjiXEhwg7sWNrPBvJA== +viem@^2.7.22, viem@^2.8.18, viem@^2.8.9: + version "2.8.18" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.8.18.tgz#ffb051bf80381ffefc98087a20c177b25463c9f4" + integrity sha512-Kq3kwkKziJ8rQeLkmdbSLheHDnA+tx2EdLKLmQ3N4FVtjKYjBP9tPL1r+fI6KltVUM1TDOhIHOdslDSp57VMMg== dependencies: - "@tanstack/query-sync-storage-persister" "^4.27.1" - "@tanstack/react-query" "^4.28.0" - "@tanstack/react-query-persist-client" "^4.28.0" - "@wagmi/core" "1.4.13" - abitype "0.8.7" - use-sync-external-store "^1.2.0" + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + +wagmi@^2.5.12, wagmi@^2.5.7: + version "2.5.12" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.5.12.tgz#972603870d3b692d8957cfcd3503a58ed83b0c8a" + integrity sha512-n9XxiDgBUUzibZqFIdQI6/vKDjNlOTXH6mIHcuVO7ujYJuyw4aEjOJzDWivIGjVf2ygmb1aGryh2jx6W5KwjRw== + dependencies: + "@wagmi/connectors" "4.1.18" + "@wagmi/core" "2.6.9" + use-sync-external-store "1.2.0" warning@^4.0.2: version "4.0.3" @@ -10147,28 +10538,44 @@ watchpack@2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -web3-eth-abi@^1.10.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz#7decfffa8fed26410f32cfefdc32d3e76f717ca2" - integrity sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ== +web3-eth-abi@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" + integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== dependencies: "@ethersproject/abi" "^5.6.3" - web3-utils "1.10.3" + web3-utils "1.10.0" -web3-utils@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714" - integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== +web3-utils@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== dependencies: - "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" +webextension-polyfill-ts@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill-ts/-/webextension-polyfill-ts-0.25.0.tgz#fff041626365dbd0e29c40b197e989a55ec221ca" + integrity sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw== + dependencies: + webextension-polyfill "^0.7.0" + +"webextension-polyfill@>=0.10.0 <1.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8" + integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g== + +webextension-polyfill@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.7.0.tgz#0df1120ff0266056319ce1a622b09ad8d4a56505" + integrity sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10513,15 +10920,20 @@ ws@8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^7.4.5, ws@^7.5.1: +ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.5.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== xtend@^4.0.1: version "4.0.2" @@ -10553,6 +10965,11 @@ yaml@2.3.4, yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -10583,7 +11000,7 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.0.0: +yargs@^17.0.0, yargs@^17.5.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -10611,9 +11028,9 @@ zod@^3.22.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== -zustand@^4.3.1: - version "4.4.7" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" - integrity sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw== +zustand@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" + integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== dependencies: use-sync-external-store "1.2.0"