diff --git a/.eslintignore b/.eslintignore index 035995293..4d1cfb354 100755 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ # Auto Generated PWA files public/sw* public/workbox* -ipfs/* \ No newline at end of file +ipfs/* +public/worker* diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e236a2642..29df5a67a 100755 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,8 +2,6 @@ name: Test on: push: - branches: - - main pull_request: workflow_dispatch: @@ -25,4 +23,4 @@ jobs: run: yarn --prefer-offline - name: Test project - run: yarn node --experimental-vm-modules $(yarn bin jest) + run: yarn test diff --git a/apps/common/components/AmountInput.tsx b/apps/common/components/AmountInput.tsx index 7fbb65dd3..24d98c36c 100644 --- a/apps/common/components/AmountInput.tsx +++ b/apps/common/components/AmountInput.tsx @@ -52,13 +52,13 @@ function AmountInput({ min={0} aria-label={label} value={displayedAmount} - onChange={onAmountChange ? (e) => onAmountChange(e.target.value) : undefined} + onChange={onAmountChange ? (e): void => onAmountChange(e.target.value) : undefined} placeholder={loading ? '' : placeholder ?? '0'} disabled={disabled} /> diff --git a/apps/common/components/AppHeader.tsx b/apps/common/components/AppHeader.tsx index be967dce4..20f562324 100644 --- a/apps/common/components/AppHeader.tsx +++ b/apps/common/components/AppHeader.tsx @@ -3,6 +3,7 @@ import Link from 'next/link'; import {useRouter} from 'next/router'; import {AnimatePresence} from 'framer-motion'; import {Popover, Transition} from '@headlessui/react'; +import {useIsMounted} from '@react-hookz/web'; import {VaultsHeader} from '@vaults/components/header/VaultsHeader'; import {VeYfiHeader} from '@veYFI/components/header/VeYfiHeader'; import Header from '@yearn-finance/web-lib/components/Header'; @@ -11,6 +12,7 @@ import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import BalanceReminderPopover from '@common/components/BalanceReminderPopover'; import {useMenu} from '@common/contexts/useMenu'; import LogoYearn from '@common/icons/LogoYearn'; +import {YBalHeader} from '@yBal/components/header/YBalHeader'; import {YBribeHeader} from '@yBribe/components/header/YBribeHeader'; import {YCrvHeader} from '@yCRV/components/header/YCrvHeader'; @@ -20,12 +22,13 @@ import {MotionDiv} from './MotionDiv'; import type {ReactElement} from 'react'; import type {TMenu} from '@yearn-finance/web-lib/components/Header'; -function Logo(): ReactElement { - const {pathname} = useRouter(); +function Logo(): ReactElement { + const {pathname} = useRouter(); return ( <> + @@ -40,7 +43,7 @@ function Logo(): ReactElement { } -function LogoPopover(): ReactElement { +function LogoPopover(): ReactElement { const [isShowing, set_isShowing] = useState(false); return ( @@ -94,17 +97,22 @@ function LogoPopover(): ReactElement { ); } -export function AppHeader(): ReactElement { - const {pathname} = useRouter(); - const {isActive} = useWeb3(); - const {onOpenMenu} = useMenu(); - const menu = useMemo((): TMenu[] => { +export function AppHeader(): ReactElement { + const isMounted = useIsMounted(); + const {pathname} = useRouter(); + const {isActive} = useWeb3(); + const {onOpenMenu} = useMenu(); + const menu = useMemo((): TMenu[] => { const HOME_MENU = {path: '/', label: 'Home'}; if (pathname.startsWith('/ycrv')) { return [HOME_MENU, ...APPS[AppName.YCRV].menu]; } + if (pathname.startsWith('/ybal')) { + return [HOME_MENU, ...APPS[AppName.YBAL].menu]; + } + if (pathname.startsWith('/vaults')) { return [HOME_MENU, ...APPS[AppName.VAULTS].menu]; } @@ -124,8 +132,10 @@ export function AppHeader(): ReactElement { ]; }, [pathname]); - const supportedNetworks = useMemo((): number[] => { - if (pathname.startsWith('/ycrv') || pathname.startsWith('/veyfi') || pathname.startsWith('/ybribe')) { + + const supportedNetworks = useMemo((): number[] => { + const ethereumOnlyPaths = ['/ycrv', '/ybal', '/veyfi', '/ybribe']; + if (ethereumOnlyPaths.some((path): boolean => pathname.startsWith(path))) { return [1]; } @@ -145,7 +155,7 @@ export function AppHeader(): ReactElement { )} extra={ - +
diff --git a/apps/common/components/Apps.tsx b/apps/common/components/Apps.tsx index 42aa39b23..81fd5dc28 100644 --- a/apps/common/components/Apps.tsx +++ b/apps/common/components/Apps.tsx @@ -1,12 +1,14 @@ import Image from 'next/image'; import vaultsManifest from 'public/apps/vaults-manifest.json'; import veyfiManifest from 'public/apps/veyfi-manifest.json'; +import yBalManifest from 'public/apps/ybal-manifest.json'; import ybribeManifest from 'public/apps/ybribe-manifest.json'; import ycrvManifest from 'public/apps/ycrv-manifest.json'; import {VAULTS_MENU} from '@vaults/constants/menu'; import {VEYFI_MENU} from '@veYFI/constants/menu'; -import {YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {YBAL_TOKEN_ADDRESS, YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; import LogoYearn from '@common/icons/LogoYearn'; +import {YBAL_MENU} from '@yBal/constants/menu'; import {YBRIBE_MENU} from '@yBribe/constants/menu'; import {YCRV_MENU} from '@yCRV/constants/menu'; @@ -17,6 +19,7 @@ import type {TMetaFile} from './Meta'; export enum AppName { VAULTS = 'Vaults', YCRV = 'yCRV', + YBAL = 'yBal', VEYFI = 'veYFI', YBRIBE = 'yBribe' } @@ -55,6 +58,21 @@ export const APPS: { [key in AppName]: TApp } = { priority /> ) }, + yBal: { + name: AppName.YBAL, + href: '/ybal', + menu: YBAL_MENU, + manifest: yBalManifest, + icon: ( + {'yBal'} + ) + }, veYFI: { name: AppName.VEYFI, menu: VEYFI_MENU, diff --git a/apps/common/components/BalanceReminderPopover.tsx b/apps/common/components/BalanceReminderPopover.tsx index 16c39018a..62a389875 100755 --- a/apps/common/components/BalanceReminderPopover.tsx +++ b/apps/common/components/BalanceReminderPopover.tsx @@ -8,7 +8,7 @@ import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import IconAddToMetamask from '@yearn-finance/web-lib/icons/IconAddToMetamask'; import IconCross from '@yearn-finance/web-lib/icons/IconCross'; import IconWallet from '@yearn-finance/web-lib/icons/IconWallet'; -import {toAddress, toWagmiAddress, truncateHex} from '@yearn-finance/web-lib/utils/address'; +import {toAddress, truncateHex} from '@yearn-finance/web-lib/utils/address'; import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount} from '@yearn-finance/web-lib/utils/format.number'; import {useWallet} from '@common/contexts/useWallet'; @@ -26,10 +26,10 @@ type TBalanceReminderElement = { symbol: string, } -function TokenItem({element}: {element: TBalanceReminderElement}): ReactElement { - const {provider} = useWeb3(); - const {safeChainID} = useChainID(); - const balance = useBalance(element.address); +function TokenItem({element}: {element: TBalanceReminderElement}): ReactElement { + const {provider} = useWeb3(); + const {safeChainID} = useChainID(); + const balance = useBalance(element.address); async function addTokenToMetamask(address: string, symbol: string, decimals: number, image: string): Promise { if (!provider) { @@ -40,12 +40,7 @@ function TokenItem({element}: {element: TBalanceReminderElement}): ReactElement const walletClient = await provider.getWalletClient(); await walletClient.watchAsset({ type: 'ERC20', - options: { - address: toWagmiAddress(address), - decimals, - symbol, - image - } + options: {address: toAddress(address), decimals, symbol, image} }); } catch (error) { captureException(error); @@ -93,12 +88,12 @@ function TokenItem({element}: {element: TBalanceReminderElement}): ReactElement } export default function BalanceReminderPopover(): ReactElement { - const {balances, isLoading} = useWallet(); - const {address, ens, isActive, onDesactivate} = useWeb3(); - const {vaults} = useYearn(); + const {balances, isLoading} = useWallet(); + const {address, ens, isActive, onDesactivate} = useWeb3(); + const {vaults} = useYearn(); - const nonNullBalances = useMemo((): TDict => { - const nonNullBalances = Object.entries(balances).reduce((acc: TDict, [address, balance]): TDict => { + const nonNullBalances = useMemo((): TDict => { + const nonNullBalances = Object.entries(balances).reduce((acc: TDict, [address, balance]): TDict => { if (toBigInt(balance?.raw) > 0n) { acc[toAddress(address)] = balance; } @@ -107,8 +102,8 @@ export default function BalanceReminderPopover(): ReactElement { return nonNullBalances; }, [balances]); - const nonNullBalancesForVault = useMemo((): TBalanceReminderElement[] => { - const nonNullBalancesForVault = Object.entries(nonNullBalances).reduce((acc: TBalanceReminderElement[], [address, balance]): TBalanceReminderElement[] => { + const nonNullBalancesForVault = useMemo((): TBalanceReminderElement[] => { + const nonNullBalancesForVault = Object.entries(nonNullBalances).reduce((acc: TBalanceReminderElement[], [address, balance]): TBalanceReminderElement[] => { const currentVault = vaults?.[toAddress(address)]; if (currentVault) { acc.push({ @@ -123,7 +118,7 @@ export default function BalanceReminderPopover(): ReactElement { return nonNullBalancesForVault; }, [nonNullBalances, vaults]); - function renderNoTokenFallback(isLoading: boolean): ReactElement { + function renderNoTokenFallback(isLoading: boolean): ReactElement { if (isLoading) { return (
@@ -153,7 +148,7 @@ export default function BalanceReminderPopover(): ReactElement { leave={'transition ease-in duration-150'} leaveFrom={'opacity-100 translate-y-0'} leaveTo={'opacity-0 translate-y-1'}> - +
@@ -165,7 +160,7 @@ export default function BalanceReminderPopover(): ReactElement { ) : 'Connect wallet'}
-
+
-
+
{rest.map((item, index): ReactElement => (
@@ -100,14 +141,12 @@ function RewardsTab({currentVault}: {currentVault: TYDaemonVault}): ReactElement label={'You have unclaimed'} legend={formatCounterValue(rewardBalance.normalized, rewardTokenBalance.normalizedPrice)} value={`${trimAmount(rewardBalance.normalized)} ${rewardTokenBalance.symbol || 'yvOP'}`} - isDisabled - /> + isDisabled />
@@ -127,14 +166,12 @@ function RewardsTab({currentVault}: {currentVault: TYDaemonVault}): ReactElement label={'You have staked'} legend={formatCounterValue(stakeBalance.normalized, vaultBalance.normalizedPrice)} value={`${trimAmount(stakeBalance.normalized)} ${currentVault.symbol}`} - isDisabled - /> + isDisabled />
diff --git a/apps/vaults/components/SettingsPopover.tsx b/apps/vaults/components/SettingsPopover.tsx index 216c65056..b00efa200 100755 --- a/apps/vaults/components/SettingsPopover.tsx +++ b/apps/vaults/components/SettingsPopover.tsx @@ -8,7 +8,7 @@ import {useYearn} from '@common/contexts/useYearn'; import type {ReactElement} from 'react'; export default function SettingsPopover(): ReactElement { - const {zapProvider, set_zapProvider, zapSlippage, set_zapSlippage} = useYearn(); + const {zapProvider, set_zapProvider, zapSlippage, set_zapSlippage} = useYearn(); return ( @@ -26,7 +26,7 @@ export default function SettingsPopover(): ReactElement { leave={'transition ease-in duration-150'} leaveFrom={'opacity-100 translate-y-0'} leaveTo={'opacity-0 translate-y-1'}> - +
@@ -91,15 +91,15 @@ export default function SettingsPopover(): ReactElement {
-
+
tab.value === (isDepositing ? 0 : 1)) as TTabsOptions; } -function VaultActionsTabsWrapper({currentVault}: {currentVault: TYDaemonVault}): ReactElement { +function VaultActionsTabsWrapper({currentVault}: {currentVault: TYDaemonVault}): ReactElement { const {onSwitchSelectedOptions, isDepositing, actionParams, currentSolver} = useActionFlow(); const [possibleTabs, set_possibleTabs] = useState([tabs[0], tabs[1]]); const {stakingRewardsByVault} = useStakingRewards(); @@ -74,8 +74,8 @@ function VaultActionsTabsWrapper({currentVault}: {currentVault: TYDaemonVault}): set_currentTab(tabs[1]); onSwitchSelectedOptions(Flow.Withdraw); }); - } - + } + if (currentVault.chainID === 10 && hasStakingRewards) { performBatchedUpdates((): void => { set_possibleTabs([tabs[0], tabs[1], tabs[3]]); @@ -163,7 +163,7 @@ function VaultActionsTabsWrapper({currentVault}: {currentVault: TYDaemonVault}): { - const newTab = tabs.find((tab): boolean => tab.value === Number(value)); + const newTab = tabs.find((tab): boolean => tab.value === Number(value)); if (!newTab) { return; } @@ -216,7 +216,7 @@ function VaultActionsTabsWrapper({currentVault}: {currentVault: TYDaemonVault}): {currentTab.value === 3 ? ( ) : ( -
+
diff --git a/apps/vaults/components/details/VaultDetailsHeader.tsx b/apps/vaults/components/details/VaultDetailsHeader.tsx index 4614c6ff9..2e65988d3 100755 --- a/apps/vaults/components/details/VaultDetailsHeader.tsx +++ b/apps/vaults/components/details/VaultDetailsHeader.tsx @@ -4,7 +4,7 @@ import {useSettings} from '@yearn-finance/web-lib/contexts/useSettings'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatToNormalizedValue, toNormalizedValue} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt, toNormalizedValue} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount, formatPercent, formatUSD} from '@yearn-finance/web-lib/utils/format.number'; import {formatCounterValue} from '@yearn-finance/web-lib/utils/format.value'; import {copyToClipboard} from '@yearn-finance/web-lib/utils/helpers'; @@ -56,8 +56,8 @@ function VaultDetailsHeader({vault}: { vault: TYDaemonVault }): ReactElement { const normalizedVaultEarned = useMemo((): number => { const {unrealizedGains} = earned?.earned?.[toAddress(address)] || {}; - const normalizedValue = formatToNormalizedValue(unrealizedGains || 0, decimals); - + const normalizedValue = formatToNormalizedValue(toBigInt(unrealizedGains), decimals); + return normalizedValue > -0.01 ? Math.abs(normalizedValue) : normalizedValue; }, [earned?.earned, address, decimals]); @@ -65,7 +65,7 @@ function VaultDetailsHeader({vault}: { vault: TYDaemonVault }): ReactElement { const vaultPrice = useTokenPrice(address); const vaultName = useMemo((): string => getVaultName(vault), [vault]); const {stakingRewardsByVault, positionsMap} = useStakingRewards(); - const stakedBalance = toNormalizedValue(positionsMap[toAddress(stakingRewardsByVault[address])]?.stake ?? 0, decimals); + const stakedBalance = toNormalizedValue(toBigInt(positionsMap[toAddress(stakingRewardsByVault[address])]?.stake), decimals); const depositedAndStaked = vaultBalance + stakedBalance; return ( @@ -73,7 +73,7 @@ function VaultDetailsHeader({vault}: { vault: TYDaemonVault }): ReactElement {  {vaultName}  -
+
{address ? (
- {formatAmount(formatToNormalizedValue(tvl.total_assets, decimals))} + {formatAmount(formatToNormalizedValue(toBigInt(tvl.total_assets), decimals))} diff --git a/apps/vaults/components/details/actions/QuickActionsButtons.tsx b/apps/vaults/components/details/actions/QuickActionsButtons.tsx index a895eb323..983a5d30f 100644 --- a/apps/vaults/components/details/actions/QuickActionsButtons.tsx +++ b/apps/vaults/components/details/actions/QuickActionsButtons.tsx @@ -1,5 +1,4 @@ import React, {useCallback, useEffect, useState} from 'react'; -import {ethers} from 'ethers'; import {useAsync} from '@react-hookz/web'; import {useActionFlow} from '@vaults/contexts/useActionFlow'; import {Solver, useSolver} from '@vaults/contexts/useSolver'; @@ -8,7 +7,7 @@ import {Button} from '@yearn-finance/web-lib/components/Button'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {ETH_TOKEN_ADDRESS, YVWETH_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {ETH_TOKEN_ADDRESS, MAX_UINT_256, YVWETH_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; import {toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; import {useWallet} from '@common/contexts/useWallet'; @@ -16,7 +15,7 @@ import {useWallet} from '@common/contexts/useWallet'; import type {ReactElement} from 'react'; import type {TNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; -function VaultDetailsQuickActionsButtons(): ReactElement { +function VaultDetailsQuickActionsButtons(): ReactElement { const {refresh} = useWallet(); const {refresh: refreshZapBalances} = useWalletForZap(); const {address, isActive} = useWeb3(); @@ -32,7 +31,6 @@ function VaultDetailsQuickActionsButtons(): ReactElement { ** called when amount/in or out changes. Calls the allowanceFetcher callback. **********************************************************************************************/ const [{result: allowanceFrom, status}, actions] = useAsync(async (): Promise => onRetrieveAllowance(true), toNormalizedBN(0)); - useEffect((): void => { actions.execute(); }, [actions, isActive, address, onRetrieveAllowance, hash]); @@ -72,10 +70,10 @@ function VaultDetailsQuickActionsButtons(): ReactElement { ** This approve can not be triggered if the wallet is not active ** (not connected) or if the tx is still pending. **************************************************************************/ - async function onApproveFrom(): Promise { - const shouldApproveInfinite = currentSolver === Solver.PARTNER_CONTRACT || currentSolver === Solver.VANILLA || currentSolver === Solver.INTERNAL_MIGRATION; + async function onApproveFrom(): Promise { + const shouldApproveInfinite = currentSolver === Solver.PARTNER_CONTRACT || currentSolver === Solver.VANILLA || currentSolver === Solver.INTERNAL_MIGRATION; onApprove( - shouldApproveInfinite ? ethers.constants.MaxUint256 : actionParams?.amount.raw, + shouldApproveInfinite ? MAX_UINT_256 : actionParams?.amount.raw, set_txStatusApprove, async (): Promise => { await actions.execute(); @@ -84,8 +82,13 @@ function VaultDetailsQuickActionsButtons(): ReactElement { } const isDiffNetwork = !!safeChainID && currentVault.chainID !== safeChainID; - - const isButtonDisabled = !isActive || actionParams?.amount.raw.isZero() || actionParams?.amount.raw.gt(maxDepositPossible.raw) || isLoadingExpectedOut || isDiffNetwork; + const isButtonDisabled = ( + !isActive + || toBigInt(actionParams.amount.raw) == 0n + || toBigInt(actionParams.amount.raw) > toBigInt(maxDepositPossible.raw) + || isLoadingExpectedOut + || isDiffNetwork + ); /* 🔵 - Yearn Finance ****************************************************** ** Wrapper to decide if we should use the partner contract or not @@ -95,14 +98,15 @@ function VaultDetailsQuickActionsButtons(): ReactElement { toAddress(actionParams?.selectedOptionFrom?.value) === ETH_TOKEN_ADDRESS && toAddress(actionParams?.selectedOptionTo?.value) === YVWETH_ADDRESS ); - const hasAllowanceSet = actionParams?.amount.raw.gt(toBigInt(allowanceFrom?.raw)); + const isAboveAllowance = toBigInt(actionParams.amount.raw) > toBigInt(allowanceFrom?.raw); const isButtonBusy = txStatusApprove.pending || status !== 'success'; if ( - !(isDepositingEthViaChainCoin && shouldUseChainCoinContract) && (isButtonBusy || hasAllowanceSet) && ( + !(isDepositingEthViaChainCoin && shouldUseChainCoinContract) && (isButtonBusy || isAboveAllowance) && ( (currentSolver === Solver.VANILLA && isDepositing) || (currentSolver === Solver.INTERNAL_MIGRATION) || (currentSolver === Solver.COWSWAP) || (currentSolver === Solver.WIDO) + || (currentSolver === Solver.PORTALS) || (currentSolver === Solver.PARTNER_CONTRACT) || (currentSolver === Solver.OPTIMISM_BOOSTER) ) @@ -111,7 +115,7 @@ function VaultDetailsQuickActionsButtons(): ReactElement { @@ -125,7 +129,11 @@ function VaultDetailsQuickActionsButtons(): ReactElement { onClick={async (): Promise => onExecuteDeposit(set_txStatusExecuteDeposit, onSuccess)} className={'w-full whitespace-nowrap'} isBusy={txStatusExecuteDeposit.pending} - isDisabled={!isActive || actionParams?.amount.raw.isZero() || actionParams?.amount.raw.gt(maxDepositPossible.raw)}> + isDisabled={( + !isActive + || toBigInt(actionParams.amount.raw) === 0n + || toBigInt(actionParams.amount.raw) > toBigInt(maxDepositPossible.raw) + )}> {'Deposit and Stake'} ); diff --git a/apps/vaults/components/details/actions/QuickActionsFrom.tsx b/apps/vaults/components/details/actions/QuickActionsFrom.tsx index ee0e37e16..9be69486f 100644 --- a/apps/vaults/components/details/actions/QuickActionsFrom.tsx +++ b/apps/vaults/components/details/actions/QuickActionsFrom.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useCallback} from 'react'; import {useActionFlow} from '@vaults/contexts/useActionFlow'; import Renderable from '@yearn-finance/web-lib/components/Renderable'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; @@ -13,21 +13,20 @@ import {useTokenPrice} from '@common/hooks/useTokenPrice'; import type {ChangeEvent, ReactElement} from 'react'; -function VaultDetailsQuickActionsFrom(): ReactElement { +function VaultDetailsQuickActionsFrom(): ReactElement { const {isActive} = useWeb3(); const {balances} = useWallet(); const { possibleOptionsFrom, actionParams, onUpdateSelectedOptionFrom, onChangeAmount, maxDepositPossible, isDepositing } = useActionFlow(); - const selectedFromBalance = useBalance(toAddress(actionParams?.selectedOptionFrom?.value)); const selectedOptionFromPricePerToken = useTokenPrice(toAddress(actionParams?.selectedOptionFrom?.value)); const hasMultipleInputsToChooseFrom = isActive && isDepositing && possibleOptionsFrom.length > 1; const selectedFromSymbol = actionParams?.selectedOptionFrom?.symbol || 'tokens'; const selectedFromIcon = actionParams?.selectedOptionFrom?.icon; - function renderMultipleOptionsFallback(): ReactElement { + function renderMultipleOptionsFallback(): ReactElement { return ( ): void => { + onChangeAmount( + handleInputChangeEventValue( + e.target.value, + balances?.[toAddress(actionParams?.selectedOptionFrom?.value)]?.decimals || 18 + ) + ); + }, [actionParams?.selectedOptionFrom?.value, balances, onChangeAmount]); + return ( -
+
-
+
): void => onChangeAmount( - handleInputChangeEventValue( - e.target.value, - balances?.[toAddress(actionParams?.selectedOptionFrom?.value)]?.decimals || 18 - ) - )} /> + onChange={onChangeInput} />
diff --git a/apps/veyfi/components/LockTab.tsx b/apps/veyfi/components/LockTab.tsx index cb534d419..b10367c33 100644 --- a/apps/veyfi/components/LockTab.tsx +++ b/apps/veyfi/components/LockTab.tsx @@ -1,26 +1,26 @@ -import {useEffect, useMemo, useState} from 'react'; +import {useCallback, useEffect, useMemo, useState} from 'react'; +import {formatUnits} from 'viem'; import {useVotingEscrow} from '@veYFI/contexts/useVotingEscrow'; -import {useTransaction} from '@veYFI/hooks/useTransaction'; import {getVotingPower} from '@veYFI/utils'; -import * as VotingEscrowActions from '@veYFI/utils/actions/votingEscrow'; +import {increaseVeYFILockAmount, lockVeYFI} from '@veYFI/utils/actions'; import {MAX_LOCK_TIME, MIN_LOCK_AMOUNT, MIN_LOCK_TIME} from '@veYFI/utils/constants'; import {validateAllowance, validateAmount, validateNetwork} from '@veYFI/utils/validations'; import {Button} from '@yearn-finance/web-lib/components/Button'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatBN, formatUnits, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount} from '@yearn-finance/web-lib/utils/format.number'; import {handleInputChangeEventValue} from '@yearn-finance/web-lib/utils/handlers/handleInputChangeEventValue'; import {fromWeeks, getTimeUntil, toSeconds, toTime, toWeeks} from '@yearn-finance/web-lib/utils/time'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; import {AmountInput} from '@common/components/AmountInput'; import {useWallet} from '@common/contexts/useWallet'; import {useBalance} from '@common/hooks/useBalance'; +import {approveERC20} from '@common/utils/actions'; -import type {BigNumber} from 'ethers'; import type {ReactElement} from 'react'; import type {TMilliseconds} from '@yearn-finance/web-lib/utils/time'; -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; function LockTab(): ReactElement { const [lockAmount, set_lockAmount] = useState(toNormalizedBN(0)); @@ -30,23 +30,65 @@ function LockTab(): ReactElement { const {refresh: refreshBalances} = useWallet(); const {votingEscrow, positions, allowances, isLoading: isLoadingVotingEscrow, refresh: refreshVotingEscrow} = useVotingEscrow(); const tokenBalance = useBalance(toAddress(votingEscrow?.token)); - const clearLockAmount = (): void => set_lockAmount(toNormalizedBN(0)); - const refreshData = (): unknown => Promise.all([refreshVotingEscrow(), refreshBalances()]); - const onTxSuccess = (): unknown => Promise.all([refreshData(), clearLockAmount()]); - const [approveLock, approveLockStatus] = useTransaction(VotingEscrowActions.approveLock, refreshData); - const [lock, lockStatus] = useTransaction(VotingEscrowActions.lock, onTxSuccess); - const [increaseLockAmount, increaseLockAmountStatus] = useTransaction(VotingEscrowActions.increaseLockAmount, onTxSuccess); - - const hasLockedAmount = formatBN(positions?.deposit?.underlyingBalance).gt(0); + const hasLockedAmount = toBigInt(positions?.deposit?.underlyingBalance) > 0n; + const [approveLockStatus, set_approveLockStatus] = useState(defaultTxStatus); + const [lockStatus, set_lockStatus] = useState(defaultTxStatus); + const [increaseLockAmountStatus, set_increaseLockAmountStatus] = useState(defaultTxStatus); const unlockTime = useMemo((): TMilliseconds => { return positions?.unlockTime || Date.now() + fromWeeks(toTime(lockTime)); }, [positions?.unlockTime, lockTime]); - const votingPower = useMemo((): BigNumber => { - return getVotingPower(formatBN(positions?.deposit?.underlyingBalance).add(lockAmount.raw), unlockTime); + const votingPower = useMemo((): bigint => { + return getVotingPower(toBigInt(positions?.deposit?.underlyingBalance) + toBigInt(lockAmount.raw), unlockTime); }, [positions?.deposit?.underlyingBalance, lockAmount, unlockTime]); + const refreshData = useCallback(async (): Promise => { + await Promise.all([refreshVotingEscrow(), refreshBalances()]); + }, [refreshVotingEscrow, refreshBalances]); + + const onTxSuccess = useCallback(async (): Promise => { + await Promise.all([refreshData(), set_lockAmount(toNormalizedBN(0))]); + }, [refreshData]); + + const onApproveLock = useCallback(async (): Promise => { + const result = await approveERC20({ + connector: provider, + contractAddress: votingEscrow?.token, + spenderAddress: votingEscrow?.address, + statusHandler: set_approveLockStatus, + amount: lockAmount.raw + }); + if (result.isSuccessful) { + refreshData(); + } + }, [lockAmount.raw, provider, refreshData, votingEscrow?.address, votingEscrow?.token]); + + const onLock = useCallback(async (): Promise => { + const result = await lockVeYFI({ + connector: provider, + contractAddress: votingEscrow?.address, + amount: lockAmount.raw, + time: toBigInt(toSeconds(unlockTime)), + statusHandler: set_lockStatus + }); + if (result.isSuccessful) { + onTxSuccess(); + } + }, [provider, votingEscrow?.address, lockAmount.raw, unlockTime, onTxSuccess]); + + const onIncreaseLockAmount = useCallback(async (): Promise => { + const result = await increaseVeYFILockAmount({ + connector: provider, + contractAddress: votingEscrow?.address, + amount: lockAmount.raw, + statusHandler: set_increaseLockAmountStatus + }); + if (result.isSuccessful) { + onTxSuccess(); + } + }, [provider, votingEscrow?.address, lockAmount.raw, onTxSuccess]); + useEffect((): void => { if(!positions?.unlockTime) { return; @@ -82,21 +124,21 @@ function LockTab(): ReactElement { const txAction = !isApproved ? { label: 'Approve', - onAction: async (): Promise => approveLock(provider, toAddress(address), toAddress(votingEscrow?.token), toAddress(votingEscrow?.address)), - isLoading: approveLockStatus.loading, + onAction: onApproveLock, + isLoading: approveLockStatus.pending, isDisabled: isApproveDisabled } : hasLockedAmount ? { label: 'Lock', - onAction: async (): Promise => increaseLockAmount(provider, toAddress(address), toAddress(votingEscrow?.address), lockAmount.raw), - isLoading: increaseLockAmountStatus.loading, + onAction: onIncreaseLockAmount, + isLoading: increaseLockAmountStatus.pending, isDisabled: isLockDisabled } : { label: 'Lock', - onAction: async (): Promise => lock(provider, toAddress(address), toAddress(votingEscrow?.address), lockAmount.raw, toSeconds(unlockTime)), - isLoading: lockStatus.loading, + onAction: onLock, + isLoading: lockStatus.pending, isDisabled: isLockDisabled }; diff --git a/apps/veyfi/components/ManageLockTab.tsx b/apps/veyfi/components/ManageLockTab.tsx index 592684d7d..0a8de5222 100644 --- a/apps/veyfi/components/ManageLockTab.tsx +++ b/apps/veyfi/components/ManageLockTab.tsx @@ -1,23 +1,20 @@ -import {useMemo, useState} from 'react'; +import {useCallback, useMemo, useState} from 'react'; +import {formatUnits} from 'viem'; import {useVotingEscrow} from '@veYFI/contexts/useVotingEscrow'; -import {useTransaction} from '@veYFI/hooks/useTransaction'; import {getVotingPower} from '@veYFI/utils'; -import * as VotingEscrowActions from '@veYFI/utils/actions/votingEscrow'; +import {extendVeYFILockTime, withdrawLockedVeYFI} from '@veYFI/utils/actions'; import {MAX_LOCK_TIME, MIN_LOCK_TIME} from '@veYFI/utils/constants'; import {validateAmount, validateNetwork} from '@veYFI/utils/validations'; import {Button} from '@yearn-finance/web-lib/components/Button'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; -import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatBN, formatUnits} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {fromWeeks, getTimeUntil, toSeconds, toTime, toWeeks} from '@yearn-finance/web-lib/utils/time'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {AmountInput} from '@common/components/AmountInput'; import {useWallet} from '@common/contexts/useWallet'; -import {AmountInput} from '../../common/components/AmountInput'; - -import type {BigNumber} from 'ethers'; import type {ReactElement} from 'react'; -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; function ManageLockTab(): ReactElement { const [lockTime, set_lockTime] = useState(''); @@ -25,24 +22,47 @@ function ManageLockTab(): ReactElement { const {safeChainID} = useChainID(); const {refresh: refreshBalances} = useWallet(); const {votingEscrow, positions, refresh: refreshVotingEscrow} = useVotingEscrow(); - const clearLockTime = (): void => set_lockTime(''); - const refreshData = (): unknown => Promise.all([refreshVotingEscrow(), refreshBalances()]); - const onTxSuccess = (): unknown => Promise.all([refreshData(), clearLockTime()]); - const [extendLockTime, extendLockTimeStatus] = useTransaction(VotingEscrowActions.extendLockTime, onTxSuccess); - const [withdrawLocked, withdrawLockedStatus] = useTransaction(VotingEscrowActions.withdrawLocked, onTxSuccess); - - const hasLockedAmount = formatBN(positions?.deposit?.underlyingBalance).gt(0); - const willExtendLock = formatBN(lockTime).gt(0); + const hasLockedAmount = toBigInt(positions?.deposit?.underlyingBalance) > 0n; + const willExtendLock = toBigInt(lockTime) > 0n; const timeUntilUnlock = positions?.unlockTime ? getTimeUntil(positions?.unlockTime) : undefined; const weeksToUnlock = toWeeks(timeUntilUnlock); const newUnlockTime = toTime(positions?.unlockTime) + fromWeeks(toTime(lockTime)); - const hasPenalty = formatBN(positions?.penalty).gt(0); + const hasPenalty = toBigInt(positions?.penalty) > 0n; + const [extendLockTimeStatus, set_extendLockTimeStatus] = useState(defaultTxStatus); + const [withdrawLockedStatus, set_withdrawLockedStatus] = useState(defaultTxStatus); + + const onTxSuccess = useCallback(async (): Promise => { + await Promise.all([refreshVotingEscrow(), refreshBalances(), set_lockTime('')]); + }, [refreshBalances, refreshVotingEscrow]); + + const onExtendLockTime = useCallback(async (): Promise => { + const result = await extendVeYFILockTime({ + connector: provider, + contractAddress: votingEscrow?.address, + time: toBigInt(toSeconds(newUnlockTime)), + statusHandler: set_extendLockTimeStatus + }); + if (result.isSuccessful) { + onTxSuccess(); + } + }, [newUnlockTime, onTxSuccess, provider, votingEscrow?.address]); + + const onWithdrawLocked = useCallback(async (): Promise => { + const result = await withdrawLockedVeYFI({ + connector: provider, + contractAddress: votingEscrow?.address, + statusHandler: set_withdrawLockedStatus + }); + if (result.isSuccessful) { + onTxSuccess(); + } + }, [onTxSuccess, provider, votingEscrow?.address]); - const votingPower = useMemo((): BigNumber => { + const votingPower = useMemo((): bigint => { if(!positions?.deposit || !newUnlockTime) { - return formatBN(0); + return 0n; } - return willExtendLock ? getVotingPower(positions?.deposit?.underlyingBalance, newUnlockTime) : formatBN(positions?.deposit?.balance); + return willExtendLock ? getVotingPower(positions?.deposit?.underlyingBalance, newUnlockTime) : toBigInt(positions?.deposit?.balance); }, [positions?.deposit, newUnlockTime, willExtendLock]); const {isValid: isValidLockTime, error: lockTimeError} = validateAmount({ @@ -85,9 +105,9 @@ function ManageLockTab(): ReactElement { disabled />
@@ -105,7 +125,7 @@ function ManageLockTab(): ReactElement {
diff --git a/apps/veyfi/contexts/useVotingEscrow.tsx b/apps/veyfi/contexts/useVotingEscrow.tsx index 0d64398ea..322da021f 100644 --- a/apps/veyfi/contexts/useVotingEscrow.tsx +++ b/apps/veyfi/contexts/useVotingEscrow.tsx @@ -1,17 +1,14 @@ import React, {createContext, memo, useCallback, useContext, useMemo} from 'react'; -import {Contract} from 'ethcall'; -import {FixedNumber} from 'ethers'; -import useSWR from 'swr'; +import {useContractRead, useContractReads} from 'wagmi'; import VEYFI_ABI from '@veYFI/utils/abi/veYFI.abi'; import VEYFI_POSITION_HELPER_ABI from '@veYFI/utils/abi/veYFIPositionHelper.abi'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import ERC20_ABI from '@yearn-finance/web-lib/utils/abi/erc20.abi'; -import {allowanceKey} from '@yearn-finance/web-lib/utils/address'; +import {allowanceKey, isZeroAddress, toAddress} from '@yearn-finance/web-lib/utils/address'; import {VEYFI_ADDRESS, VEYFI_POSITION_HELPER_ADDRESS, YFI_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt, decodeAsNumber, decodeAsString} from '@yearn-finance/web-lib/utils/decoder'; import {toMilliseconds} from '@yearn-finance/web-lib/utils/time'; -import {getProvider, newEthCallProvider} from '@yearn-finance/web-lib/utils/web3/providers'; -import type {BigNumber} from 'ethers'; import type {ReactElement} from 'react'; import type {TAddress, TDict} from '@yearn-finance/web-lib/types'; import type {TMilliseconds} from '@yearn-finance/web-lib/utils/time'; @@ -22,28 +19,27 @@ export type TVotingEscrow = { name: string, symbol: string, decimals: number, - supply: BigNumber, + supply: bigint, rewardPool: TAddress, } export type TPosition = { - balance: BigNumber, - underlyingBalance: BigNumber, + balance: bigint, + underlyingBalance: bigint, } export type TVotingEscrowPosition = { deposit?: TPosition, - // yield?: TPosition, unlockTime?: TMilliseconds, - penalty?: BigNumber, + penalty?: bigint, penaltyRatio?: number, - withdrawable?: BigNumber, + withdrawable?: bigint, } export type TVotingEscrowContext = { votingEscrow: TVotingEscrow | undefined, positions: TVotingEscrowPosition | undefined, - allowances: TDict, + allowances: TDict, isLoading: boolean, refresh: VoidFunction, } @@ -55,89 +51,104 @@ const defaultProps: TVotingEscrowContext = { refresh: (): void => undefined }; -const VotingEscrowContext = createContext(defaultProps); +const VotingEscrowContext = createContext(defaultProps); export const VotingEscrowContextApp = memo(function VotingEscrowContextApp({children}: {children: ReactElement}): ReactElement { - const {provider, address, isActive} = useWeb3(); - - const assetFetcher = useCallback(async (): Promise => { - const currentProvider = provider || getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const veYFIContract = new Contract(VEYFI_ADDRESS, VEYFI_ABI); - const [token, name, symbol, decimals, supply, rewardPool] = await ethcallProvider.tryAll([ - veYFIContract.token(), - veYFIContract.name(), - veYFIContract.symbol(), - veYFIContract.decimals(), - veYFIContract.supply(), - veYFIContract.reward_pool() - ]) as [TAddress, string, string, number, BigNumber, TAddress]; - + const {address, isActive} = useWeb3(); + + /* 🔵 - Yearn Finance ********************************************************** + ** Retrieving the basic information of the veYFI contract. They are not linked + ** to the user's address, so they are not affected by the `isActive` flag. + ******************************************************************************/ + const baseVeYFIContract = {address: VEYFI_ADDRESS, abi: VEYFI_ABI}; + const {data: votingEscrowData, status: votingEscrowStatus, refetch: refreshVotingEscrow} = useContractReads({ + contracts: [ + {...baseVeYFIContract, functionName: 'token'}, + {...baseVeYFIContract, functionName: 'name'}, + {...baseVeYFIContract, functionName: 'symbol'}, + {...baseVeYFIContract, functionName: 'decimals'}, + {...baseVeYFIContract, functionName: 'supply'}, + {...baseVeYFIContract, functionName: 'reward_pool'} + ] + }); + const votingEscrow = useMemo((): TVotingEscrow | undefined => { + if (!votingEscrowData || votingEscrowStatus !== 'success') { + return undefined; + } + const [token, name, symbol, decimals, supply, rewardPool] = votingEscrowData; return ({ address: VEYFI_ADDRESS, - token, - name, - symbol, - decimals, - supply, - rewardPool + token: toAddress(decodeAsString(token)), + name: decodeAsString(name), + symbol: decodeAsString(symbol), + decimals: decodeAsNumber(decimals), + supply: decodeAsBigInt(supply), + rewardPool: toAddress(decodeAsString(rewardPool)) }); - }, [provider]); - const {data: votingEscrow, mutate: refreshVotingEscrow, isLoading: isLoadingVotingEscrow} = useSWR('asset', assetFetcher, {shouldRetryOnError: false}); - - const positionsFetcher = useCallback(async (): Promise => { - if (!isActive || !address) { - return {}; + }, [votingEscrowData, votingEscrowStatus]); + + + /* 🔵 - Yearn Finance ********************************************************** + ** Retrieving the user's positions in the veYFI contract. They are linked to the + ** user's address, so they are affected by the `isActive` flag. + ******************************************************************************/ + const baseVeYFIPositionContract = {address: VEYFI_POSITION_HELPER_ADDRESS, abi: VEYFI_POSITION_HELPER_ABI}; + const {data: positionData, status: positionStatus, refetch: refreshPosition} = useContractRead({ + ...baseVeYFIPositionContract, + functionName: 'getPositionDetails', + args: [toAddress(address)], + enabled: isActive && address !== undefined && !isZeroAddress(address) + }); + const positions = useMemo((): TVotingEscrowPosition | undefined => { + if (!positionData || positionStatus !== 'success') { + return undefined; } - const currentProvider = provider || getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const veYFIPositionHelperContract = new Contract(VEYFI_POSITION_HELPER_ADDRESS, VEYFI_POSITION_HELPER_ABI); - - const [positionDetails] = await ethcallProvider.tryAll([veYFIPositionHelperContract.getPositionDetails(address)]) as [{balance: BigNumber, depositAmount: BigNumber, unlockTime: BigNumber, penalty: BigNumber, withdrawable: BigNumber}]; - + const {balance, depositAmount, withdrawable, penalty, unlockTime} = positionData; const depositPosition: TPosition = { - balance: positionDetails.balance, - underlyingBalance: positionDetails.depositAmount + balance: balance, + underlyingBalance: depositAmount }; - return { deposit: depositPosition, - unlockTime: toMilliseconds(positionDetails.unlockTime.toNumber()), - penalty: positionDetails.penalty, - penaltyRatio: positionDetails.depositAmount.gt(0) ? FixedNumber.from(positionDetails.penalty).divUnsafe(FixedNumber.from(positionDetails.depositAmount)).toUnsafeFloat() : 0, - withdrawable: positionDetails.withdrawable + unlockTime: toMilliseconds(Number(unlockTime)), + penalty: penalty, + penaltyRatio: depositAmount > 0 ? Number(penalty) / Number(depositAmount) : 0, + withdrawable: withdrawable }; - }, [isActive, address, provider]); - const {data: positions, mutate: refreshPositions, isLoading: isLoadingPositions} = useSWR(isActive && provider ? 'positions' : null, positionsFetcher, {shouldRetryOnError: false}); - - const allowancesFetcher = useCallback(async (): Promise> => { - if (!isActive || !address) { + }, [positionData, positionStatus]); + + + /* 🔵 - Yearn Finance ********************************************************** + ** Retrieving the user's allowances of YFI for the veYFI contract. + ******************************************************************************/ + const baseYFIContract = {address: YFI_ADDRESS, abi: ERC20_ABI}; + const {data: allowance, status: allowanceStatus, refetch: refreshAllowance} = useContractRead({ + ...baseYFIContract, + functionName: 'allowance', + args: [toAddress(address), VEYFI_ADDRESS], + enabled: isActive && address !== undefined && !isZeroAddress(address) + }); + const allowances = useMemo((): TDict => { + if (!address || !allowance || allowanceStatus !== 'success') { return {}; } - const currentProvider = provider || getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const yfiContract = new Contract(YFI_ADDRESS, ERC20_ABI); - - const [yfiAllowanceVeYFI] = await ethcallProvider.tryAll([yfiContract.allowance(address, VEYFI_ADDRESS)]) as BigNumber[]; - return ({ - [allowanceKey(1, YFI_ADDRESS, VEYFI_ADDRESS, address)]: yfiAllowanceVeYFI + [allowanceKey(1, YFI_ADDRESS, VEYFI_ADDRESS, address)]: allowance }); - }, [isActive, address, provider]); - const {data: allowances, mutate: refreshAllowances, isLoading: isLoadingAllowances} = useSWR(isActive && provider ? 'allowances' : null, allowancesFetcher, {shouldRetryOnError: false}); + }, [address, allowance, allowanceStatus]); const refresh = useCallback((): void => { refreshVotingEscrow(); - refreshPositions(); - refreshAllowances(); - }, [refreshVotingEscrow, refreshPositions, refreshAllowances]); + refreshPosition(); + refreshAllowance(); + }, [refreshVotingEscrow, refreshPosition, refreshAllowance]); const contextValue = useMemo((): TVotingEscrowContext => ({ votingEscrow, positions, allowances: allowances ?? {}, - isLoading: isLoadingVotingEscrow && isLoadingPositions && isLoadingAllowances, + isLoading: votingEscrowStatus === 'loading' && positionStatus === 'loading' && allowanceStatus === 'loading', refresh - }), [votingEscrow, positions, allowances, isLoadingVotingEscrow, isLoadingPositions, isLoadingAllowances, refresh]); + }), [votingEscrow, positions, allowances, votingEscrowStatus, positionStatus, allowanceStatus, refresh]); return ( diff --git a/apps/veyfi/hooks/useTransaction.ts b/apps/veyfi/hooks/useTransaction.ts deleted file mode 100644 index d40900789..000000000 --- a/apps/veyfi/hooks/useTransaction.ts +++ /dev/null @@ -1,70 +0,0 @@ -import {useState} from 'react'; -import {yToast} from '@yearn-finance/web-lib/components/yToast'; - -import type {ethers} from 'ethers'; -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; - -type TStatus = { - loading?: boolean; - error?: string; - executed?: boolean; -} - -type TTxFuncArgs = Parameters<(arg1: ethers.providers.JsonRpcProvider, ...args: unknown[] ) => void> - -type TTxFunc = (...args: T1) => Promise; - -export const useTransaction = ( - func: TTxFunc, - onSuccess?: (payload: TTxResponse) => void, - onError?: (error: unknown) => void -): [TTxFunc, TStatus, TTxResponse | undefined] => { - const {toast} = yToast(); - const [result, set_result] = useState(); - const [isLoading, set_isLoading] = useState(false); - const [error, set_error] = useState(undefined); - const [isExecuted, set_isExecuted] = useState(false); - - const status: TStatus = { - loading: isLoading, - error, - executed: isExecuted - }; - - const execute = async (...p: T): Promise => { - set_isLoading(true); - set_error(undefined); - try { - const funcResult = await func(...p); - if(!funcResult.isSuccessful) { - throw new Error('Transaction failed'); - } - set_result(funcResult); - set_isLoading(false); - set_isExecuted(true); - toast({content: 'Transaction successful', type: 'success'}); - if (onSuccess) { - onSuccess(funcResult); - } - return funcResult; - } catch (error: unknown) { - if (error instanceof Error){ - console.error(error.message); - set_error(error.message); - } else { - console.error(error); - set_error('Unknown error'); - } - set_result(undefined); - set_isLoading(false); - set_isExecuted(false); - if (onError) { - onError(error); - } - toast({content: 'Transaction failed', type: 'error'}); - return ({isSuccessful: false}); - } - }; - - return [execute, status, result]; -}; diff --git a/apps/veyfi/utils/actions.ts b/apps/veyfi/utils/actions.ts new file mode 100644 index 000000000..f8ae06ba6 --- /dev/null +++ b/apps/veyfi/utils/actions.ts @@ -0,0 +1,154 @@ +import VEYFI_ABI from '@veYFI/utils/abi/veYFI.abi'; +import {prepareWriteContract} from '@wagmi/core'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {assert} from '@common/utils/assert'; +import {assertAddress, handleTx} from '@common/utils/toWagmiProvider'; + +import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; +import type {TWriteTransaction} from '@common/utils/toWagmiProvider'; + +/* 🔵 - Yearn Finance ********************************************************** +** lockVeYFI is a _WRITE_ function that locks funds in the veYFI contract in +** exchange of some voting power. +** +** @app - veYFI +** @param amount - The amount of the underlying asset to deposit. +** @param time - The amount of time to lock the funds for. +******************************************************************************/ +type TLockVeYFI = TWriteTransaction & { + amount: bigint; + time: bigint +}; +export async function lockVeYFI(props: TLockVeYFI): Promise { + assert(props.connector, 'No connector'); + assert(props.time > 0n, 'Time is 0'); + assert(props.amount > 0n, 'Amount is 0'); + assertAddress(props.contractAddress); + + const signerAddress = await props.connector.getAccount(); + assertAddress(signerAddress, 'signerAddress'); + + return await handleTx(props, { + address: props.contractAddress, + abi: VEYFI_ABI, + functionName: 'modify_lock', + args: [props.amount, props.time, signerAddress] + }); +} + +/* 🔵 - Yearn Finance ********************************************************** +** increaseVeYFILockAmount is a _WRITE_ function that increases the amount of +** funds locked in the veYFI contract in exchange of some voting power. +** +** @app - veYFI +** @param amount - The amount of the underlying asset to deposit. +******************************************************************************/ +type TIncreaseVeYFILockAmount = TWriteTransaction & { + amount: bigint; +}; +export async function increaseVeYFILockAmount(props: TIncreaseVeYFILockAmount): Promise { + assert(props.connector, 'No connector'); + assert(props.amount > 0n, 'Amount is 0'); + assertAddress(props.contractAddress); + + const signerAddress = await props.connector.getAccount(); + assertAddress(signerAddress, 'signerAddress'); + + return await handleTx(props, { + address: props.contractAddress, + abi: VEYFI_ABI, + functionName: 'modify_lock', + args: [props.amount, 0n, signerAddress] + }); +} + +/* 🔵 - Yearn Finance ********************************************************** +** extendVeYFILockTime is a _WRITE_ function that increases the amount of time funds +** are locked in the veYFI contract in exchange of some voting power. +** +** @app - veYFI +** @param time - The amount of time to lock the funds for. +******************************************************************************/ +type TExtendVeYFILockTime = TWriteTransaction & { + time: bigint; +}; +export async function extendVeYFILockTime(props: TExtendVeYFILockTime): Promise { + assert(props.connector, 'No connector'); + assert(props.time > 0n, 'Time is 0'); + assertAddress(props.contractAddress); + + const signerAddress = await props.connector.getAccount(); + assertAddress(signerAddress, 'signerAddress'); + + return await handleTx(props, { + address: props.contractAddress, + abi: VEYFI_ABI, + functionName: 'modify_lock', + args: [0n, props.time, signerAddress] + }); +} + +/* 🔵 - Yearn Finance ********************************************************** +** getVeYFIWithdrawPenalty is a _READ_ function that simulates a withdrawal from +** the veYFI contract and returns the penalty to be paid. +** +** @app - veYFI +******************************************************************************/ +type TGetVeYFIWithdrawPenalty = TWriteTransaction; +export async function getVeYFIWithdrawPenalty(props: TGetVeYFIWithdrawPenalty): Promise { + try { + const {result} = await prepareWriteContract({ + address: toAddress(props.contractAddress), + abi: VEYFI_ABI, + functionName: 'withdraw' + }); + return result.penalty; + } catch (error) { + return 0n; + } +} + +/* 🔵 - Yearn Finance ********************************************************** +** withdrawUnlockedVeYFI is a _WRITE_ function that withdraws unlocked funds from +** the veYFI contract. +** Note: will fail if there is a penalty to be paid. +** +** @app - veYFI +******************************************************************************/ +type TWithdrawUnlockedVeYFI = TWriteTransaction; +export async function withdrawUnlockedVeYFI(props: TWithdrawUnlockedVeYFI): Promise { + assertAddress(props.contractAddress); + + props.statusHandler?.({...defaultTxStatus, pending: true}); + const penalty = await getVeYFIWithdrawPenalty(props); + if (penalty > 0n) { + props.statusHandler?.({...defaultTxStatus, error: true}); + setTimeout((): void => { + props.statusHandler?.({...defaultTxStatus}); + }, 3000); + return ({isSuccessful: false, error: new Error('Tokens are not yet unlocked')}); + } + + return await handleTx(props, { + address: props.contractAddress, + abi: VEYFI_ABI, + functionName: 'withdraw' + }); +} + +/* 🔵 - Yearn Finance ********************************************************** +** withdrawLockedVeYFI is a _WRITE_ function that withdraws locked funds from the +** veYFI contract. +** +** @app - veYFI +******************************************************************************/ +type TWithdrawLockedVeYFI = TWriteTransaction; +export async function withdrawLockedVeYFI(props: TWithdrawLockedVeYFI): Promise { + assertAddress(props.contractAddress); + return await handleTx(props, { + address: props.contractAddress, + abi: VEYFI_ABI, + functionName: 'withdraw' + }); +} diff --git a/apps/veyfi/utils/actions/votingEscrow.ts b/apps/veyfi/utils/actions/votingEscrow.ts deleted file mode 100644 index a0e4eb7f1..000000000 --- a/apps/veyfi/utils/actions/votingEscrow.ts +++ /dev/null @@ -1,79 +0,0 @@ -import {ethers} from 'ethers'; -import {handleTx} from '@yearn-finance/web-lib/utils/web3/transaction'; - -import VEYFI_ABI from '../abi/veYFI.abi'; - -import type {BigNumber} from 'ethers'; -import type {TAddress} from '@yearn-finance/web-lib/types'; -import type {TSeconds} from '@yearn-finance/web-lib/utils/time'; -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; - -export async function approveLock( - provider: ethers.providers.JsonRpcProvider, - _accountAddress: TAddress, - tokenAddress: TAddress, - votingEscrowAddress: TAddress, - amount = ethers.constants.MaxUint256 -): Promise { - const signer = provider.getSigner(); - const contract = new ethers.Contract(tokenAddress, ['function approve(address _spender, uint256 _value) external'], signer); - return await handleTx(contract.approve(votingEscrowAddress, amount)); -} - -export async function lock( - provider: ethers.providers.JsonRpcProvider, - accountAddress: TAddress, - votingEscrowAddress: TAddress, - amount: BigNumber, - time: TSeconds -): Promise { - const signer = provider.getSigner(accountAddress); - const votingEscrowContract = new ethers.Contract(votingEscrowAddress, VEYFI_ABI, signer); - return await handleTx(votingEscrowContract.modify_lock(amount, time, accountAddress)); -} - -export async function increaseLockAmount( - provider: ethers.providers.JsonRpcProvider, - accountAddress: TAddress, - votingEscrowAddress: TAddress, - amount: BigNumber -): Promise { - const signer = provider.getSigner(accountAddress); - const votingEscrowContract = new ethers.Contract(votingEscrowAddress, VEYFI_ABI, signer); - return await handleTx(votingEscrowContract.modify_lock(amount, '0', accountAddress)); -} - -export async function extendLockTime( - provider: ethers.providers.JsonRpcProvider, - accountAddress: TAddress, - votingEscrowAddress: TAddress, - time: TSeconds -): Promise { - const signer = provider.getSigner(accountAddress); - const votingEscrowContract = new ethers.Contract(votingEscrowAddress, VEYFI_ABI, signer); - return await handleTx(votingEscrowContract.modify_lock('0', time, accountAddress)); -} - -export async function withdrawUnlocked( - provider: ethers.providers.JsonRpcProvider, - accountAddress: TAddress, - votingEscrowAddress: TAddress -): Promise { - const signer = provider.getSigner(accountAddress); - const votingEscrowContract = new ethers.Contract(votingEscrowAddress, VEYFI_ABI, signer); - const {penalty} = await votingEscrowContract.callStatic.withdraw(); - if ((penalty as BigNumber).gt(0)) { - throw new Error('Tokens are not yet unlocked'); - } - return await handleTx(votingEscrowContract.withdraw()); -} - -export async function withdrawLocked( - provider: ethers.providers.JsonRpcProvider, - accountAddress: TAddress, - votingEscrowAddress: TAddress -): Promise { - const signer = provider.getSigner(accountAddress); - const votingEscrowContract = new ethers.Contract(votingEscrowAddress, VEYFI_ABI, signer); - return await handleTx(votingEscrowContract.withdraw()); -} diff --git a/apps/veyfi/utils/index.ts b/apps/veyfi/utils/index.ts index b731e4b4c..e77832445 100644 --- a/apps/veyfi/utils/index.ts +++ b/apps/veyfi/utils/index.ts @@ -1,18 +1,17 @@ -import {formatBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {roundToWeek, toSeconds, YEAR} from '@yearn-finance/web-lib/utils/time'; -import type {BigNumber} from 'ethers'; import type {TMilliseconds, TSeconds} from '@yearn-finance/web-lib/utils/time'; const MAX_LOCK: TSeconds = toSeconds(roundToWeek(YEAR * 4)); -export function getVotingPower(lockAmount: BigNumber, unlockTime: TMilliseconds): BigNumber { +export function getVotingPower(lockAmount: bigint, unlockTime: TMilliseconds): bigint { const duration = toSeconds(roundToWeek(unlockTime)) - toSeconds(Date.now()); if (duration <= 0) { - return formatBN(0); + return 0n; } if (duration >= MAX_LOCK) { return lockAmount; } - return lockAmount.div(MAX_LOCK).mul(duration); + return lockAmount / toBigInt(MAX_LOCK) * toBigInt(duration); } diff --git a/apps/veyfi/utils/validations.ts b/apps/veyfi/utils/validations.ts index 1105d859e..e2a20df18 100644 --- a/apps/veyfi/utils/validations.ts +++ b/apps/veyfi/utils/validations.ts @@ -1,6 +1,5 @@ import {allowanceKey} from '@yearn-finance/web-lib/utils/address'; -import type {BigNumber} from 'ethers'; import type {TAddress, TDict} from '@yearn-finance/web-lib/types'; export type TValidationResponse = { @@ -13,8 +12,8 @@ export type TValidateAllowanceProps = { tokenAddress: TAddress; spenderAddress: TAddress; chainID: number; - allowances: TDict; - amount: BigNumber; + allowances: TDict; + amount: bigint; } export function validateAllowance(props: TValidateAllowanceProps): TValidationResponse { @@ -27,7 +26,7 @@ export function validateAllowance(props: TValidateAllowanceProps): TValidationRe // TODO: return valid when is native token const allowance = allowances[allowanceKey(chainID, tokenAddress, spenderAddress, ownerAddress)]; - const isApproved = allowance?.gte(amount); + const isApproved = allowance >= amount; return {isValid: isApproved}; } diff --git a/apps/ybal/Wrapper.tsx b/apps/ybal/Wrapper.tsx new file mode 100755 index 000000000..c57b1ed3b --- /dev/null +++ b/apps/ybal/Wrapper.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import {AnimatePresence, motion} from 'framer-motion'; +import Meta from '@common/components/Meta'; +import {useCurrentApp} from '@common/hooks/useCurrentApp'; +import {variants} from '@common/utils/animations'; +import {YBalContextApp} from '@yBal/contexts/useYBal'; + +import type {NextRouter} from 'next/router'; +import type {ReactElement} from 'react'; + +export default function Wrapper({children, router}: {children: ReactElement, router: NextRouter}): ReactElement { + const {manifest} = useCurrentApp(router); + + return ( + <> + + + + + {children} + + + + + ); +} diff --git a/apps/ybal/components/CardTransactorWrapper.tsx b/apps/ybal/components/CardTransactorWrapper.tsx new file mode 100755 index 000000000..60fc0226f --- /dev/null +++ b/apps/ybal/components/CardTransactorWrapper.tsx @@ -0,0 +1,253 @@ +import React, {createContext, useCallback, useContext, useEffect, useMemo, useState} from 'react'; +import {useAsync, useUpdateEffect} from '@react-hookz/web'; +import {yToast} from '@yearn-finance/web-lib/components/yToast'; +import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; +import {useAddToken} from '@yearn-finance/web-lib/hooks/useAddToken'; +import {useDismissToasts} from '@yearn-finance/web-lib/hooks/useDismissToasts'; +import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; +import {LPYBAL_TOKEN_ADDRESS, MAX_UINT_256, STYBAL_TOKEN_ADDRESS, ZAP_YEARN_YBAL_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {formatToNormalizedValue, toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatPercent} from '@yearn-finance/web-lib/utils/format.number'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {useWallet} from '@common/contexts/useWallet'; +import {useYearn} from '@common/contexts/useYearn'; +import {getVaultAPY} from '@common/utils'; +import {approveERC20, deposit} from '@common/utils/actions'; +import {ZAP_OPTIONS_FROM, ZAP_OPTIONS_TO} from '@yBal/constants/tokens'; +import {useYBal} from '@yBal/contexts/useYBal'; +import {simulateZapForMinOut, zapBal} from '@yBal/utils/actions'; + +import type {ReactElement} from 'react'; +import type {Connector} from 'wagmi'; +import type {TAddress, VoidPromiseFunction} from '@yearn-finance/web-lib/types'; +import type {TDropdownOption, TNormalizedBN} from '@common/types/types'; + +type TCardTransactor = { + selectedOptionFrom: TDropdownOption, + selectedOptionTo: TDropdownOption, + amount: TNormalizedBN, + txStatusApprove: typeof defaultTxStatus, + txStatusZap: typeof defaultTxStatus, + allowanceFrom: bigint, + fromVaultAPY: string, + toVaultAPY: string, + expectedOutWithSlippage: number, + set_selectedOptionFrom: (option: TDropdownOption) => void, + set_selectedOptionTo: (option: TDropdownOption) => void, + set_amount: (amount: TNormalizedBN) => void, + set_hasTypedSomething: (hasTypedSomething: boolean) => void, + onApproveFrom: VoidPromiseFunction, + onZap: VoidPromiseFunction +} + +const CardTransactorContext = createContext({ + selectedOptionFrom: ZAP_OPTIONS_FROM[0], + selectedOptionTo: ZAP_OPTIONS_TO[0], + amount: toNormalizedBN(0), + txStatusApprove: defaultTxStatus, + txStatusZap: defaultTxStatus, + allowanceFrom: 0n, + fromVaultAPY: '', + toVaultAPY: '', + expectedOutWithSlippage: 0, + set_selectedOptionFrom: (): void => undefined, + set_selectedOptionTo: (): void => undefined, + set_amount: (): void => undefined, + set_hasTypedSomething: (): void => undefined, + onApproveFrom: async (): Promise => undefined, + onZap: async (): Promise => undefined +}); + +function CardTransactorContextApp({ + defaultOptionFrom = ZAP_OPTIONS_FROM[0], + defaultOptionTo = ZAP_OPTIONS_TO[0], + children =
+}): ReactElement { + const {provider, isActive, address} = useWeb3(); + const {styBalAPY, allowances, slippage} = useYBal(); + const {balancesNonce, balances, refresh} = useWallet(); + const {vaults} = useYearn(); + const [txStatusApprove, set_txStatusApprove] = useState(defaultTxStatus); + const [txStatusZap, set_txStatusZap] = useState(defaultTxStatus); + const [selectedOptionFrom, set_selectedOptionFrom] = useState(defaultOptionFrom); + const [selectedOptionTo, set_selectedOptionTo] = useState(defaultOptionTo); + const [amount, set_amount] = useState(toNormalizedBN(0)); + const [hasTypedSomething, set_hasTypedSomething] = useState(false); + const addToken = useAddToken(); + const {dismissAllToasts} = useDismissToasts(); + const {toast} = yToast(); + + /* 🔵 - Yearn Finance ****************************************************** + ** useEffect to set the amount to the max amount of the selected token once + ** the wallet is connected, or to 0 if the wallet is disconnected. + **************************************************************************/ + useEffect((): void => { + balancesNonce; // remove warning, force deep refresh + set_amount((prevAmount): TNormalizedBN => { + if (isActive && prevAmount.raw === 0n && !hasTypedSomething) { + return toNormalizedBN(balances[toAddress(selectedOptionFrom.value)]?.raw); + } if (!isActive && prevAmount.raw > 0n) { + return toNormalizedBN(0); + } + return prevAmount; + }); + }, [isActive, selectedOptionFrom.value, balances, hasTypedSomething, balancesNonce]); + + useUpdateEffect((): void => { + if (!isActive) { + set_hasTypedSomething(false); + } + }, [isActive]); + + /* 🔵 - Yearn Finance ****************************************************** + ** Perform a smartContract call to the ZAP contract to get the expected + ** out for a given in/out pair with a specific amount. This callback is + ** called every 10s or when amount/in or out changes. + **************************************************************************/ + const [{result: expectedOut}, actions] = useAsync(async ( + _provider: Connector | undefined, + _inputToken: TAddress, + _outputToken: TAddress, + _amountIn: bigint + ): Promise<{shouldMint: boolean; minOut: bigint;}> => { + return await simulateZapForMinOut({ + connector: provider, + contractAddress: ZAP_YEARN_YBAL_ADDRESS, + inputToken: _inputToken, + outputToken: _outputToken, + amountIn: _amountIn + }); + }, ({shouldMint: false, minOut: 0n})); + + useUpdateEffect((): void => { + actions.execute( + provider, + selectedOptionFrom.value, + selectedOptionTo.value, + amount.raw + ); + }, [actions, provider, amount, selectedOptionFrom.value, selectedOptionTo.value]); + + /* 🔵 - Yearn Finance ****************************************************** + ** Approve the spending of token A by the corresponding ZAP contract to + ** perform the swap. + **************************************************************************/ + const onApprove = useCallback(async (): Promise => { + const result = await approveERC20({ + connector: provider, + contractAddress: selectedOptionFrom.value, + spenderAddress: selectedOptionFrom.zapVia, + amount: MAX_UINT_256, + statusHandler: set_txStatusApprove + }); + if (result.isSuccessful) { + await refresh(); + } + }, [provider, refresh, selectedOptionFrom.value, selectedOptionFrom.zapVia]); + + /* 🔵 - Yearn Finance ****************************************************** + ** Execute a zap using the ZAP contract to migrate from a token A to a + ** supported token B. + **************************************************************************/ + const onZap = useCallback(async (): Promise => { + dismissAllToasts(); + const addToMetamaskToast = { + type: 'info' as const, + content: `Add ${selectedOptionTo.symbol} to Metamask?`, + duration: Infinity, + cta: { + label: 'Add +', + onClick: (): void => addToken({ + address: selectedOptionTo.value, + symbol: selectedOptionTo.symbol, + decimals: selectedOptionTo.decimals, + image: selectedOptionTo.icon?.props.src + }) + } + }; + + if (selectedOptionFrom.zapVia === LPYBAL_TOKEN_ADDRESS) { + // Direct deposit to vault from Bal/yBal balancer LP Token to lp-yBal Vault + const result = await deposit({ + connector: provider, + contractAddress: selectedOptionTo.value, + amount: amount.raw, //amount_in + statusHandler: set_txStatusZap + }); + if (result.isSuccessful) { + set_amount(toNormalizedBN(0)); + await refresh(); + toast(addToMetamaskToast); + } + } else { + // Zap in + const result = await zapBal({ + connector: provider, + contractAddress: ZAP_YEARN_YBAL_ADDRESS, + inputToken: selectedOptionFrom.value, //_input_token + outputToken: selectedOptionTo.value, //_output_token + amount: amount.raw, //amount_in + minAmount: expectedOut.minOut, //_min_out + slippage: toBigInt(slippage), + shouldMint: expectedOut.shouldMint, + statusHandler: set_txStatusZap + }); + if (result.isSuccessful) { + set_amount(toNormalizedBN(0)); + await refresh(); + toast(addToMetamaskToast); + } + } + }, [addToken, amount.raw, dismissAllToasts, expectedOut, provider, refresh, selectedOptionFrom.value, selectedOptionFrom.zapVia, selectedOptionTo.decimals, selectedOptionTo.icon?.props.src, selectedOptionTo.symbol, selectedOptionTo.value, slippage, toast]); + + /* 🔵 - Yearn Finance ****************************************************** + ** Set of memorized values to limit the number of re-rendering of the + ** component. + **************************************************************************/ + const fromVaultAPY = useMemo((): string => { + if (toAddress(selectedOptionFrom.value) === STYBAL_TOKEN_ADDRESS) { + return `APY ${formatPercent(styBalAPY)}`; + } + return getVaultAPY(vaults, selectedOptionFrom.value); + }, [vaults, selectedOptionFrom, styBalAPY]); + + const toVaultAPY = useMemo((): string => { + if (toAddress(selectedOptionTo.value) === STYBAL_TOKEN_ADDRESS) { + return `APY ${formatPercent(styBalAPY)}`; + } + return getVaultAPY(vaults, selectedOptionTo.value); + }, [vaults, selectedOptionTo, styBalAPY]); + + const allowanceFrom = useMemo((): bigint => { + balancesNonce; // remove warning, force deep refresh + return toBigInt(allowances?.[allowanceKey(1, toAddress(selectedOptionFrom.value), toAddress(selectedOptionFrom.zapVia), toAddress(address))]); + }, [balancesNonce, allowances, selectedOptionFrom.value, selectedOptionFrom.zapVia, address]); + + return ( + + {children} + + ); +} + +export const useCardTransactor = (): TCardTransactor => useContext(CardTransactorContext); +export default CardTransactorContextApp; diff --git a/apps/ybal/components/CardZap.tsx b/apps/ybal/components/CardZap.tsx new file mode 100755 index 000000000..6f34f035d --- /dev/null +++ b/apps/ybal/components/CardZap.tsx @@ -0,0 +1,229 @@ +import React, {useMemo} from 'react'; +import {Button} from '@yearn-finance/web-lib/components/Button'; +import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {cl} from '@yearn-finance/web-lib/utils/cl'; +import {LPYBAL_TOKEN_ADDRESS, YBAL_BALANCER_POOL_ADDRESS, YBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {formatToNormalizedValue, toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatCounterValue} from '@yearn-finance/web-lib/utils/format.value'; +import {handleInputChangeEventValue} from '@yearn-finance/web-lib/utils/handlers/handleInputChangeEventValue'; +import performBatchedUpdates from '@yearn-finance/web-lib/utils/performBatchedUpdates'; +import {Dropdown} from '@common/components/TokenDropdown'; +import {useWallet} from '@common/contexts/useWallet'; +import {useYearn} from '@common/contexts/useYearn'; +import ArrowDown from '@common/icons/ArrowDown'; +import CardTransactorContextApp, {useCardTransactor} from '@yBal/components/CardTransactorWrapper'; +import {ZAP_OPTIONS_FROM, ZAP_OPTIONS_TO} from '@yBal/constants/tokens'; + +import type {ChangeEvent, ReactElement} from 'react'; +import type {TDropdownOption} from '@common/types/types'; + +function CardZap(): ReactElement { + const {isActive} = useWeb3(); + const {balances} = useWallet(); + const {vaults, prices} = useYearn(); + const { + txStatusApprove, txStatusZap, + selectedOptionFrom, set_selectedOptionFrom, + selectedOptionTo, set_selectedOptionTo, + amount, set_amount, + set_hasTypedSomething, + fromVaultAPY, toVaultAPY, expectedOutWithSlippage, + allowanceFrom, onApproveFrom, onZap + } = useCardTransactor(); + + const yBalPrice = useMemo((): number => ( + formatToNormalizedValue(toBigInt(prices?.[YBAL_TOKEN_ADDRESS] || 0), 6) + ), [prices]); + + const yBalCurvePoolPrice = useMemo((): number => ( + formatToNormalizedValue(toBigInt(prices?.[YBAL_BALANCER_POOL_ADDRESS] || 0), 6) + ), [prices]); + + /* 🔵 - Yearn Finance ****************************************************** + ** useMemo to get the current possible TO vaults path for the current FROM + **************************************************************************/ + const possibleTo = useMemo((): TDropdownOption[] => { + if (selectedOptionFrom.value === YBAL_BALANCER_POOL_ADDRESS) { + const possibleOptions = ZAP_OPTIONS_TO.filter((option): boolean => option.value === LPYBAL_TOKEN_ADDRESS); + if (selectedOptionTo.value !== LPYBAL_TOKEN_ADDRESS) { + set_selectedOptionTo(possibleOptions[0]); + } + return possibleOptions; + } + return ZAP_OPTIONS_TO.filter((option): boolean => option.value !== selectedOptionFrom.value); + }, [selectedOptionFrom.value, selectedOptionTo.value, set_selectedOptionTo]); + + function renderButton(): ReactElement { + const balanceForInputToken = toBigInt(balances?.[toAddress(selectedOptionFrom.value)]?.raw); + const isAboveBalance = amount.raw > balanceForInputToken || balanceForInputToken === 0n; + const isAboveAllowance = amount.raw > allowanceFrom; + + if (txStatusApprove.pending || isAboveAllowance) { + return ( + + ); + } + + return ( + + ); + } + + return ( + <> +
+ +
+ +
+
+ ): void => { + performBatchedUpdates((): void => { + set_amount(handleInputChangeEventValue(e.target.value, balances[toAddress(selectedOptionFrom.value)]?.decimals || 18)); + set_hasTypedSomething(true); + }); + }} /> + +
+
+

+ {formatCounterValue( + amount?.normalized || 0, + toAddress(selectedOptionFrom.value) === YBAL_TOKEN_ADDRESS + ? yBalPrice || 0 + : toAddress(selectedOptionFrom.value) === YBAL_BALANCER_POOL_ADDRESS + ? yBalCurvePoolPrice || 0 + : balances?.[toAddress(selectedOptionFrom.value)]?.normalizedPrice + || vaults?.[toAddress(selectedOptionFrom.value)]?.tvl?.price + || 0 + )} +

+
+
+ + + +
+ +
+
+ +

{'You will receive min'}

+
+
+ + {expectedOutWithSlippage} + +
+

+ {formatCounterValue( + expectedOutWithSlippage, + toAddress(selectedOptionTo.value) === YBAL_TOKEN_ADDRESS + ? yBalPrice || 0 + : toAddress(selectedOptionFrom.value) === YBAL_BALANCER_POOL_ADDRESS + ? yBalCurvePoolPrice || 0 + : balances?.[toAddress(selectedOptionTo.value)]?.normalizedPrice + || vaults?.[toAddress(selectedOptionTo.value)]?.tvl?.price + || 0 + )} +

+
+
+ +
+ {renderButton()} +
+ + ); +} + +function WithCardTransactor({className}: {className: string}): ReactElement { + return ( + +
+
+

{'Supercharge your yield with yBal'}

+
+
+

+ {'Swap any token within the yBal ecosystem for any other. Maybe you want to swap for a higher yield, or maybe you just like swapping. It’s ok, we don’t judge.'} +

+
+ +
+
+ ); +} +export default WithCardTransactor; diff --git a/apps/ybal/components/Harvests.tsx b/apps/ybal/components/Harvests.tsx new file mode 100644 index 000000000..165b5bb44 --- /dev/null +++ b/apps/ybal/components/Harvests.tsx @@ -0,0 +1,75 @@ +import React, {useMemo, useState} from 'react'; +import {Button} from '@yearn-finance/web-lib/components/Button'; +import {isZeroAddress, toAddress} from '@yearn-finance/web-lib/utils/address'; +import {LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {HarvestListHead} from '@yBal/components/HarvestsListHead'; +import {HarvestListRow} from '@yBal/components/HarvestsListRow'; +import {useYBal} from '@yBal/contexts/useYBal'; + +import type {ReactElement} from 'react'; +import type {TYDaemonHarvests} from '@common/types/yearn'; + +function Harvests(): ReactElement { + const {harvests} = useYBal(); + const [category, set_category] = useState('all'); + + const filteredHarvests = useMemo((): TYDaemonHarvests[] => { + const _harvests = [...(harvests || [])]; + if (category === 'st-yBal') { + return _harvests.filter((harvest): boolean => toAddress(harvest.vaultAddress) === STYBAL_TOKEN_ADDRESS); + } + if (category === 'lp-yBal') { + return _harvests.filter((harvest): boolean => toAddress(harvest.vaultAddress) === LPYBAL_TOKEN_ADDRESS); + } + return _harvests; + }, [category, harvests]); + + return ( +
+
+
+

{'Harvests'}

+
+
+ + + +
+
+
+ + { + (filteredHarvests || []) + .filter((harvest: TYDaemonHarvests): boolean => { + return ( + !isZeroAddress(toAddress(harvest.vaultAddress)) && + [STYBAL_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS].includes(toAddress(harvest.vaultAddress)) + ); + }).map((harvest: TYDaemonHarvests, index: number): ReactElement => { + return ( + + ); + })} +
+
+ ); +} + +export {Harvests}; diff --git a/apps/ybal/components/HarvestsListHead.tsx b/apps/ybal/components/HarvestsListHead.tsx new file mode 100644 index 000000000..73384aaba --- /dev/null +++ b/apps/ybal/components/HarvestsListHead.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import {cl} from '@yearn-finance/web-lib/utils/cl'; + +import type {ReactElement} from 'react'; + +type THeadLabelProps = { + label: string; + className?: string; + datatype?: 'text' | 'number'; +} +function HeadLabel({label, className, datatype = 'text'}: THeadLabelProps): ReactElement { + return ( +
+

+ {label} +

+
+ ); +} + +function HarvestListHead(): ReactElement { + return ( +
+
+ +
+
+ + + + +
+
+ ); +} + +export {HarvestListHead}; diff --git a/apps/ybal/components/HarvestsListRow.tsx b/apps/ybal/components/HarvestsListRow.tsx new file mode 100755 index 000000000..1b2346ebd --- /dev/null +++ b/apps/ybal/components/HarvestsListRow.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import IconLinkOut from '@yearn-finance/web-lib/icons/IconLinkOut'; +import {toAddress, truncateHex} from '@yearn-finance/web-lib/utils/address'; +import {cl} from '@yearn-finance/web-lib/utils/cl'; +import {STYBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {formatToNormalizedAmount, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatUSD} from '@yearn-finance/web-lib/utils/format.number'; +import {formatDate} from '@yearn-finance/web-lib/utils/format.time'; +import {ImageWithFallback} from '@common/components/ImageWithFallback'; + +import type {ReactElement} from 'react'; +import type {TYDaemonHarvests} from '@common/types/yearn'; + +type TRowProps = { + label: string; + value: string; + className?: string; + valueClassName?: string; +} +function Row({label, value, className, valueClassName}: TRowProps): ReactElement { + return ( +
+

{label}

+

+ {value} +

+
+ ); +} + +function HarvestListRow({harvest}: {harvest: TYDaemonHarvests}): ReactElement { + const vaultName = toAddress(harvest.vaultAddress) === STYBAL_TOKEN_ADDRESS ? 'st-yBal' : 'lp-yBal'; + const gain = formatToNormalizedAmount(toBigInt(harvest.profit) - toBigInt(harvest.loss)); + const value = formatUSD(Number(harvest.profitValue) - Number(harvest.lossValue)); + const date = formatDate(Number(harvest.timestamp) * 1000); + + return ( +
+
+
+
+ +
+

+ {vaultName} +

+
+
+ + +
+ ); +} + +export {HarvestListRow}; diff --git a/apps/ybal/components/header/YBalHeader.tsx b/apps/ybal/components/header/YBalHeader.tsx new file mode 100644 index 000000000..24e963a9e --- /dev/null +++ b/apps/ybal/components/header/YBalHeader.tsx @@ -0,0 +1,21 @@ +import {AppName, APPS} from '@common/components/Apps'; +import {MotionDiv} from '@common/components/MotionDiv'; + +import type {NextRouter} from 'next/router'; +import type {ReactElement} from 'react'; + +type TProps = { + pathname: NextRouter['pathname']; +} + +export function YBalHeader({pathname}: TProps): ReactElement { + const {name, icon} = APPS[AppName.YBAL]; + + return ( + + {icon} + + ); +} diff --git a/apps/ybal/constants/menu.ts b/apps/ybal/constants/menu.ts new file mode 100644 index 000000000..c2738a735 --- /dev/null +++ b/apps/ybal/constants/menu.ts @@ -0,0 +1,4 @@ +export const YBAL_MENU = [ + {path: '/ybal', label: 'yBal'}, + {path: '/ybal/about', label: 'About'} +]; diff --git a/apps/ybal/constants/tokens.tsx b/apps/ybal/constants/tokens.tsx new file mode 100755 index 000000000..a31776207 --- /dev/null +++ b/apps/ybal/constants/tokens.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {BAL_TOKEN_ADDRESS, BALWETH_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, WETH_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {ImageWithFallback} from '@common/components/ImageWithFallback'; + +import type {TDropdownOption} from '@common/types/types'; + +const LOCAL_ZAP_YEARN_YBAL_ADDRESS = toAddress('0x43cA9bAe8dF108684E5EAaA720C25e1b32B0A075'); +export const BAL = { + label: 'Bal', + symbol: 'Bal', + decimals: 18, + value: BAL_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; +export const YBAL = { + label: 'yBal', + symbol: 'yBal', + decimals: 18, + value: YBAL_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; +export const BALWETH = { + label: 'BAL/wETH', + symbol: 'BAL/wETH', + decimals: 18, + value: BALWETH_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; +export const STYBAL = { + label: 'st-yBal', + symbol: 'st-yBal', + decimals: 18, + value: STYBAL_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; +export const LPYBAL = { + label: 'lp-yBal', + symbol: 'lp-yBal', + decimals: 18, + value: LPYBAL_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; +export const WETH = { + label: 'wETH', + symbol: 'wETH', + decimals: 18, + value: WETH_TOKEN_ADDRESS, + zapVia: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + icon: ( + + ) +}; + +export const ZAP_OPTIONS_FROM: TDropdownOption[] = [BAL, WETH, BALWETH, YBAL, STYBAL, LPYBAL]; + +export const ZAP_OPTIONS_TO: TDropdownOption[] = [YBAL, STYBAL, LPYBAL]; diff --git a/apps/ybal/contexts/useAllowanceHook.tsx b/apps/ybal/contexts/useAllowanceHook.tsx new file mode 100644 index 000000000..f4a5ff057 --- /dev/null +++ b/apps/ybal/contexts/useAllowanceHook.tsx @@ -0,0 +1,48 @@ +// We need the following line so that Next.js actually refetch the data a fast +// refresh is done. Cf https://nextjs.org/docs/architecture/fast-refresh#tips +// @refresh reset + +import {useMemo} from 'react'; +import {erc20ABI, useContractReads} from 'wagmi'; +import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; +import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; +import {BAL_TOKEN_ADDRESS, BALWETH_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, WETH_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt} from '@yearn-finance/web-lib/utils/decoder'; + +import type {TAddress, TDict} from '@yearn-finance/web-lib/types'; + +const LOCAL_ZAP_YEARN_YBAL_ADDRESS = toAddress('0x43cA9bAe8dF108684E5EAaA720C25e1b32B0A075'); + +/* 🔵 - Yearn Finance ********************************************************** +** This context controls the allowances computation for the yBal app +******************************************************************************/ +export function useAllowances(): TDict { + const {address} = useWeb3(); + const wagmiAddress = useMemo((): TAddress => toAddress(address), [address]); + const zapAddress = useMemo((): TAddress => LOCAL_ZAP_YEARN_YBAL_ADDRESS, []); + const {data, status} = useContractReads({ + contracts: [ + {address: BAL_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: WETH_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: BALWETH_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: YBAL_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: STYBAL_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: LPYBAL_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]} + ] + }); + + return useMemo((): TDict => { + if (!data || status !== 'success') { + return {}; + } + return { + [allowanceKey(1, BAL_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[0]), + [allowanceKey(1, WETH_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[1]), + [allowanceKey(1, BALWETH_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[2]), + [allowanceKey(1, YBAL_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[3]), + [allowanceKey(1, STYBAL_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[4]), + [allowanceKey(1, LPYBAL_TOKEN_ADDRESS, LOCAL_ZAP_YEARN_YBAL_ADDRESS, toAddress(address))]: decodeAsBigInt(data[5]) + }; + }, [data, status, address]); +} + diff --git a/apps/ybal/contexts/useHoldingsHook.tsx b/apps/ybal/contexts/useHoldingsHook.tsx new file mode 100644 index 000000000..1ea211352 --- /dev/null +++ b/apps/ybal/contexts/useHoldingsHook.tsx @@ -0,0 +1,109 @@ +// We need the following line so that Next.js actually refetch the data when a +// fast refresh is done. Cf https://nextjs.org/docs/architecture/fast-refresh#tips +// @refresh reset + +import {useMemo} from 'react'; +import {parseEther} from 'viem'; +import {useContractReads, usePrepareContractWrite} from 'wagmi'; +import ERC20_ABI from '@yearn-finance/web-lib/utils/abi/erc20.abi'; +import {BALWETH_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, VEBAL_TOKEN_ADDRESS, VEBALPEG_QUERY_HELP_CONTRACT, YBAL_TOKEN_ADDRESS, YBAL_VOTER_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt} from '@yearn-finance/web-lib/utils/decoder'; +import STYBAL_ABI from '@yBal/utils/abi/styBal.abi'; +import VE_BAL_ABI from '@yBal/utils/abi/veBAL.abi'; +import VEBALPEG_HELPER_ABI from '@yBal/utils/abi/veBalPegHelper.abi'; + +import type {Hex} from 'viem'; + +export type TBalHoldings = { + yBalSupply: bigint; + styBalSupply: bigint; + lpyBalSupply: bigint; + balYBalPeg: bigint; + treasury: bigint; + veBalTotalSupply: bigint; + veBalBalance: bigint; +} + +export const defaultBalHoldings = { + yBalSupply: 0n, + styBalSupply: 0n, + lpyBalSupply: 0n, + balYBalPeg: 0n, + treasury: 0n, + veBalTotalSupply: 0n, + veBalBalance: 0n +}; + +/* 🔵 - Yearn Finance ********************************************************** +** This context controls the Holdings computation. +******************************************************************************/ +export function useHoldings(): TBalHoldings { + const yBalContract = {address: YBAL_TOKEN_ADDRESS, abi: ERC20_ABI}; + const lpyBalContract = {address: LPYBAL_TOKEN_ADDRESS, abi: ERC20_ABI}; + const styBalContract = {address: STYBAL_TOKEN_ADDRESS, abi: STYBAL_ABI}; + const veBalContract = {address: VEBAL_TOKEN_ADDRESS, abi: VE_BAL_ABI}; + const veBalQueryPegHelpContract = {address: VEBALPEG_QUERY_HELP_CONTRACT, abi: VEBALPEG_HELPER_ABI}; + + const pegSwapArguments = { + poolId: '0xd61e198e139369a40818fe05f5d5e6e045cd6eaf000000000000000000000540' as Hex, + kind: 0, + assetIn: BALWETH_TOKEN_ADDRESS, //BALWETH + assetOut: YBAL_TOKEN_ADDRESS, //YBAL + amount: parseEther('1'), + userData: '0x' as Hex + }; + const pegFundArguments = { + sender: ZERO_ADDRESS, + fromInternalBalance: false, + recipient: ZERO_ADDRESS, + toInternalBalance: false + }; + + const {data, status} = useContractReads({ + contracts: [ + {...yBalContract, functionName: 'totalSupply'}, + {...styBalContract, functionName: 'totalAssets'}, + {...lpyBalContract, functionName: 'totalSupply'}, + {...veBalContract, functionName: 'totalSupply'}, + {...veBalContract, functionName: 'balanceOf', args: [YBAL_VOTER_ADDRESS]} + ] + }); + const {data: peg, status: pegStatus} = usePrepareContractWrite({ + ...veBalQueryPegHelpContract, + functionName: 'querySwap', + args: [pegSwapArguments, pegFundArguments] + }); + + const baseHolding = useMemo((): TBalHoldings => { + if (!data || status !== 'success') { + return defaultBalHoldings; + } + const yBalTotalSupply = decodeAsBigInt(data[0]); + const styBalTotalSupply = decodeAsBigInt(data[1]); + const lpyBalTotalSupply = decodeAsBigInt(data[2]); + const veBalTotalSupply = decodeAsBigInt(data[3]); + const veBalBalance = decodeAsBigInt(data[4]); + return ({ + yBalSupply: yBalTotalSupply, + styBalSupply: styBalTotalSupply, + lpyBalSupply: lpyBalTotalSupply, + treasury: veBalBalance - yBalTotalSupply, + veBalTotalSupply: veBalTotalSupply, + veBalBalance: veBalBalance, + balYBalPeg: 0n + }); + }, [data, status]); + + const basePeg = useMemo((): bigint => { + if (!peg || pegStatus !== 'success') { + return 0n; + } + return peg.result; + }, [peg, pegStatus]); + + return ({ + ...baseHolding as TBalHoldings, + balYBalPeg: basePeg + }); +} + diff --git a/apps/ybal/contexts/useYBal.tsx b/apps/ybal/contexts/useYBal.tsx new file mode 100755 index 000000000..a99c5aefe --- /dev/null +++ b/apps/ybal/contexts/useYBal.tsx @@ -0,0 +1,85 @@ +import React, {createContext, useContext, useMemo, useState} from 'react'; +import useSWR from 'swr'; +import {useSettings} from '@yearn-finance/web-lib/contexts/useSettings'; +import {LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {baseFetcher} from '@yearn-finance/web-lib/utils/fetchers'; +import {useFetch} from '@common/hooks/useFetch'; +import {yDaemonVaultSchema} from '@common/schemas/yDaemonVaultsSchemas'; +import {useAllowances} from '@yBal/contexts/useAllowanceHook'; +import {defaultBalHoldings, useHoldings} from '@yBal/contexts/useHoldingsHook'; + +import type {ReactElement} from 'react'; +import type {SWRResponse} from 'swr'; +import type {TBalHoldings} from '@yBal/contexts/useHoldingsHook'; +import type {TDict} from '@yearn-finance/web-lib/types'; +import type {TYDaemonVault} from '@common/schemas/yDaemonVaultsSchemas'; +import type {TYDaemonHarvests} from '@common/types/yearn'; + +type TYBalContext = { + styBalAPY: number, + slippage: number, + allowances: TDict, + holdings: TBalHoldings, + harvests: TYDaemonHarvests[], + set_slippage: (slippage: number) => void, +} + +const defaultProps = { + styBalAPY: 0, + harvests: [], + allowances: {}, + slippage: 0.6, + set_slippage: (): void => undefined, + holdings: defaultBalHoldings +}; + +/* 🔵 - Yearn Finance ********************************************************** +** This context controls the Holdings computation. +******************************************************************************/ +const YBalContext = createContext(defaultProps); + +export const YBalContextApp = ({children}: {children: ReactElement}): ReactElement => { + const {settings: baseAPISettings} = useSettings(); + const [slippage, set_slippage] = useState(0.6); + const holdings = useHoldings(); + const allowances = useAllowances(); + + const YDAEMON_BASE_URI = `${baseAPISettings.yDaemonBaseURI || process.env.YDAEMON_BASE_URI}`; + + const {data: styBalVault} = useFetch({ + endpoint: `${YDAEMON_BASE_URI}/1/vaults/${STYBAL_TOKEN_ADDRESS}`, + schema: yDaemonVaultSchema + }); + + const {data: yBalHarvests} = useSWR( + `${YDAEMON_BASE_URI}/1/vaults/harvests/${STYBAL_TOKEN_ADDRESS},${LPYBAL_TOKEN_ADDRESS}`, + baseFetcher, + {revalidateOnFocus: false} + ) as SWRResponse; + + /* 🔵 - Yearn Finance ****************************************************** + ** Compute the styBal APY based on the experimental APY and the mega boost. + **************************************************************************/ + const styBalAPY = useMemo((): number => (styBalVault?.apy?.net_apy || 0) * 100, [styBalVault]); + + /* 🔵 - Yearn Finance ****************************************************** + ** Setup and render the Context provider to use in the app. + ***************************************************************************/ + const contextValue = useMemo((): TYBalContext => ({ + harvests: yBalHarvests, + holdings: holdings, + allowances: allowances, + styBalAPY, + slippage, + set_slippage + }), [yBalHarvests, holdings, allowances, styBalAPY, slippage, set_slippage]); + + return ( + + {children} + + ); +}; + +export const useYBal = (): TYBalContext => useContext(YBalContext); +export default useYBal; diff --git a/apps/ybal/utils/abi/styBal.abi.ts b/apps/ybal/utils/abi/styBal.abi.ts new file mode 100644 index 000000000..f14ae669a --- /dev/null +++ b/apps/ybal/utils/abi/styBal.abi.ts @@ -0,0 +1,3 @@ +const STYBAL_ABI = [{'name':'Transfer', 'inputs':[{'name':'sender', 'type':'address', 'indexed':true}, {'name':'receiver', 'type':'address', 'indexed':true}, {'name':'value', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Approval', 'inputs':[{'name':'owner', 'type':'address', 'indexed':true}, {'name':'spender', 'type':'address', 'indexed':true}, {'name':'value', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Deposit', 'inputs':[{'name':'recipient', 'type':'address', 'indexed':true}, {'name':'shares', 'type':'uint256', 'indexed':false}, {'name':'amount', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Withdraw', 'inputs':[{'name':'recipient', 'type':'address', 'indexed':true}, {'name':'shares', 'type':'uint256', 'indexed':false}, {'name':'amount', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Sweep', 'inputs':[{'name':'token', 'type':'address', 'indexed':true}, {'name':'amount', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'LockedProfitDegradationUpdated', 'inputs':[{'name':'value', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyAdded', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'debtRatio', 'type':'uint256', 'indexed':false}, {'name':'minDebtPerHarvest', 'type':'uint256', 'indexed':false}, {'name':'maxDebtPerHarvest', 'type':'uint256', 'indexed':false}, {'name':'performanceFee', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyReported', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'gain', 'type':'uint256', 'indexed':false}, {'name':'loss', 'type':'uint256', 'indexed':false}, {'name':'debtPaid', 'type':'uint256', 'indexed':false}, {'name':'totalGain', 'type':'uint256', 'indexed':false}, {'name':'totalLoss', 'type':'uint256', 'indexed':false}, {'name':'totalDebt', 'type':'uint256', 'indexed':false}, {'name':'debtAdded', 'type':'uint256', 'indexed':false}, {'name':'debtRatio', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'FeeReport', 'inputs':[{'name':'management_fee', 'type':'uint256', 'indexed':false}, {'name':'performance_fee', 'type':'uint256', 'indexed':false}, {'name':'strategist_fee', 'type':'uint256', 'indexed':false}, {'name':'duration', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'WithdrawFromStrategy', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'totalDebt', 'type':'uint256', 'indexed':false}, {'name':'loss', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateGovernance', 'inputs':[{'name':'governance', 'type':'address', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateManagement', 'inputs':[{'name':'management', 'type':'address', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateRewards', 'inputs':[{'name':'rewards', 'type':'address', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateDepositLimit', 'inputs':[{'name':'depositLimit', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdatePerformanceFee', 'inputs':[{'name':'performanceFee', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateManagementFee', 'inputs':[{'name':'managementFee', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateGuardian', 'inputs':[{'name':'guardian', 'type':'address', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'EmergencyShutdown', 'inputs':[{'name':'active', 'type':'bool', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'UpdateWithdrawalQueue', 'inputs':[{'name':'queue', 'type':'address[20]', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyUpdateDebtRatio', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'debtRatio', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyUpdateMinDebtPerHarvest', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'minDebtPerHarvest', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyUpdateMaxDebtPerHarvest', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'maxDebtPerHarvest', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyUpdatePerformanceFee', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}, {'name':'performanceFee', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'StrategyMigrated', 'inputs':[{'name':'oldVersion', 'type':'address', 'indexed':true}, {'name':'newVersion', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'name':'StrategyRevoked', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'name':'StrategyRemovedFromQueue', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'name':'StrategyAddedToQueue', 'inputs':[{'name':'strategy', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'name':'NewPendingGovernance', 'inputs':[{'name':'pendingGovernance', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'stateMutability':'nonpayable', 'type':'function', 'name':'initialize', 'inputs':[{'name':'token', 'type':'address'}, {'name':'governance', 'type':'address'}, {'name':'rewards', 'type':'address'}, {'name':'nameOverride', 'type':'string'}, {'name':'symbolOverride', 'type':'string'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'initialize', 'inputs':[{'name':'token', 'type':'address'}, {'name':'governance', 'type':'address'}, {'name':'rewards', 'type':'address'}, {'name':'nameOverride', 'type':'string'}, {'name':'symbolOverride', 'type':'string'}, {'name':'guardian', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'initialize', 'inputs':[{'name':'token', 'type':'address'}, {'name':'governance', 'type':'address'}, {'name':'rewards', 'type':'address'}, {'name':'nameOverride', 'type':'string'}, {'name':'symbolOverride', 'type':'string'}, {'name':'guardian', 'type':'address'}, {'name':'management', 'type':'address'}], 'outputs':[]}, {'stateMutability':'pure', 'type':'function', 'name':'apiVersion', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'DOMAIN_SEPARATOR', 'inputs':[], 'outputs':[{'name':'', 'type':'bytes32'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setName', 'inputs':[{'name':'name', 'type':'string'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setSymbol', 'inputs':[{'name':'symbol', 'type':'string'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setGovernance', 'inputs':[{'name':'governance', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'acceptGovernance', 'inputs':[], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setManagement', 'inputs':[{'name':'management', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setRewards', 'inputs':[{'name':'rewards', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setLockedProfitDegradation', 'inputs':[{'name':'degradation', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setDepositLimit', 'inputs':[{'name':'limit', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setPerformanceFee', 'inputs':[{'name':'fee', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setManagementFee', 'inputs':[{'name':'fee', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setGuardian', 'inputs':[{'name':'guardian', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setEmergencyShutdown', 'inputs':[{'name':'active', 'type':'bool'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'setWithdrawalQueue', 'inputs':[{'name':'queue', 'type':'address[20]'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'transfer', 'inputs':[{'name':'receiver', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'transferFrom', 'inputs':[{'name':'sender', 'type':'address'}, {'name':'receiver', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'approve', 'inputs':[{'name':'spender', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'increaseAllowance', 'inputs':[{'name':'spender', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'decreaseAllowance', 'inputs':[{'name':'spender', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'permit', 'inputs':[{'name':'owner', 'type':'address'}, {'name':'spender', 'type':'address'}, {'name':'amount', 'type':'uint256'}, {'name':'expiry', 'type':'uint256'}, {'name':'signature', 'type':'bytes'}], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalAssets', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'deposit', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'deposit', 'inputs':[{'name':'_amount', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'deposit', 'inputs':[{'name':'_amount', 'type':'uint256'}, {'name':'recipient', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'maxAvailableShares', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'withdraw', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'withdraw', 'inputs':[{'name':'maxShares', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'withdraw', 'inputs':[{'name':'maxShares', 'type':'uint256'}, {'name':'recipient', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'withdraw', 'inputs':[{'name':'maxShares', 'type':'uint256'}, {'name':'recipient', 'type':'address'}, {'name':'maxLoss', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'pricePerShare', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'addStrategy', 'inputs':[{'name':'strategy', 'type':'address'}, {'name':'debtRatio', 'type':'uint256'}, {'name':'minDebtPerHarvest', 'type':'uint256'}, {'name':'maxDebtPerHarvest', 'type':'uint256'}, {'name':'performanceFee', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'updateStrategyDebtRatio', 'inputs':[{'name':'strategy', 'type':'address'}, {'name':'debtRatio', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'updateStrategyMinDebtPerHarvest', 'inputs':[{'name':'strategy', 'type':'address'}, {'name':'minDebtPerHarvest', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'updateStrategyMaxDebtPerHarvest', 'inputs':[{'name':'strategy', 'type':'address'}, {'name':'maxDebtPerHarvest', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'updateStrategyPerformanceFee', 'inputs':[{'name':'strategy', 'type':'address'}, {'name':'performanceFee', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'migrateStrategy', 'inputs':[{'name':'oldVersion', 'type':'address'}, {'name':'newVersion', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'revokeStrategy', 'inputs':[], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'revokeStrategy', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'addStrategyToQueue', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'removeStrategyFromQueue', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'debtOutstanding', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'debtOutstanding', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'creditAvailable', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'creditAvailable', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'availableDepositLimit', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'expectedReturn', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'expectedReturn', 'inputs':[{'name':'strategy', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'report', 'inputs':[{'name':'gain', 'type':'uint256'}, {'name':'loss', 'type':'uint256'}, {'name':'_debtPayment', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'sweep', 'inputs':[{'name':'token', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'sweep', 'inputs':[{'name':'token', 'type':'address'}, {'name':'amount', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'name', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'symbol', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'decimals', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'balanceOf', 'inputs':[{'name':'arg0', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'allowance', 'inputs':[{'name':'arg0', 'type':'address'}, {'name':'arg1', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalSupply', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'token', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'governance', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'management', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'guardian', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'strategies', 'inputs':[{'name':'arg0', 'type':'address'}], 'outputs':[{'name':'', 'type':'tuple', 'components':[{'name':'performanceFee', 'type':'uint256'}, {'name':'activation', 'type':'uint256'}, {'name':'debtRatio', 'type':'uint256'}, {'name':'minDebtPerHarvest', 'type':'uint256'}, {'name':'maxDebtPerHarvest', 'type':'uint256'}, {'name':'lastReport', 'type':'uint256'}, {'name':'totalDebt', 'type':'uint256'}, {'name':'totalGain', 'type':'uint256'}, {'name':'totalLoss', 'type':'uint256'}]}]}, {'stateMutability':'view', 'type':'function', 'name':'withdrawalQueue', 'inputs':[{'name':'arg0', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'emergencyShutdown', 'inputs':[], 'outputs':[{'name':'', 'type':'bool'}]}, {'stateMutability':'view', 'type':'function', 'name':'depositLimit', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'debtRatio', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalIdle', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalDebt', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'lastReport', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'activation', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'lockedProfit', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'lockedProfitDegradation', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'rewards', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'managementFee', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'performanceFee', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'nonces', 'inputs':[{'name':'arg0', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}] as const; + +export default STYBAL_ABI; diff --git a/apps/ybal/utils/abi/veBAL.abi.ts b/apps/ybal/utils/abi/veBAL.abi.ts new file mode 100644 index 000000000..4ce9cefae --- /dev/null +++ b/apps/ybal/utils/abi/veBAL.abi.ts @@ -0,0 +1,3 @@ +const VE_BAL_ABI = [{'name':'Deposit', 'inputs':[{'name':'provider', 'type':'address', 'indexed':true}, {'name':'value', 'type':'uint256', 'indexed':false}, {'name':'locktime', 'type':'uint256', 'indexed':true}, {'name':'type', 'type':'int128', 'indexed':false}, {'name':'ts', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Withdraw', 'inputs':[{'name':'provider', 'type':'address', 'indexed':true}, {'name':'value', 'type':'uint256', 'indexed':false}, {'name':'ts', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'name':'Supply', 'inputs':[{'name':'prevSupply', 'type':'uint256', 'indexed':false}, {'name':'supply', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'stateMutability':'nonpayable', 'type':'constructor', 'inputs':[{'name':'token_addr', 'type':'address'}, {'name':'_name', 'type':'string'}, {'name':'_symbol', 'type':'string'}, {'name':'_authorizer_adaptor', 'type':'address'}], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'token', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'name', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'symbol', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'decimals', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'admin', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'commit_smart_wallet_checker', 'inputs':[{'name':'addr', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'apply_smart_wallet_checker', 'inputs':[], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'get_last_user_slope', 'inputs':[{'name':'addr', 'type':'address'}], 'outputs':[{'name':'', 'type':'int128'}]}, {'stateMutability':'view', 'type':'function', 'name':'user_point_history__ts', 'inputs':[{'name':'_addr', 'type':'address'}, {'name':'_idx', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'locked__end', 'inputs':[{'name':'_addr', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'checkpoint', 'inputs':[], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'deposit_for', 'inputs':[{'name':'_addr', 'type':'address'}, {'name':'_value', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'create_lock', 'inputs':[{'name':'_value', 'type':'uint256'}, {'name':'_unlock_time', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'increase_amount', 'inputs':[{'name':'_value', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'increase_unlock_time', 'inputs':[{'name':'_unlock_time', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'withdraw', 'inputs':[], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'balanceOf', 'inputs':[{'name':'addr', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'balanceOf', 'inputs':[{'name':'addr', 'type':'address'}, {'name':'_t', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'balanceOfAt', 'inputs':[{'name':'addr', 'type':'address'}, {'name':'_block', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalSupply', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalSupply', 'inputs':[{'name':'t', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'totalSupplyAt', 'inputs':[{'name':'_block', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'supply', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'locked', 'inputs':[{'name':'arg0', 'type':'address'}], 'outputs':[{'name':'', 'type':'tuple', 'components':[{'name':'amount', 'type':'int128'}, {'name':'end', 'type':'uint256'}]}]}, {'stateMutability':'view', 'type':'function', 'name':'epoch', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'point_history', 'inputs':[{'name':'arg0', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'tuple', 'components':[{'name':'bias', 'type':'int128'}, {'name':'slope', 'type':'int128'}, {'name':'ts', 'type':'uint256'}, {'name':'blk', 'type':'uint256'}]}]}, {'stateMutability':'view', 'type':'function', 'name':'user_point_history', 'inputs':[{'name':'arg0', 'type':'address'}, {'name':'arg1', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'tuple', 'components':[{'name':'bias', 'type':'int128'}, {'name':'slope', 'type':'int128'}, {'name':'ts', 'type':'uint256'}, {'name':'blk', 'type':'uint256'}]}]}, {'stateMutability':'view', 'type':'function', 'name':'user_point_epoch', 'inputs':[{'name':'arg0', 'type':'address'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'slope_changes', 'inputs':[{'name':'arg0', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'int128'}]}, {'stateMutability':'view', 'type':'function', 'name':'future_smart_wallet_checker', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'smart_wallet_checker', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}] as const; + +export default VE_BAL_ABI; diff --git a/apps/ybal/utils/abi/veBalPegHelper.abi.ts b/apps/ybal/utils/abi/veBalPegHelper.abi.ts new file mode 100644 index 000000000..a7c607334 --- /dev/null +++ b/apps/ybal/utils/abi/veBalPegHelper.abi.ts @@ -0,0 +1,3 @@ +const VEBALPEG_HELPER_ABI = [{'inputs':[{'internalType':'contract IVault', 'name':'_vault', 'type':'address'}], 'stateMutability':'nonpayable', 'type':'constructor'}, {'inputs':[{'internalType':'enum IVault.SwapKind', 'name':'kind', 'type':'uint8'}, {'components':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'uint256', 'name':'assetInIndex', 'type':'uint256'}, {'internalType':'uint256', 'name':'assetOutIndex', 'type':'uint256'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'internalType':'struct IVault.BatchSwapStep[]', 'name':'swaps', 'type':'tuple[]'}, {'internalType':'contract IAsset[]', 'name':'assets', 'type':'address[]'}, {'components':[{'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'bool', 'name':'fromInternalBalance', 'type':'bool'}, {'internalType':'address payable', 'name':'recipient', 'type':'address'}, {'internalType':'bool', 'name':'toInternalBalance', 'type':'bool'}], 'internalType':'struct IVault.FundManagement', 'name':'funds', 'type':'tuple'}], 'name':'queryBatchSwap', 'outputs':[{'internalType':'int256[]', 'name':'assetDeltas', 'type':'int256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'components':[{'internalType':'contract IAsset[]', 'name':'assets', 'type':'address[]'}, {'internalType':'uint256[]', 'name':'minAmountsOut', 'type':'uint256[]'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}, {'internalType':'bool', 'name':'toInternalBalance', 'type':'bool'}], 'internalType':'struct IVault.ExitPoolRequest', 'name':'request', 'type':'tuple'}], 'name':'queryExit', 'outputs':[{'internalType':'uint256', 'name':'bptIn', 'type':'uint256'}, {'internalType':'uint256[]', 'name':'amountsOut', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'components':[{'internalType':'contract IAsset[]', 'name':'assets', 'type':'address[]'}, {'internalType':'uint256[]', 'name':'maxAmountsIn', 'type':'uint256[]'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}, {'internalType':'bool', 'name':'fromInternalBalance', 'type':'bool'}], 'internalType':'struct IVault.JoinPoolRequest', 'name':'request', 'type':'tuple'}], 'name':'queryJoin', 'outputs':[{'internalType':'uint256', 'name':'bptOut', 'type':'uint256'}, {'internalType':'uint256[]', 'name':'amountsIn', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'components':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'enum IVault.SwapKind', 'name':'kind', 'type':'uint8'}, {'internalType':'contract IAsset', 'name':'assetIn', 'type':'address'}, {'internalType':'contract IAsset', 'name':'assetOut', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'internalType':'struct IVault.SingleSwap', 'name':'singleSwap', 'type':'tuple'}, {'components':[{'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'bool', 'name':'fromInternalBalance', 'type':'bool'}, {'internalType':'address payable', 'name':'recipient', 'type':'address'}, {'internalType':'bool', 'name':'toInternalBalance', 'type':'bool'}], 'internalType':'struct IVault.FundManagement', 'name':'funds', 'type':'tuple'}], 'name':'querySwap', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'vault', 'outputs':[{'internalType':'contract IVault', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}] as const; + +export default VEBALPEG_HELPER_ABI; diff --git a/apps/ybal/utils/abi/yBalBalancerPool.abi.ts b/apps/ybal/utils/abi/yBalBalancerPool.abi.ts new file mode 100644 index 000000000..048eb28ba --- /dev/null +++ b/apps/ybal/utils/abi/yBalBalancerPool.abi.ts @@ -0,0 +1,3 @@ +const YBAL_BALANCER_POOL_ABI = [{'inputs':[{'components':[{'internalType':'contract IVault', 'name':'vault', 'type':'address'}, {'internalType':'contract IProtocolFeePercentagesProvider', 'name':'protocolFeeProvider', 'type':'address'}, {'internalType':'string', 'name':'name', 'type':'string'}, {'internalType':'string', 'name':'symbol', 'type':'string'}, {'internalType':'contract IERC20[]', 'name':'tokens', 'type':'address[]'}, {'internalType':'contract IRateProvider[]', 'name':'rateProviders', 'type':'address[]'}, {'internalType':'uint256[]', 'name':'tokenRateCacheDurations', 'type':'uint256[]'}, {'internalType':'bool[]', 'name':'exemptFromYieldProtocolFeeFlags', 'type':'bool[]'}, {'internalType':'uint256', 'name':'amplificationParameter', 'type':'uint256'}, {'internalType':'uint256', 'name':'swapFeePercentage', 'type':'uint256'}, {'internalType':'uint256', 'name':'pauseWindowDuration', 'type':'uint256'}, {'internalType':'uint256', 'name':'bufferPeriodDuration', 'type':'uint256'}, {'internalType':'address', 'name':'owner', 'type':'address'}, {'internalType':'string', 'name':'version', 'type':'string'}], 'internalType':'struct ComposableStablePool.NewPoolParams', 'name':'params', 'type':'tuple'}], 'stateMutability':'nonpayable', 'type':'constructor'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'uint256', 'name':'startValue', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'endValue', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'startTime', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'endTime', 'type':'uint256'}], 'name':'AmpUpdateStarted', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'uint256', 'name':'currentValue', 'type':'uint256'}], 'name':'AmpUpdateStopped', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'owner', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'spender', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'value', 'type':'uint256'}], 'name':'Approval', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'bool', 'name':'paused', 'type':'bool'}], 'name':'PausedStateChanged', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'uint256', 'name':'feeType', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'protocolFeePercentage', 'type':'uint256'}], 'name':'ProtocolFeePercentageCacheUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'bool', 'name':'enabled', 'type':'bool'}], 'name':'RecoveryModeStateChanged', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'uint256', 'name':'swapFeePercentage', 'type':'uint256'}], 'name':'SwapFeePercentageChanged', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'uint256', 'name':'tokenIndex', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'rate', 'type':'uint256'}], 'name':'TokenRateCacheUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'uint256', 'name':'tokenIndex', 'type':'uint256'}, {'indexed':true, 'internalType':'contract IRateProvider', 'name':'provider', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'cacheDuration', 'type':'uint256'}], 'name':'TokenRateProviderSet', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'from', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'to', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'value', 'type':'uint256'}], 'name':'Transfer', 'type':'event'}, {'inputs':[], 'name':'DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'DOMAIN_SEPARATOR', 'outputs':[{'internalType':'bytes32', 'name':'', 'type':'bytes32'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'owner', 'type':'address'}, {'internalType':'address', 'name':'spender', 'type':'address'}], 'name':'allowance', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'spender', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'approve', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'account', 'type':'address'}], 'name':'balanceOf', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'decimals', 'outputs':[{'internalType':'uint8', 'name':'', 'type':'uint8'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'spender', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'decreaseAllowance', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'disableRecoveryMode', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'enableRecoveryMode', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes4', 'name':'selector', 'type':'bytes4'}], 'name':'getActionId', 'outputs':[{'internalType':'bytes32', 'name':'', 'type':'bytes32'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getActualSupply', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getAmplificationParameter', 'outputs':[{'internalType':'uint256', 'name':'value', 'type':'uint256'}, {'internalType':'bool', 'name':'isUpdating', 'type':'bool'}, {'internalType':'uint256', 'name':'precision', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getAuthorizer', 'outputs':[{'internalType':'contract IAuthorizer', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getBptIndex', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getDomainSeparator', 'outputs':[{'internalType':'bytes32', 'name':'', 'type':'bytes32'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getLastJoinExitData', 'outputs':[{'internalType':'uint256', 'name':'lastJoinExitAmplification', 'type':'uint256'}, {'internalType':'uint256', 'name':'lastPostJoinExitInvariant', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getMinimumBpt', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'pure', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'account', 'type':'address'}], 'name':'getNextNonce', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getOwner', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getPausedState', 'outputs':[{'internalType':'bool', 'name':'paused', 'type':'bool'}, {'internalType':'uint256', 'name':'pauseWindowEndTime', 'type':'uint256'}, {'internalType':'uint256', 'name':'bufferPeriodEndTime', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getPoolId', 'outputs':[{'internalType':'bytes32', 'name':'', 'type':'bytes32'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'uint256', 'name':'feeType', 'type':'uint256'}], 'name':'getProtocolFeePercentageCache', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getProtocolFeesCollector', 'outputs':[{'internalType':'contract IProtocolFeesCollector', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getProtocolSwapFeeDelegation', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getRate', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getRateProviders', 'outputs':[{'internalType':'contract IRateProvider[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getScalingFactors', 'outputs':[{'internalType':'uint256[]', 'name':'', 'type':'uint256[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getSwapFeePercentage', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}], 'name':'getTokenRate', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}], 'name':'getTokenRateCache', 'outputs':[{'internalType':'uint256', 'name':'rate', 'type':'uint256'}, {'internalType':'uint256', 'name':'oldRate', 'type':'uint256'}, {'internalType':'uint256', 'name':'duration', 'type':'uint256'}, {'internalType':'uint256', 'name':'expires', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'getVault', 'outputs':[{'internalType':'contract IVault', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'inRecoveryMode', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'spender', 'type':'address'}, {'internalType':'uint256', 'name':'addedValue', 'type':'uint256'}], 'name':'increaseAllowance', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}], 'name':'isTokenExemptFromYieldProtocolFee', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'name', 'outputs':[{'internalType':'string', 'name':'', 'type':'string'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'owner', 'type':'address'}], 'name':'nonces', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256[]', 'name':'balances', 'type':'uint256[]'}, {'internalType':'uint256', 'name':'lastChangeBlock', 'type':'uint256'}, {'internalType':'uint256', 'name':'protocolSwapFeePercentage', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'name':'onExitPool', 'outputs':[{'internalType':'uint256[]', 'name':'', 'type':'uint256[]'}, {'internalType':'uint256[]', 'name':'', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256[]', 'name':'balances', 'type':'uint256[]'}, {'internalType':'uint256', 'name':'lastChangeBlock', 'type':'uint256'}, {'internalType':'uint256', 'name':'protocolSwapFeePercentage', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'name':'onJoinPool', 'outputs':[{'internalType':'uint256[]', 'name':'', 'type':'uint256[]'}, {'internalType':'uint256[]', 'name':'', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'components':[{'internalType':'enum IVault.SwapKind', 'name':'kind', 'type':'uint8'}, {'internalType':'contract IERC20', 'name':'tokenIn', 'type':'address'}, {'internalType':'contract IERC20', 'name':'tokenOut', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}, {'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'uint256', 'name':'lastChangeBlock', 'type':'uint256'}, {'internalType':'address', 'name':'from', 'type':'address'}, {'internalType':'address', 'name':'to', 'type':'address'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'internalType':'struct IPoolSwapStructs.SwapRequest', 'name':'swapRequest', 'type':'tuple'}, {'internalType':'uint256[]', 'name':'balances', 'type':'uint256[]'}, {'internalType':'uint256', 'name':'indexIn', 'type':'uint256'}, {'internalType':'uint256', 'name':'indexOut', 'type':'uint256'}], 'name':'onSwap', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'pause', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'owner', 'type':'address'}, {'internalType':'address', 'name':'spender', 'type':'address'}, {'internalType':'uint256', 'name':'value', 'type':'uint256'}, {'internalType':'uint256', 'name':'deadline', 'type':'uint256'}, {'internalType':'uint8', 'name':'v', 'type':'uint8'}, {'internalType':'bytes32', 'name':'r', 'type':'bytes32'}, {'internalType':'bytes32', 'name':'s', 'type':'bytes32'}], 'name':'permit', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256[]', 'name':'balances', 'type':'uint256[]'}, {'internalType':'uint256', 'name':'lastChangeBlock', 'type':'uint256'}, {'internalType':'uint256', 'name':'protocolSwapFeePercentage', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'name':'queryExit', 'outputs':[{'internalType':'uint256', 'name':'bptIn', 'type':'uint256'}, {'internalType':'uint256[]', 'name':'amountsOut', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'bytes32', 'name':'poolId', 'type':'bytes32'}, {'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256[]', 'name':'balances', 'type':'uint256[]'}, {'internalType':'uint256', 'name':'lastChangeBlock', 'type':'uint256'}, {'internalType':'uint256', 'name':'protocolSwapFeePercentage', 'type':'uint256'}, {'internalType':'bytes', 'name':'userData', 'type':'bytes'}], 'name':'queryJoin', 'outputs':[{'internalType':'uint256', 'name':'bptOut', 'type':'uint256'}, {'internalType':'uint256[]', 'name':'amountsIn', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}, {'internalType':'bytes', 'name':'poolConfig', 'type':'bytes'}], 'name':'setAssetManagerPoolConfig', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'uint256', 'name':'swapFeePercentage', 'type':'uint256'}], 'name':'setSwapFeePercentage', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}, {'internalType':'uint256', 'name':'duration', 'type':'uint256'}], 'name':'setTokenRateCacheDuration', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'uint256', 'name':'rawEndValue', 'type':'uint256'}, {'internalType':'uint256', 'name':'endTime', 'type':'uint256'}], 'name':'startAmplificationParameterUpdate', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'stopAmplificationParameterUpdate', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'symbol', 'outputs':[{'internalType':'string', 'name':'', 'type':'string'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'totalSupply', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'transfer', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'sender', 'type':'address'}, {'internalType':'address', 'name':'recipient', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'transferFrom', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'unpause', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'updateProtocolFeePercentageCache', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'contract IERC20', 'name':'token', 'type':'address'}], 'name':'updateTokenRateCache', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'version', 'outputs':[{'internalType':'string', 'name':'', 'type':'string'}], 'stateMutability':'view', 'type':'function'}] as const; + +export default YBAL_BALANCER_POOL_ABI; diff --git a/apps/ybal/utils/actions.test.ts b/apps/ybal/utils/actions.test.ts new file mode 100644 index 000000000..07629fbc0 --- /dev/null +++ b/apps/ybal/utils/actions.test.ts @@ -0,0 +1,162 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import {createWalletClient, http, parseEther} from 'viem'; +import {describe, expect, it, vi} from 'vitest'; +import {MockConnector} from '@wagmi/core/connectors/mock'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {BAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, ZAP_YEARN_YBAL_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {simulateZapForMinOut, zapBal} from '@yBal/utils/actions'; + +import type {TAddress} from '@yearn-finance/web-lib/types'; + +const LOCAL_ZAP_YEARN_YBAL_ADDRESS = toAddress('0x43cA9bAe8dF108684E5EAaA720C25e1b32B0A075'); + +const mockZap = vi.fn(); +const mockCallStaticZap = vi.fn(); + +// const mockMintBuffer = vi.fn().mockReturnValue(toBigInt('5')); + +// vi.mock('ethers', async () => { +// const actual = await vi.importActual('ethers'); +// return { +// ethers: { +// ...actual, +// providers: { +// JsonRpcProvider: vi.fn().mockImplementation(() => ({ +// getSigner: vi.fn().mockReturnValue({ +// getAddress: vi.fn().mockReturnValue('0xRecipient') +// }) +// })) +// }, +// Contract: vi.fn().mockImplementation(() => ({ +// zap: mockZap, +// callStatic: { +// queryZapOutput: mockCallStaticZap +// }, +// mint_buffer: mockMintBuffer +// })) +// }, +// BigNumber: actual.BigNumber +// }; +// }); + +vi.mock('@yearn-finance/web-lib/utils/web3/transaction', () => ({ + handleTx: vi.fn() +})); + + +describe('actions', () => { + it('should export the correct actions', () => { + expect(zapBal).toBeDefined(); + }); + return; + + //TODO: update tests + describe('simulateZapForMinOut', () => { + describe('when buffered amount is greater than expected amount mint', () => { + it('should use the bufferedAmount for min out', async () => { + const EXPECTED_AMOUNT_MINT = parseEther('100'); // 100e18 + const EXPECTED_AMOUNT_SWAP = parseEther('200'); // 200e18 + + mockCallStaticZap + .mockReturnValueOnce(EXPECTED_AMOUNT_MINT) + .mockReturnValueOnce(EXPECTED_AMOUNT_SWAP); + + const inputToken = BAL_TOKEN_ADDRESS as TAddress; + const outputToken = YBAL_TOKEN_ADDRESS as TAddress; + const amountIn = parseEther('500'); // 500e18 + const connector = new MockConnector({ + options: { + walletClient: createWalletClient({ + transport: http('http://localhost:8545') + }) + } + }); + const {shouldMint, minOut} = await simulateZapForMinOut({ + connector: connector, + contractAddress: ZAP_YEARN_YBAL_ADDRESS, + inputToken: inputToken, + outputToken: outputToken, + amountIn: amountIn + }); + + expect(mockCallStaticZap).toHaveBeenNthCalledWith(1, BAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, amountIn, true); + expect(mockCallStaticZap).toHaveBeenNthCalledWith(2, BAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, amountIn, false); + expect(shouldMint).toBe(false); + expect(minOut).toEqual(toBigInt('197752499999999997726')); + }); + }); + + describe('when buffered amount is less or equal to expected amount mint', () => { + it('should use the expected amount mint for min out', async () => { + const EXPECTED_AMOUNT_MINT = parseEther('42'); // 42e18 + const EXPECTED_AMOUNT_SWAP = parseEther('42'); // 42e18 + + mockCallStaticZap + .mockReturnValueOnce(EXPECTED_AMOUNT_MINT) + .mockReturnValueOnce(EXPECTED_AMOUNT_SWAP); + + const inputToken = BAL_TOKEN_ADDRESS as TAddress; + const outputToken = YBAL_TOKEN_ADDRESS as TAddress; + const amountIn = parseEther('400'); // 400e18 + const expectedIn = parseEther('500'); + const connector = new MockConnector({ + options: { + walletClient: createWalletClient({ + transport: http('http://localhost:8545') + }) + } + }); + const {shouldMint, minOut} = await simulateZapForMinOut({ + connector: connector, + contractAddress: ZAP_YEARN_YBAL_ADDRESS, + inputToken: inputToken, + outputToken: outputToken, + amountIn: amountIn + }); + + expect(mockCallStaticZap).toHaveBeenNthCalledWith(1, BAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, expectedIn, true); + expect(mockCallStaticZap).toHaveBeenNthCalledWith(2, BAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, expectedIn, false); + expect(shouldMint).toBe(true); + expect(minOut).toEqual(toBigInt('41579999999999998295')); + }); + }); + }); + + describe('zap', () => { + it('should call zap with the correct arguments', async () => { + const inputToken = BAL_TOKEN_ADDRESS; + const outputToken = YBAL_TOKEN_ADDRESS; + const amountIn = parseEther('100'); // 100e18; + const minOut = parseEther('100'); // 100e18; + const slippage = 2; + const connector = new MockConnector({ + options: { + walletClient: createWalletClient({ + transport: http('http://localhost:8545') + }) + } + }); + + await zapBal({ + connector: connector, + contractAddress: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + inputToken: inputToken, + outputToken: outputToken, + amount: amountIn, + minAmount: minOut, + slippage: toBigInt(slippage), + shouldMint: true + }); + + expect(mockZap).toHaveBeenCalledWith( + BAL_TOKEN_ADDRESS, + YBAL_TOKEN_ADDRESS, + toBigInt('100000000000000000000'), + toBigInt('98000000000000000000'), + (await connector.getAccount()), + true + ); + }); + }); +}); diff --git a/apps/ybal/utils/actions.ts b/apps/ybal/utils/actions.ts new file mode 100644 index 000000000..c66914b8e --- /dev/null +++ b/apps/ybal/utils/actions.ts @@ -0,0 +1,113 @@ +import {prepareWriteContract, readContract} from '@wagmi/core'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {assert} from '@common/utils/assert'; +import {assertAddress, handleTx, toWagmiProvider} from '@common/utils/toWagmiProvider'; + +import type {TAddress} from '@yearn-finance/web-lib/types'; +import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; +import type {TWriteTransaction} from '@common/utils/toWagmiProvider'; + +const ZAP_BAL_ABI = [{'inputs':[{'name':'_input_token', 'type':'address'}, {'name':'_output_token', 'type':'address'}, {'name':'_amount_in', 'type':'uint256'}, {'name':'_min_out', 'type':'uint256'}, {'name':'_recipient', 'type':'address'}, {'name':'_mint', 'type':'bool'}], 'name':'zap', 'outputs':[{'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'mint_buffer', 'outputs':[{'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'name':'_input_token', 'type':'address'}, {'name':'_output_token', 'type':'address'}, {'name':'_amount_in', 'type':'uint256'}, {'name':'_mint', 'type':'bool'}], 'name':'queryZapOutput', 'outputs':[{'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}] as const; + +const LOCAL_ZAP_YEARN_YBAL_ADDRESS = toAddress('0x43cA9bAe8dF108684E5EAaA720C25e1b32B0A075'); +const OUTPUT_TOKENS = [YBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS]; + +type TSimulateZapForMinOut = TWriteTransaction & { + inputToken: TAddress, + outputToken: TAddress, + amountIn: bigint +}; +export async function simulateZapForMinOut(props: TSimulateZapForMinOut): Promise<{shouldMint: boolean, minOut: bigint}> { + if (props.amountIn === 0n) { + return ({shouldMint: false, minOut: 0n}); + } + + try { + const wagmiProvider = await toWagmiProvider(props.connector); + const baseContract = {...wagmiProvider, address: LOCAL_ZAP_YEARN_YBAL_ADDRESS, abi: ZAP_BAL_ABI}; + const {result: expectedAmountMint} = await prepareWriteContract({ + ...baseContract, + functionName: 'queryZapOutput', + args: [props.inputToken, props.outputToken, props.amountIn, true] + }); + + // Check if we even need to worry about minting path. + let expectedAmountSwap = expectedAmountMint; + if (!OUTPUT_TOKENS.includes(toAddress(props.inputToken))) { + // Do another Static Call - simulating output + const {result} = await prepareWriteContract({ + ...baseContract, + functionName: 'queryZapOutput', + args: [props.inputToken, props.outputToken, props.amountIn, false] + }); + expectedAmountSwap = result; + } + + // Apply Buffer + const slippage = 1; // (1%) + const buffer = await readContract({ + ...baseContract, + functionName: 'mint_buffer' + }); + const amountInBuffered = props.amountIn * buffer / 10_000n; + const bufferedAmount = expectedAmountSwap - amountInBuffered; + + if (bufferedAmount > expectedAmountMint) { + const minOut = bufferedAmount * (1n - (toBigInt(slippage) / 100n)); + return ({shouldMint: false, minOut}); + } + const minOut = expectedAmountMint * (1n - (toBigInt(slippage) / 100n)); + return ({shouldMint: true, minOut}); + } catch (error) { + console.error(error); + return ({shouldMint: false, minOut: 0n}); + } +} + +/* 🔵 - Yearn Finance ********************************************************** +** zapBal is a _WRITE_ function that can be used to zap some supported tokens +** from the Balancer ecosystem into one of the Yearn's yBal ecosystem. +** +** @app - yBal +** @param inputToken - Token to be zapped from Balancer +** @param outputToken - Token to be zapped into Yearn's yBal ecosystem +** @param amount - Amount of inputToken to be zapped +** @param minAmount - Minimum amount of outputToken to be received +** @param slippage - Slippage tolerance +******************************************************************************/ +type TZapYBal = TWriteTransaction & { + inputToken: TAddress | undefined; + outputToken: TAddress | undefined; + amount: bigint; + minAmount: bigint; + slippage: bigint; + shouldMint: boolean; +}; +export async function zapBal(props: TZapYBal): Promise { + const minAmountWithSlippage = props.minAmount * (1n - (props.slippage / 100n)); + assert(props.connector, 'No connector'); + assertAddress(LOCAL_ZAP_YEARN_YBAL_ADDRESS, 'LOCAL_ZAP_YEARN_YBAL_ADDRESS'); + assertAddress(props.inputToken, 'inputToken'); + assertAddress(props.outputToken, 'outputToken'); + assert(props.amount > 0n, 'Amount must be greater than 0'); + assert(props.minAmount > 0n, 'Min amount must be greater than 0'); + assert(props.amount >= minAmountWithSlippage, 'Amount must be greater or equal to min amount with slippage'); + + const userAddress = await props.connector.getAccount(); + assertAddress(userAddress, 'userAddress'); + return await handleTx(props, { + address: LOCAL_ZAP_YEARN_YBAL_ADDRESS, + abi: ZAP_BAL_ABI, + functionName: 'zap', + args: [ + props.inputToken, + props.outputToken, + props.amount, + minAmountWithSlippage, + userAddress, + props.shouldMint + ] + }); +} diff --git a/apps/ybal/utils/zapOptions.tsx b/apps/ybal/utils/zapOptions.tsx new file mode 100755 index 000000000..47343e1aa --- /dev/null +++ b/apps/ybal/utils/zapOptions.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import Image from 'next/image'; +import {BAL_TOKEN_ADDRESS, LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, ZAP_YEARN_YBAL_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; + +import type {TDropdownOption} from '@common/types/types'; + +const ZAP_OPTIONS_FROM: TDropdownOption[] = [ + { + label: 'Bal', + symbol: 'Bal', + decimals: 18, + value: BAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'Bal'} + ) + }, + { + label: 'st-yBal', + symbol: 'st-yBal', + decimals: 18, + value: STYBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'st-yBal'} + ) + }, { + label: 'yBal', + symbol: 'yBal', + decimals: 18, + value: YBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'yBal'} + ) + }, + { + label: 'lp-yBal', + symbol: 'lp-yBal', + decimals: 18, + value: LPYBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'lp-yBal'} + ) + } +]; + +const ZAP_OPTIONS_TO: TDropdownOption[] = [ + { + label: 'st-yBal', + symbol: 'st-yBal', + decimals: 18, + value: STYBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'st-yBal'} + ) + }, { + label: 'yBal', + symbol: 'yBal', + decimals: 18, + value: YBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'yBal'} + ) + }, + { + label: 'lp-yBal', + symbol: 'lp-yBal', + decimals: 18, + value: LPYBAL_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_YBAL_ADDRESS, + icon: ( + {'lp-yBal'} + ) + } +]; + +export { + ZAP_OPTIONS_FROM, + ZAP_OPTIONS_TO +}; diff --git a/apps/ybribe/Wrapper.tsx b/apps/ybribe/Wrapper.tsx index 7222b8623..c538a2d9f 100755 --- a/apps/ybribe/Wrapper.tsx +++ b/apps/ybribe/Wrapper.tsx @@ -6,15 +6,14 @@ import {CurveContextApp} from '@common/contexts/useCurve'; import {useCurrentApp} from '@common/hooks/useCurrentApp'; import {variants} from '@common/utils/animations'; import {BribesContextApp} from '@yBribe/contexts/useBribes'; - -import {getNextThursday} from './utils'; +import {getNextThursday} from '@yBribe/utils'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; export default function Wrapper({children, router}: {children: ReactElement, router: NextRouter}): ReactElement { const {manifest} = useCurrentApp(router); - + return ( <> diff --git a/apps/ybribe/components/bribe/GaugeBribeModal.tsx b/apps/ybribe/components/bribe/GaugeBribeModal.tsx index 4b777a26e..4e186adbc 100755 --- a/apps/ybribe/components/bribe/GaugeBribeModal.tsx +++ b/apps/ybribe/components/bribe/GaugeBribeModal.tsx @@ -1,100 +1,104 @@ -import React, {useCallback, useState} from 'react'; -import {Contract} from 'ethcall'; -import useSWR from 'swr'; +import React, {useCallback, useMemo, useState} from 'react'; +import {useContractReads} from 'wagmi'; import {Button} from '@yearn-finance/web-lib/components/Button'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import ERC20_ABI from '@yearn-finance/web-lib/utils/abi/erc20.abi'; import {isZeroAddress, toAddress} from '@yearn-finance/web-lib/utils/address'; -import {CURVE_BRIBE_V3_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {formatBN, formatToNormalizedValue, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {CURVE_BRIBE_V3_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt, decodeAsNumber, decodeAsString} from '@yearn-finance/web-lib/utils/decoder'; +import {formatToNormalizedValue, toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatCounterValue} from '@yearn-finance/web-lib/utils/format.value'; import {handleInputChangeEventValue} from '@yearn-finance/web-lib/utils/handlers/handleInputChangeEventValue'; -import {getProvider, newEthCallProvider} from '@yearn-finance/web-lib/utils/web3/providers'; -import {defaultTxStatus, Transaction} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; import {useYearn} from '@common/contexts/useYearn'; -import {approveERC20} from '@common/utils/actions/actions'; +import {approveERC20} from '@common/utils/actions'; import {useBribes} from '@yBribe/contexts/useBribes'; -import {addReward} from '@yBribe/utils/actions/addReward'; +import {addReward} from '@yBribe/utils/actions'; -import type {BigNumber} from 'ethers'; import type {ChangeEvent, ReactElement} from 'react'; +import type {TAddress} from '@yearn-finance/web-lib/types'; import type {TCurveGauge} from '@common/schemas/curveSchemas'; import type {TNormalizedBN} from '@common/types/types'; +type TExpectedOutFetcher = { + name: string; + symbol: string; + decimals: number; + normalized: number, + raw: bigint, + allowance: bigint, +} +const defaultExpectedOutFetcher: TExpectedOutFetcher = { + name: '', + symbol: '', + decimals: 0, + normalized: 0, + raw: toBigInt(0), + allowance: toBigInt(0) +}; -function GaugeBribeModal({currentGauge, onClose}: {currentGauge: TCurveGauge, onClose: VoidFunction}): ReactElement { - const {chainID, safeChainID} = useChainID(); +function GaugeBribeModal({currentGauge, onClose}: {currentGauge: TCurveGauge, onClose: VoidFunction}): ReactElement { + const {chainID} = useChainID(); const {address, provider, isActive, openLoginModal, onSwitchChain} = useWeb3(); const {refresh} = useBribes(); const {prices} = useYearn(); const [amount, set_amount] = useState(toNormalizedBN(0)); - const [tokenAddress, set_tokenAddress] = useState(''); + const [tokenAddress, set_tokenAddress] = useState(); const [txStatusApprove, set_txStatusApprove] = useState(defaultTxStatus); const [txStatusAddReward, set_txStatusAddReward] = useState(defaultTxStatus); + const {data, isSuccess, refetch} = useContractReads({ + contracts: [ + {address: tokenAddress, abi: ERC20_ABI, functionName: 'name'}, + {address: tokenAddress, abi: ERC20_ABI, functionName: 'symbol'}, + {address: tokenAddress, abi: ERC20_ABI, functionName: 'decimals'}, + {address: tokenAddress, abi: ERC20_ABI, functionName: 'balanceOf', args: [toAddress(address)]}, + {address: tokenAddress, abi: ERC20_ABI, functionName: 'allowance', args: [toAddress(address), CURVE_BRIBE_V3_ADDRESS]} + ] + }); - const expectedOutFetcher = useCallback(async (args: [string]): Promise<{ - name: string; - symbol: string; - decimals: number; - normalized: number, - raw: BigNumber, - allowance: BigNumber, - }> => { - const [_tokenAddress] = args; - const currentProvider = safeChainID === 1 ? provider || getProvider(1) : getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const erc20Contract = new Contract(_tokenAddress, ERC20_ABI); - - const [name, symbol, decimals, balance, allowance] = await ethcallProvider.tryAll([ - erc20Contract.name(), - erc20Contract.symbol(), - erc20Contract.decimals(), - erc20Contract.balanceOf(address), - erc20Contract.allowance(address, CURVE_BRIBE_V3_ADDRESS) - ]) as [string, string, number, BigNumber, BigNumber]; - + const selectedToken = useMemo((): TExpectedOutFetcher => { + if (!data || !isSuccess) { + return defaultExpectedOutFetcher; + } return ({ - name, - symbol, - decimals, - raw: balance, - normalized: formatToNormalizedValue(balance, decimals), - allowance + name: decodeAsString(data[0]), + symbol: decodeAsString(data[1]), + decimals: decodeAsNumber(data[2]), + raw: decodeAsBigInt(data[3]), + normalized: formatToNormalizedValue(decodeAsBigInt(data[3]), decodeAsNumber(data[2])), + allowance: decodeAsBigInt(data[4]) }); - }, [safeChainID, provider, address]); - - /* 🔵 - Yearn Finance ****************************************************** - ** SWR hook to get the expected out for a given in/out pair with a specific - ** amount. This hook is called every 10s or when amount/in or out changes. - ** Calls the expectedOutFetcher callback. - **************************************************************************/ - const {data: selectedToken, mutate} = useSWR( - isActive && !isZeroAddress(tokenAddress) ? [toAddress(tokenAddress)] : null, expectedOutFetcher, - {refreshInterval: 10000, shouldRetryOnError: false} - ); + }, [data, isSuccess]); - async function onApproveFrom(): Promise { - new Transaction(provider, approveERC20, set_txStatusApprove).populate( - tokenAddress, - CURVE_BRIBE_V3_ADDRESS, - amount.raw - ).onSuccess(async (): Promise => { - mutate(); - }).perform(); - } + const onApprove = useCallback(async (): Promise => { + const result = await approveERC20({ + connector: provider, + contractAddress: tokenAddress, + spenderAddress: CURVE_BRIBE_V3_ADDRESS, + amount: amount.raw, + statusHandler: set_txStatusApprove + }); + if (result.isSuccessful) { + refetch(); + } + }, [amount.raw, refetch, provider, tokenAddress]); - function onAddReward(): void { - new Transaction(provider, addReward, set_txStatusAddReward).populate( - currentGauge.gauge, - tokenAddress, - amount.raw - ).onSuccess(async (): Promise => { + const onAddReward = useCallback(async (): Promise => { + const result = await addReward({ + connector: provider, + contractAddress: CURVE_BRIBE_V3_ADDRESS, + gaugeAddress: currentGauge.gauge, + tokenAddress: tokenAddress, + amount: amount.raw, + statusHandler: set_txStatusAddReward + }); + if (result.isSuccessful) { onClose(); - mutate(); + refetch(); await refresh(); - }).perform(); - } + } + }, [amount.raw, currentGauge.gauge, refetch, onClose, provider, refresh, tokenAddress]); function renderButton(): ReactElement { if (!isActive) { @@ -115,16 +119,16 @@ function GaugeBribeModal({currentGauge, onClose}: {currentGauge: TCurveGauge, on ); } - if (txStatusApprove.pending || amount.raw.gt(selectedToken?.allowance || 0)) { + if (txStatusApprove.pending || toBigInt(amount.raw) > toBigInt(selectedToken?.allowance)) { return ( +
+ 0} + fallback={renderDefaultValuesUSDFallback()}> + {claimableForCurrentGaugeMap.map(([key, value]: [string, bigint]): ReactElement => +
+
-
- )} - + )} + + 0} + fallback={renderDefaultValuesUSDFallback()}> + {claimableForCurrentGaugeMap.map(([key, value]: [string, bigint]): ReactElement => +
+ +
+ +
+
+ )} +
+
-
diff --git a/apps/ybribe/contexts/useBribes.tsx b/apps/ybribe/contexts/useBribes.tsx index 4d8cf607d..b3f1d35d1 100755 --- a/apps/ybribe/contexts/useBribes.tsx +++ b/apps/ybribe/contexts/useBribes.tsx @@ -1,295 +1,290 @@ import React, {createContext, useCallback, useContext, useEffect, useMemo, useState} from 'react'; -import {Contract} from 'ethcall'; -import {ethers} from 'ethers'; +import {useContractRead} from 'wagmi'; +import {multicall, prepareWriteContract} from '@wagmi/core'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; -import {addressZero, allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; +import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; import {CURVE_BRIBE_V3_ADDRESS, CURVE_BRIBE_V3_HELPER_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt} from '@yearn-finance/web-lib/utils/decoder'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import performBatchedUpdates from '@yearn-finance/web-lib/utils/performBatchedUpdates'; -import {getProvider, newEthCallProvider} from '@yearn-finance/web-lib/utils/web3/providers'; import {useCurve} from '@common/contexts/useCurve'; import {getLastThursday, getNextThursday} from '@yBribe/utils'; import CURVE_BRIBE_V3 from '@yBribe/utils/abi/curveBribeV3.abi'; import CURVE_BRIBE_V3_HELPER from '@yBribe/utils/abi/curveBribeV3Helper.abi'; -import type {BigNumber} from 'ethers'; -import type {TDict, VoidPromiseFunction} from '@yearn-finance/web-lib/types'; +import type {TAddress, TDict, VoidPromiseFunction} from '@yearn-finance/web-lib/types'; import type {TCurveGaugeVersionRewards} from '@common/types/curves'; +import type {PrepareWriteContractResult} from '@wagmi/core'; export type TBribesContext = { currentRewards: TCurveGaugeVersionRewards, nextRewards: TCurveGaugeVersionRewards, claimable: TCurveGaugeVersionRewards, - dryRunClaimRewards: TCurveGaugeVersionRewards, currentPeriod: number, nextPeriod: number, isLoading: boolean, refresh: VoidPromiseFunction } -const defaultProps: TBribesContext = { - currentRewards: { - v3: {} - }, - nextRewards: { - v3: {} - }, - claimable: { - v3: {} - }, - dryRunClaimRewards: { - v3: {} - }, +const defaultProps: TBribesContext = { + currentRewards: {}, + nextRewards: {}, + claimable: {}, currentPeriod: 0, nextPeriod: 0, isLoading: true, refresh: async (): Promise => undefined }; -const BribesContext = createContext(defaultProps); +const BribesContext = createContext(defaultProps); export const BribesContextApp = ({children}: {children: React.ReactElement}): React.ReactElement => { const {gauges} = useCurve(); - const {provider, address} = useWeb3(); + const {address} = useWeb3(); const {safeChainID} = useChainID(); - const [currentRewards, set_currentRewards] = useState({v3: {}}); - const [nextRewards, set_nextRewards] = useState({v3: {}}); - const [claimable, set_claimable] = useState({v3: {}}); - const [dryRunClaimRewards, set_dryRunClaimRewards] = useState({v3: {}}); + const [currentRewards, set_currentRewards] = useState({}); + const [nextRewards, set_nextRewards] = useState({}); + const [claimable, set_claimable] = useState({}); const [isLoading, set_isLoading] = useState(true); const [currentPeriod, set_currentPeriod] = useState(getLastThursday()); const [nextPeriod, set_nextPeriod] = useState(getNextThursday()); + const bribeV3BaseContract = useMemo((): {address: TAddress, abi: typeof CURVE_BRIBE_V3} => ({ + address: CURVE_BRIBE_V3_ADDRESS, + abi: CURVE_BRIBE_V3 + }), []); + const {data: _currentPeriod} = useContractRead({ + ...bribeV3BaseContract, + functionName: 'current_period', + chainId: 1 + }); /* 🔵 - Yearn Finance ****************************************************** ** getSharedStuffFromBribes will help you retrieved some elements from the ** Bribe contracts, not related to the user. ***************************************************************************/ - const getSharedStuffFromBribes = useCallback(async (): Promise => { - const currentProvider = safeChainID === 1 ? provider || getProvider(1) : getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const curveBribeV3Contract = new Contract(CURVE_BRIBE_V3_ADDRESS, CURVE_BRIBE_V3); - const [_currentPeriod] = await ethcallProvider.tryAll([curveBribeV3Contract.current_period()]) as [number]; - + useEffect((): void => { performBatchedUpdates((): void => { set_currentPeriod(Number(_currentPeriod)); set_nextPeriod(Number(_currentPeriod) + (86400 * 7)); }); - }, [provider, safeChainID]); - useEffect((): void => { - getSharedStuffFromBribes(); - }, [getSharedStuffFromBribes]); - + }, [_currentPeriod]); /* 🔵 - Yearn Finance ****************************************************** ** getBribes will call the bribeV2 contract to get all the rewards ** per gauge. ***************************************************************************/ - const getRewardsPerGauges = useCallback(async ( - currentProvider: ethers.providers.Provider, - contract: Contract - ): Promise => { - const ethcallProvider = await newEthCallProvider(currentProvider); - const rewardsPerGaugesCalls = []; - + const getRewardsPerGauges = useCallback(async (): Promise> => { + const rewardsPerGaugesCalls = []; for (const gauge of gauges) { - rewardsPerGaugesCalls.push(contract.rewards_per_gauge(gauge.gauge)); + rewardsPerGaugesCalls.push({ + ...bribeV3BaseContract, + functionName: 'rewards_per_gauge', + args: [gauge.gauge] + }); } - const _rewardsPerGauges = await ethcallProvider.tryAll(rewardsPerGaugesCalls) as string[][]; - return ([..._rewardsPerGauges]); - }, [gauges]); + const result = await multicall({contracts: rewardsPerGaugesCalls, chainId: safeChainID}); + const rewardsPerGauges: TDict = {}; + let resultIndex = 0; + for (const gauge of gauges) { + const item = result[resultIndex++]; + if (item.status === 'failure') { + continue; + } + const rewardsTokensAddresses = item.result as TAddress[]; + if (rewardsTokensAddresses.length === 0) { + continue; + } + rewardsPerGauges[gauge.gauge.toString()] = rewardsTokensAddresses; + } + return rewardsPerGauges; + }, [bribeV3BaseContract, gauges, safeChainID]); /* 🔵 - Yearn Finance ****************************************************** ** getRewardsPerUser will help you retrieved the claimable and rewards ** elements from the Bribe contracts, related to the user for a specific ** list of gauges/tokens. ***************************************************************************/ + type TGetRewardsPerUser = { + gaugeAddress: TAddress, + tokenAddress: TAddress, + rewardPerToken: bigint, + activePeriod: bigint, + claimable: bigint, + claimRewardFor: bigint + } const getRewardsPerUser = useCallback(async ( - currentProvider: ethers.providers.Provider, - contract: Contract, - rewardsPerGauges: string[][] - ): Promise<{rewardsList: string[], multicallResult: BigNumber[]}> => { - if ((rewardsPerGauges || []).length === 0) { - return ({rewardsList: [], multicallResult: []}); + rewardsPerGauges: TDict + ): Promise> => { + const userAddress = toAddress(address); + const rewardsPerTokensPerGaugesCalls = []; + const rewardsList: string[] = []; + + for (const [gaugeAddress, rewardsTokens] of Object.entries(rewardsPerGauges)) { + for (const tokenAsReward of rewardsTokens) { + const args = [toAddress(gaugeAddress), toAddress(tokenAsReward)]; + rewardsList.push(allowanceKey( + safeChainID, + toAddress(gaugeAddress), + tokenAsReward, + userAddress + )); + rewardsPerTokensPerGaugesCalls.push(...[ + {...bribeV3BaseContract, functionName: 'reward_per_token', args: args}, + {...bribeV3BaseContract, functionName: 'active_period', args: args}, + {...bribeV3BaseContract, functionName: 'claimable', args: [userAddress, ...args]} + ]); + } } - const userAddress = address || addressZero; - const ethcallProvider = await newEthCallProvider(currentProvider); - const rewardsPerTokensPerGaugesCalls = []; - const rewardsList: string[] = []; - const _rewardsPerGauges = [...rewardsPerGauges]; - for (const gauge of gauges) { - const rewardPerGauge = _rewardsPerGauges.shift(); - if (rewardPerGauge && rewardPerGauge.length > 0) { - if (!gauge.rewardPerGauge) { - gauge.rewardPerGauge = []; - } - gauge.rewardPerGauge.push(...rewardPerGauge); - for (const tokenAsReward of rewardPerGauge) { - rewardsList.push(allowanceKey(safeChainID, toAddress(gauge.gauge), toAddress(tokenAsReward), toAddress(address))); - rewardsPerTokensPerGaugesCalls.push(...[ - contract.reward_per_token(gauge.gauge, tokenAsReward), - contract.active_period(gauge.gauge, tokenAsReward), - contract.claimable(userAddress, gauge.gauge, tokenAsReward) - ]); - } + const rewards: TDict = {}; + const result = await multicall({contracts: rewardsPerTokensPerGaugesCalls, chainId: safeChainID}); + let resultIndex = 0; + for (const [gaugeAddress, rewardsTokens] of Object.entries(rewardsPerGauges)) { + for (const tokenAsReward of rewardsTokens) { + const prepareWriteResult = await prepareWriteContract({ + ...bribeV3BaseContract, + functionName: 'claim_reward_for', + args: [userAddress, toAddress(gaugeAddress), toAddress(tokenAsReward)] + }); + rewards[gaugeAddress] = { + gaugeAddress: toAddress(gaugeAddress), + tokenAddress: toAddress(tokenAsReward), + rewardPerToken: decodeAsBigInt(result[resultIndex++]), + activePeriod: decodeAsBigInt(result[resultIndex++]), + claimable: decodeAsBigInt(result[resultIndex++]), + claimRewardFor: prepareWriteResult.result + }; } } - const _rewardsPerTokensPerGaugesWithPeriods = await ethcallProvider.tryAll(rewardsPerTokensPerGaugesCalls) as BigNumber[]; - return ({rewardsList, multicallResult: [..._rewardsPerTokensPerGaugesWithPeriods]}); - }, [gauges, safeChainID, address]); + return rewards; + }, [address, safeChainID, bribeV3BaseContract]); /* 🔵 - Yearn Finance ****************************************************** ** getNextPeriodRewards will help you retrieved the the reward_per_gauge ** and the claims_per_gauge elements from the Bribe V3 contracts to be ** able to calculate the next period rewards. ***************************************************************************/ + type TGetNextPeriodRewards = { + gaugeAddress: TAddress, + tokenAddress: TAddress, + nextRewards: bigint, + } const getNextPeriodRewards = useCallback(async ( - currentProvider: ethers.providers.Provider, - rewardsPerGauges: string[][] - ): Promise<{rewardsList: string[], multicallResult: BigNumber[]}> => { - if ((rewardsPerGauges || []).length === 0) { - return ({rewardsList: [], multicallResult: []}); - } - const contract = new ethers.Contract(CURVE_BRIBE_V3_HELPER_ADDRESS, CURVE_BRIBE_V3_HELPER, currentProvider); - const rewardsPerTokensPerGaugesCalls = []; - const rewardsList: string[] = []; + rewardsPerGauges: TDict + ): Promise> => { + const rewardsPerTokensPerGaugesCalls: Promise[] = []; - const _rewardsPerGauges = [...rewardsPerGauges]; - for (const gauge of gauges) { - const rewardPerGauge = _rewardsPerGauges.shift(); - if (rewardPerGauge && rewardPerGauge.length > 0) { - for (const tokenAsReward of rewardPerGauge) { - rewardsList.push(allowanceKey(safeChainID, toAddress(gauge.gauge), toAddress(tokenAsReward), toAddress(address))); - rewardsPerTokensPerGaugesCalls.push([gauge.gauge, tokenAsReward]); - } + for (const [gaugeAddress, rewardsTokens] of Object.entries(rewardsPerGauges)) { + for (const tokenAsReward of rewardsTokens) { + rewardsPerTokensPerGaugesCalls.push( + prepareWriteContract({ + address: CURVE_BRIBE_V3_HELPER_ADDRESS, + abi: CURVE_BRIBE_V3_HELPER, + functionName: 'getNewRewardPerToken', + args: [toAddress(gaugeAddress), tokenAsReward] + }) + ); } } - const multicallResult = await Promise.all( - rewardsPerTokensPerGaugesCalls.map((pair): unknown => contract.callStatic.getNewRewardPerToken(...pair)) - ) as BigNumber[]; + const result = await Promise.all(rewardsPerTokensPerGaugesCalls); + const multicallResult: TDict = {}; + let resultIndex = 0; + for (const [gaugeAddress, rewardsTokens] of Object.entries(rewardsPerGauges)) { + for (const tokenAsReward of rewardsTokens) { + multicallResult[gaugeAddress] = { + gaugeAddress: toAddress(gaugeAddress), + tokenAddress: toAddress(tokenAsReward), + nextRewards: toBigInt(result[resultIndex++].result as bigint) + }; + } + } - return ({rewardsList, multicallResult: [...multicallResult]}); - }, [gauges, address, safeChainID]); + return multicallResult; + }, []); /* 🔵 - Yearn Finance ****************************************************** ** assignBribes will save the currentRewards, periods and clamable values ** for each gauge/token to the state to be used by the UI. ***************************************************************************/ const assignBribes = useCallback(async ( - version: string, - rewardsList: string[], - multicallResult: BigNumber[], - currentProvider: ethers.providers.Provider + rewards: TDict ): Promise => { - if (!multicallResult || multicallResult.length === 0 || rewardsList.length === 0) { - return; - } - const _currentRewards: TDict> = {}; - const _claimable: TDict> = {}; - const _periods: TDict> = {}; - const _dryRunClaimRewards: TDict> = {}; - let rIndex = 0; - - const contractV3 = new ethers.Contract(CURVE_BRIBE_V3_ADDRESS, CURVE_BRIBE_V3, currentProvider); - for (const rewardListKey of rewardsList) { - const rewardPerTokenPerGauge = multicallResult[rIndex++]; - const periodPerTokenPerGauge = multicallResult[rIndex++]; - const claimablePerTokenPerGauge = multicallResult[rIndex++]; - if (periodPerTokenPerGauge.toNumber() >= currentPeriod) { - if (rewardListKey && rewardPerTokenPerGauge.gt(0)) { - const [, gauge, token] = rewardListKey.split('_'); - if (!_currentRewards[toAddress(gauge)]) { - _currentRewards[toAddress(gauge)] = {}; - } - if (!_periods[toAddress(gauge)]) { - _periods[toAddress(gauge)] = {}; - } - if (!_claimable[toAddress(gauge)]) { - _claimable[toAddress(gauge)] = {}; - } - if (!_dryRunClaimRewards[toAddress(gauge)]) { - _dryRunClaimRewards[toAddress(gauge)] = {}; - } - _currentRewards[toAddress(gauge)][toAddress(token)] = rewardPerTokenPerGauge; - _periods[toAddress(gauge)][toAddress(token)] = periodPerTokenPerGauge; - _claimable[toAddress(gauge)][toAddress(token)] = claimablePerTokenPerGauge; - _dryRunClaimRewards[toAddress(gauge)][toAddress(token)] = await contractV3.callStatic.claim_reward_for(toAddress(address), toAddress(gauge), toAddress(token)); - } + const _currentRewards: TDict> = {}; + const _claimable: TDict> = {}; + const _periods: TDict> = {}; + for (const [gaugeAddress, rewardData] of Object.entries(rewards)) { + const {tokenAddress, rewardPerToken, activePeriod, claimRewardFor} = rewardData; + if (!_currentRewards[gaugeAddress]) { + _currentRewards[gaugeAddress] = {}; + _periods[gaugeAddress] = {}; + _claimable[gaugeAddress] = {}; } + _currentRewards[gaugeAddress][tokenAddress] = rewardPerToken; + _periods[gaugeAddress][tokenAddress] = activePeriod; + _claimable[gaugeAddress][tokenAddress] = claimRewardFor; } - set_currentRewards((c: TCurveGaugeVersionRewards): TCurveGaugeVersionRewards => ({...c, [version]: _currentRewards})); - set_claimable((c: TCurveGaugeVersionRewards): TCurveGaugeVersionRewards => ({...c, [version]: _claimable})); - set_dryRunClaimRewards((c: TCurveGaugeVersionRewards): TCurveGaugeVersionRewards => ({...c, [version]: _dryRunClaimRewards})); + set_currentRewards(_currentRewards); + set_claimable(_claimable); set_isLoading(false); - }, [address, currentPeriod]); + }, []); /* 🔵 - Yearn Finance ****************************************************** ** assignNextRewards will save the next period rewards values for each ** gauge/token to the state to be used by the UI. ***************************************************************************/ - const assignNextRewards = useCallback(async (version: string, rewardsList: string[], multicallResult: BigNumber[]): Promise => { - if (!multicallResult || multicallResult.length === 0 || rewardsList.length === 0) { - return; - } - const _nextRewards: TDict> = {}; - - let rIndex = 0; - for (const rewardListKey of rewardsList) { - const pendingForNextPeriod = multicallResult[rIndex++]; - if (rewardListKey) { - const [, gauge, token] = rewardListKey.split('_'); - if (!_nextRewards[toAddress(gauge)]) { - _nextRewards[toAddress(gauge)] = {}; - } - _nextRewards[toAddress(gauge)][toAddress(token)] = pendingForNextPeriod; + const assignNextRewards = useCallback(async ( + nextPeriodRewards: TDict + ): Promise => { + const _nextRewards: TDict> = {}; + for (const [gaugeAddress, rewardData] of Object.entries(nextPeriodRewards)) { + const {tokenAddress, nextRewards} = rewardData; + if (!_nextRewards[gaugeAddress]) { + _nextRewards[gaugeAddress] = {}; } + _nextRewards[gaugeAddress][tokenAddress] = nextRewards; } - set_nextRewards((c: TCurveGaugeVersionRewards): TCurveGaugeVersionRewards => ({...c, [version]: _nextRewards})); + + set_nextRewards(_nextRewards); }, []); /* 🔵 - Yearn Finance ****************************************************** ** getBribes will start the process to retrieve the bribe information. ***************************************************************************/ - const getBribes = useCallback(async (): Promise => { - const currentProvider = safeChainID === 1 ? provider || getProvider(1) : getProvider(1); - const curveBribeV3Contract = new Contract(CURVE_BRIBE_V3_ADDRESS, CURVE_BRIBE_V3); - - const [rewardsPerGaugesV3] = await Promise.all([getRewardsPerGauges(currentProvider, curveBribeV3Contract)]); - const [rewardsPerUserV3, nextPeriodRewardsV3] = await Promise.all([ - getRewardsPerUser(currentProvider, curveBribeV3Contract, rewardsPerGaugesV3), - getNextPeriodRewards(currentProvider, rewardsPerGaugesV3) + const getBribes = useCallback(async (): Promise => { + const rewardsPerGauges = await getRewardsPerGauges(); + const [rewardsPerUser, nextPeriodRewards] = await Promise.all([ + getRewardsPerUser(rewardsPerGauges), + getNextPeriodRewards(rewardsPerGauges) ]); - const {rewardsList: rewardsListV3, multicallResult: multicallResultV3} = rewardsPerUserV3; - const {rewardsList: nextRewardsListV3, multicallResult: nextMulticallResultV3} = nextPeriodRewardsV3; performBatchedUpdates((): void => { - assignBribes('v3', rewardsListV3, multicallResultV3, currentProvider); - assignNextRewards('v3', nextRewardsListV3, nextMulticallResultV3); + assignBribes(rewardsPerUser); + assignNextRewards(nextPeriodRewards); }); - - }, [safeChainID, provider, getRewardsPerGauges, getRewardsPerUser, getNextPeriodRewards, assignBribes, assignNextRewards]); + return; + }, [getRewardsPerGauges, getRewardsPerUser, getNextPeriodRewards, assignBribes, assignNextRewards]); useEffect((): void => { getBribes(); }, [getBribes]); - const onRefresh = useCallback(async (): Promise => { + const onRefresh = useCallback(async (): Promise => { await getBribes(); }, [getBribes]); /* 🔵 - Yearn Finance ****************************************************** ** Setup and render the Context provider to use in the app. ***************************************************************************/ - const contextValue = useMemo((): TBribesContext => ({ + const contextValue = useMemo((): TBribesContext => ({ currentRewards: currentRewards || {}, nextRewards: nextRewards || {}, claimable: claimable || {}, - dryRunClaimRewards: dryRunClaimRewards || {}, isLoading: isLoading, currentPeriod, nextPeriod, refresh: onRefresh - }), [currentRewards, nextRewards, claimable, dryRunClaimRewards, isLoading, currentPeriod, nextPeriod, onRefresh]); + }), [currentRewards, nextRewards, claimable, isLoading, currentPeriod, nextPeriod, onRefresh]); return ( diff --git a/apps/ybribe/utils/abi/curveBribeV2.abi.tsx b/apps/ybribe/utils/abi/curveBribeV2.abi.tsx index 7f0bab5e0..12d6408be 100755 --- a/apps/ybribe/utils/abi/curveBribeV2.abi.tsx +++ b/apps/ybribe/utils/abi/curveBribeV2.abi.tsx @@ -1,3 +1,3 @@ -const CURVE_BRIBE_V2 = [{'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'active_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'add_reward_amount', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claimable', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'reward', 'type':'address'}], 'name':'gauges_per_reward', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'last_user_claim', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_token', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'rewards_per_gauge', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'tokens_for_bribe', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}] as const; +const CURVE_BRIBE_V2_ABI = [{'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'active_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'add_reward_amount', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claimable', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'reward', 'type':'address'}], 'name':'gauges_per_reward', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'last_user_claim', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_token', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'rewards_per_gauge', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'tokens_for_bribe', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}] as const; -export default CURVE_BRIBE_V2; +export default CURVE_BRIBE_V2_ABI; diff --git a/apps/ybribe/utils/abi/curveBribeV3.abi.tsx b/apps/ybribe/utils/abi/curveBribeV3.abi.tsx index c72bac8c7..61efcc224 100755 --- a/apps/ybribe/utils/abi/curveBribeV3.abi.tsx +++ b/apps/ybribe/utils/abi/curveBribeV3.abi.tsx @@ -1,3 +1,3 @@ -const CURVE_BRIBE_V3 = [{'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}], 'name':'Blacklisted', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'address', 'name':'owner', 'type':'address'}], 'name':'ChangeOwner', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':false, 'internalType':'address', 'name':'recipient', 'type':'address'}], 'name':'ClearRewardRecipient', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'uint256', 'name':'fee', 'type':'uint256'}], 'name':'FeeUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'NewTokenReward', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'uint256', 'name':'period', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'bias', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'blacklisted_bias', 'type':'uint256'}], 'name':'PeriodUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}], 'name':'RemovedFromBlacklist', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'briber', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'amount', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'fee', 'type':'uint256'}], 'name':'RewardAdded', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'RewardClaimed', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':false, 'internalType':'address', 'name':'recipient', 'type':'address'}], 'name':'SetRewardRecipient', 'type':'event'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'uint256', 'name':'', 'type':'uint256'}], 'name':'_gauges_per_reward', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'_rewards_in_gauge', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'uint256', 'name':'', 'type':'uint256'}], 'name':'_rewards_per_gauge', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'accept_owner', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'active_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'add_reward_amount', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_user', 'type':'address'}], 'name':'add_to_blacklist', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward_for', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address[]', 'name':'_users', 'type':'address[]'}, {'internalType':'address[]', 'name':'_gauges', 'type':'address[]'}, {'internalType':'address[]', 'name':'_reward_tokens', 'type':'address[]'}], 'name':'claim_reward_for_many', 'outputs':[{'internalType':'uint256[]', 'name':'amounts', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claimable', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'claims_per_gauge', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'clear_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'current_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'fee_percent', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'fee_recipient', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'reward', 'type':'address'}], 'name':'gauges_per_reward', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'get_blacklist', 'outputs':[{'internalType':'address[]', 'name':'_blacklist', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'get_blacklisted_bias', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'address_to_check', 'type':'address'}], 'name':'is_blacklisted', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'last_user_claim', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'name':'next_claim_time', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'owner', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'pending_owner', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_user', 'type':'address'}], 'name':'remove_from_blacklist', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_gauge', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_token', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_recipient', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'rewards_per_gauge', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'uint256', 'name':'_percent', 'type':'uint256'}], 'name':'set_fee_percent', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_recipient', 'type':'address'}], 'name':'set_fee_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_new_owner', 'type':'address'}], 'name':'set_owner', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_recipient', 'type':'address'}], 'name':'set_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}] as const; +const CURVE_BRIBE_V3_ABI = [{'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}], 'name':'Blacklisted', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'address', 'name':'owner', 'type':'address'}], 'name':'ChangeOwner', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':false, 'internalType':'address', 'name':'recipient', 'type':'address'}], 'name':'ClearRewardRecipient', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':false, 'internalType':'uint256', 'name':'fee', 'type':'uint256'}], 'name':'FeeUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'NewTokenReward', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'uint256', 'name':'period', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'bias', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'blacklisted_bias', 'type':'uint256'}], 'name':'PeriodUpdated', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}], 'name':'RemovedFromBlacklist', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'briber', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'amount', 'type':'uint256'}, {'indexed':false, 'internalType':'uint256', 'name':'fee', 'type':'uint256'}], 'name':'RewardAdded', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'gauge', 'type':'address'}, {'indexed':true, 'internalType':'address', 'name':'reward_token', 'type':'address'}, {'indexed':false, 'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'RewardClaimed', 'type':'event'}, {'anonymous':false, 'inputs':[{'indexed':true, 'internalType':'address', 'name':'user', 'type':'address'}, {'indexed':false, 'internalType':'address', 'name':'recipient', 'type':'address'}], 'name':'SetRewardRecipient', 'type':'event'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'uint256', 'name':'', 'type':'uint256'}], 'name':'_gauges_per_reward', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'_rewards_in_gauge', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'uint256', 'name':'', 'type':'uint256'}], 'name':'_rewards_per_gauge', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'accept_owner', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'active_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}, {'internalType':'uint256', 'name':'amount', 'type':'uint256'}], 'name':'add_reward_amount', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_user', 'type':'address'}], 'name':'add_to_blacklist', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claim_reward_for', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address[]', 'name':'_users', 'type':'address[]'}, {'internalType':'address[]', 'name':'_gauges', 'type':'address[]'}, {'internalType':'address[]', 'name':'_reward_tokens', 'type':'address[]'}], 'name':'claim_reward_for_many', 'outputs':[{'internalType':'uint256[]', 'name':'amounts', 'type':'uint256[]'}], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'user', 'type':'address'}, {'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'claimable', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'claims_per_gauge', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'clear_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[], 'name':'current_period', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'fee_percent', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'fee_recipient', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'reward', 'type':'address'}], 'name':'gauges_per_reward', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'get_blacklist', 'outputs':[{'internalType':'address[]', 'name':'_blacklist', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'get_blacklisted_bias', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'address_to_check', 'type':'address'}], 'name':'is_blacklisted', 'outputs':[{'internalType':'bool', 'name':'', 'type':'bool'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'last_user_claim', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'name':'next_claim_time', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'owner', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[], 'name':'pending_owner', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_user', 'type':'address'}], 'name':'remove_from_blacklist', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_gauge', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}, {'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_per_token', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'name':'reward_recipient', 'outputs':[{'internalType':'address', 'name':'', 'type':'address'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}], 'name':'rewards_per_gauge', 'outputs':[{'internalType':'address[]', 'name':'', 'type':'address[]'}], 'stateMutability':'view', 'type':'function'}, {'inputs':[{'internalType':'uint256', 'name':'_percent', 'type':'uint256'}], 'name':'set_fee_percent', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_recipient', 'type':'address'}], 'name':'set_fee_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_new_owner', 'type':'address'}], 'name':'set_owner', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}, {'inputs':[{'internalType':'address', 'name':'_recipient', 'type':'address'}], 'name':'set_recipient', 'outputs':[], 'stateMutability':'nonpayable', 'type':'function'}] as const; -export default CURVE_BRIBE_V3; +export default CURVE_BRIBE_V3_ABI; diff --git a/apps/ybribe/utils/abi/curveBribeV3Helper.abi.tsx b/apps/ybribe/utils/abi/curveBribeV3Helper.abi.tsx index 7214e3f76..8a1be4f25 100755 --- a/apps/ybribe/utils/abi/curveBribeV3Helper.abi.tsx +++ b/apps/ybribe/utils/abi/curveBribeV3Helper.abi.tsx @@ -1,3 +1,3 @@ -const CURVE_BRIBE_V3_HELPER = [{'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'getNewRewardPerToken', 'outputs':[{'internalType':'uint256', 'name':'', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}] as const; +const CURVE_BRIBE_V3_HELPER_ABI = [{'inputs':[{'internalType':'address', 'name':'gauge', 'type':'address'}, {'internalType':'address', 'name':'reward_token', 'type':'address'}], 'name':'getNewRewardPerToken', 'outputs':[{'internalType':'uint256', 'name':'newRewards', 'type':'uint256'}], 'stateMutability':'nonpayable', 'type':'function'}] as const; -export default CURVE_BRIBE_V3_HELPER; +export default CURVE_BRIBE_V3_HELPER_ABI; diff --git a/apps/ybribe/utils/actions.ts b/apps/ybribe/utils/actions.ts new file mode 100644 index 000000000..ba981e42d --- /dev/null +++ b/apps/ybribe/utils/actions.ts @@ -0,0 +1,66 @@ +import {CURVE_BRIBE_V3_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {assert} from '@common/utils/assert'; +import {assertAddress, handleTx} from '@common/utils/toWagmiProvider'; +import CURVE_BRIBE_V3_ABI from '@yBribe/utils/abi/curveBribeV3.abi'; + +import type {TAddress} from '@yearn-finance/web-lib/types'; +import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; +import type {TWriteTransaction} from '@common/utils/toWagmiProvider'; + +/* 🔵 - Yearn Finance ********************************************************** +** claimReward is a _WRITE_ function that claims the rewards from the yBribe +** contract. +** +** @app - yBribe +** @param gaugeAddress - The address of the gauge to claim rewards from. +** @param tokenAddress - The address of the token to claim rewards from. +******************************************************************************/ +type TClaimReward = TWriteTransaction & { + gaugeAddress: TAddress | undefined; + tokenAddress: TAddress | undefined; +}; +export async function claimRewardV3(props: TClaimReward): Promise { + assert(props.connector, 'No connector'); + assertAddress(CURVE_BRIBE_V3_ADDRESS, 'CURVE_BRIBE_V3_ADDRESS'); + assertAddress(props.gaugeAddress, 'gaugeAddress'); + assertAddress(props.tokenAddress, 'tokenAddress'); + + const signerAddress = await props.connector.getAccount(); + assertAddress(signerAddress, 'signerAddress'); + + return await handleTx(props, { + address: CURVE_BRIBE_V3_ADDRESS, + abi: CURVE_BRIBE_V3_ABI, + functionName: 'claim_reward_for', + args: [signerAddress, props.gaugeAddress, props.tokenAddress] + }); +} + + +/* 🔵 - Yearn Finance ********************************************************** +** claimReward is a _WRITE_ function that claims the rewards from the yBribe +** contract. +** The correct function for V2 or V3 should be used. +** +** @app - yBribe +** @param gaugeAddress - The address of the gauge to claim rewards from. +** @param tokenAddress - The address of the token to claim rewards from. +******************************************************************************/ +type TAddReward = TWriteTransaction & { + gaugeAddress: TAddress | undefined; + tokenAddress: TAddress | undefined; + amount: bigint; +}; +export async function addReward(props: TAddReward): Promise { + assertAddress(CURVE_BRIBE_V3_ADDRESS, 'CURVE_BRIBE_V3_ADDRESS'); + assertAddress(props.gaugeAddress, 'gaugeAddress'); + assertAddress(props.tokenAddress, 'tokenAddress'); + assert(props.amount > 0n, 'Amount must be greater than 0'); + + return await handleTx(props, { + address: CURVE_BRIBE_V3_ADDRESS, + abi: CURVE_BRIBE_V3_ABI, + functionName: 'add_reward_amount', + args: [props.gaugeAddress, props.tokenAddress, props.amount] + }); +} diff --git a/apps/ybribe/utils/actions/addReward.tsx b/apps/ybribe/utils/actions/addReward.tsx deleted file mode 100755 index 624ad3133..000000000 --- a/apps/ybribe/utils/actions/addReward.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {ethers} from 'ethers'; -import {CURVE_BRIBE_V3_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {handleTx} from '@yearn-finance/web-lib/utils/web3/transaction'; - -import type {BigNumber} from 'ethers'; -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; - -export async function addReward( - provider: ethers.providers.JsonRpcProvider, - gaugeAddress: string, - tokenAddress: string, - amount: BigNumber -): Promise { - const signer = provider.getSigner(); - const contract = new ethers.Contract( - CURVE_BRIBE_V3_ADDRESS as string, - ['function add_reward_amount(address, address, uint256) external'], - signer - ); - return await handleTx(contract.add_reward_amount(gaugeAddress, tokenAddress, amount)); -} diff --git a/apps/ybribe/utils/actions/claimReward.tsx b/apps/ybribe/utils/actions/claimReward.tsx deleted file mode 100755 index 3a49817b4..000000000 --- a/apps/ybribe/utils/actions/claimReward.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {ethers} from 'ethers'; -import {CURVE_BRIBE_V3_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {handleTx} from '@yearn-finance/web-lib/utils/web3/transaction'; - -import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; - -export async function claimReward( - provider: ethers.providers.JsonRpcProvider, - contractAddress: string, - gauge: string, - token: string -): Promise { - const signer = provider.getSigner(); - const user = await signer.getAddress(); - const contract = new ethers.Contract( - contractAddress, [ - 'function claim_reward(address, address, address)', - 'function claim_reward_for(address, address, address)' - ], - signer - ); - if (contractAddress === CURVE_BRIBE_V3_ADDRESS) { - return await handleTx(contract.claim_reward_for(user, gauge, token)); - } - return await handleTx(contract.claim_reward(user, gauge, token)); - -} diff --git a/apps/ybribe/utils/index.tsx b/apps/ybribe/utils/index.ts similarity index 76% rename from apps/ybribe/utils/index.tsx rename to apps/ybribe/utils/index.ts index f72e23fb3..d1316ae7e 100755 --- a/apps/ybribe/utils/index.tsx +++ b/apps/ybribe/utils/index.ts @@ -7,9 +7,9 @@ extend(dayjsDuration); extend(weekday); extend(utc); -export function getLastThursday(): number { - const today = dayjs().utc(); - let lastThursday = today.weekday(4); +export function getLastThursday(): number { + const today = dayjs().utc(); + let lastThursday = today.weekday(4); lastThursday = lastThursday.set('hour', 0); lastThursday = lastThursday.set('minute', 0); lastThursday = lastThursday.set('second', 0); @@ -19,9 +19,9 @@ export function getLastThursday(): number { return (lastThursday.unix()); } -export function getNextThursday(): number { - const today = dayjs().utc(); - let nextThursday = today.weekday(4); +export function getNextThursday(): number { + const today = dayjs().utc(); + let nextThursday = today.weekday(4); nextThursday = nextThursday.set('hour', 0); nextThursday = nextThursday.set('minute', 0); nextThursday = nextThursday.set('second', 0); diff --git a/apps/ycrv/components/CardMigrateLegacy.tsx b/apps/ycrv/components/CardMigrateLegacy.tsx deleted file mode 100755 index e568ba567..000000000 --- a/apps/ycrv/components/CardMigrateLegacy.tsx +++ /dev/null @@ -1,249 +0,0 @@ -import React, {useMemo} from 'react'; -import Balancer from 'react-wrap-balancer'; -import {motion} from 'framer-motion'; -import {Button} from '@yearn-finance/web-lib/components/Button'; -import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; -import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {formatBN, formatToNormalizedValue, toNormalizedBN, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; -import {formatPercent} from '@yearn-finance/web-lib/utils/format.number'; -import {formatCounterValue} from '@yearn-finance/web-lib/utils/format.value'; -import {handleInputChangeEventValue} from '@yearn-finance/web-lib/utils/handlers/handleInputChangeEventValue'; -import performBatchedUpdates from '@yearn-finance/web-lib/utils/performBatchedUpdates'; -import {Dropdown} from '@common/components/TokenDropdown'; -import {useWallet} from '@common/contexts/useWallet'; -import {useYearn} from '@common/contexts/useYearn'; -import ArrowDown from '@common/icons/ArrowDown'; -import CardTransactorContextApp, {useCardTransactor} from '@yCRV/components/CardTransactorWrapper'; -import {CardVariants, CardVariantsInner} from '@yCRV/utils/animations'; -import {LEGACY_OPTIONS_FROM, LEGACY_OPTIONS_TO} from '@yCRV/utils/zapOptions'; - -import type {ChangeEvent, ReactElement} from 'react'; -import type {TDropdownOption} from '@common/types/types'; - -function CardMigrateLegacy(): ReactElement { - const {isActive} = useWeb3(); - const {balances} = useWallet(); - const {vaults, prices} = useYearn(); - const { - txStatusApprove, txStatusZap, - selectedOptionFrom, set_selectedOptionFrom, - selectedOptionTo, set_selectedOptionTo, - amount, set_amount, - set_hasTypedSomething, - toVaultAPY, expectedOutWithSlippage, - allowanceFrom, onApproveFrom, onZap - } = useCardTransactor(); - - const ycrvPrice = useMemo((): number => ( - formatToNormalizedValue( - formatBN(prices?.[YCRV_TOKEN_ADDRESS] || 0), - 6 - ) - ), [prices]); - const ycrvCurvePoolPrice = useMemo((): number => ( - formatToNormalizedValue( - formatBN(prices?.[YCRV_CURVE_POOL_ADDRESS] || 0), - 6 - ) - ), [prices]); - - function renderButton(): ReactElement { - const balanceForInputToken = formatBN(balances?.[toAddress(selectedOptionFrom.value)]?.raw); - const isAboveBalance = formatBN(amount?.raw).gt(balanceForInputToken) || balanceForInputToken.eq(Zero); - - if (txStatusApprove.pending || (amount.raw).gt(allowanceFrom)) { - return ( - - ); - } - - return ( - - ); - } - - return ( - <> -
- -

{'Out with the old,'}

-

{'in with the new'}

-
-
-
- -

{'yveCRV and yvBOOST are no longer supported (RIP), but you can easily migrate them to our new and improved tokens. Simply convert below and start earning that sweet sweet yield.'}

-
-
- -
- -
- -
-
- ): void => { - performBatchedUpdates((): void => { - set_amount(handleInputChangeEventValue(e.target.value, balances[toAddress(selectedOptionFrom.value)]?.decimals || 18)); - set_hasTypedSomething(true); - }); - }} /> - -
-
-

- {formatCounterValue( - amount?.normalized || 0, - toAddress(selectedOptionFrom.value) === YCRV_TOKEN_ADDRESS - ? ycrvPrice || 0 - : toAddress(selectedOptionFrom.value) === YCRV_CURVE_POOL_ADDRESS - ? ycrvCurvePoolPrice || 0 - : balances?.[toAddress(selectedOptionFrom.value)]?.normalizedPrice - || vaults?.[toAddress(selectedOptionFrom.value)]?.tvl?.price - || 0 - )} -

-
-
- - - -
- -
-
-

{'You will receive minimum'}

-

{'You will receive min'}

-
-
- - {expectedOutWithSlippage} - -
-

- {formatCounterValue( - expectedOutWithSlippage, - toAddress(selectedOptionTo.value) === YCRV_TOKEN_ADDRESS - ? ycrvPrice || 0 - : toAddress(selectedOptionFrom.value) === YCRV_CURVE_POOL_ADDRESS - ? ycrvCurvePoolPrice || 0 - : balances?.[toAddress(selectedOptionTo.value)]?.normalizedPrice - || vaults?.[toAddress(selectedOptionTo.value)]?.tvl?.price - || 0 - )} -

-
-
- -
-
- {renderButton()} -
-
- - ); -} - -function CardMigrateLegacyWrapper(): ReactElement { - const {txStatusApprove, txStatusZap} = useCardTransactor(); - - return ( -
- - - - - -
- -
-
- ); -} - -function WithCardTransactor(): ReactElement { - return ( - - - - ); -} -export default WithCardTransactor; diff --git a/apps/ycrv/components/CardTransactorWrapper.tsx b/apps/ycrv/components/CardTransactorWrapper.tsx index 41497e236..019fab67c 100755 --- a/apps/ycrv/components/CardTransactorWrapper.tsx +++ b/apps/ycrv/components/CardTransactorWrapper.tsx @@ -1,29 +1,28 @@ import React, {createContext, useCallback, useContext, useEffect, useMemo, useState} from 'react'; -import {ethers} from 'ethers'; import useSWR from 'swr'; +import {readContract} from '@wagmi/core'; import {yToast} from '@yearn-finance/web-lib/components/yToast'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useAddToken} from '@yearn-finance/web-lib/hooks/useAddToken'; import {useDismissToasts} from '@yearn-finance/web-lib/hooks/useDismissToasts'; +import VAULT_ABI from '@yearn-finance/web-lib/utils/abi/vault.abi'; import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; -import {LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {formatBN, toNormalizedBN, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {LPYCRV_TOKEN_ADDRESS, MAX_UINT_256, STYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatPercent} from '@yearn-finance/web-lib/utils/format.number'; import performBatchedUpdates from '@yearn-finance/web-lib/utils/performBatchedUpdates'; -import {getProvider} from '@yearn-finance/web-lib/utils/web3/providers'; -import {defaultTxStatus, Transaction} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; import {useWallet} from '@common/contexts/useWallet'; import {useYearn} from '@common/contexts/useYearn'; import {getAmountWithSlippage, getVaultAPY} from '@common/utils'; -import {approveERC20} from '@common/utils/actions/actions'; -import {deposit} from '@common/utils/actions/deposit'; +import {approveERC20, deposit} from '@common/utils/actions'; +import {LEGACY_OPTIONS_FROM, LEGACY_OPTIONS_TO} from '@yCRV/constants/tokens'; import {useYCRV} from '@yCRV/contexts/useYCRV'; -import {zap} from '@yCRV/utils/actions'; -import {LEGACY_OPTIONS_FROM, LEGACY_OPTIONS_TO} from '@yCRV/utils/zapOptions'; +import ZAP_CRV_ABI from '@yCRV/utils/abi/zapCRV.abi'; +import {zapCRV} from '@yCRV/utils/actions'; -import type {BigNumber} from 'ethers'; import type {ReactElement} from 'react'; -import type {VoidPromiseFunction} from '@yearn-finance/web-lib/types'; +import type {TAddress, VoidPromiseFunction} from '@yearn-finance/web-lib/types'; import type {TDropdownOption, TNormalizedBN} from '@common/types/types'; type TCardTransactor = { @@ -32,7 +31,7 @@ type TCardTransactor = { amount: TNormalizedBN, txStatusApprove: typeof defaultTxStatus, txStatusZap: typeof defaultTxStatus, - allowanceFrom: BigNumber, + allowanceFrom: bigint, fromVaultAPY: string, toVaultAPY: string, expectedOutWithSlippage: number, @@ -45,13 +44,13 @@ type TCardTransactor = { onZap: VoidPromiseFunction } -const CardTransactorContext = createContext({ +const CardTransactorContext = createContext({ selectedOptionFrom: LEGACY_OPTIONS_FROM[0], selectedOptionTo: LEGACY_OPTIONS_TO[0], amount: toNormalizedBN(0), txStatusApprove: defaultTxStatus, txStatusZap: defaultTxStatus, - allowanceFrom: Zero, + allowanceFrom: 0n, fromVaultAPY: '', toVaultAPY: '', expectedOutWithSlippage: 0, @@ -64,24 +63,24 @@ const CardTransactorContext = createContext({ onIncreaseCRVAllowance: async (): Promise => undefined }); -function CardTransactorContextApp({ +function CardTransactorContextApp({ defaultOptionFrom = LEGACY_OPTIONS_FROM[0], defaultOptionTo = LEGACY_OPTIONS_TO[0], children =
}): ReactElement { - const {provider, isActive, address} = useWeb3(); - const {styCRVAPY, allowances, slippage} = useYCRV(); - const {balancesNonce, balances, refresh} = useWallet(); - const {vaults} = useYearn(); - const [txStatusApprove, set_txStatusApprove] = useState(defaultTxStatus); - const [txStatusZap, set_txStatusZap] = useState(defaultTxStatus); - const [selectedOptionFrom, set_selectedOptionFrom] = useState(defaultOptionFrom); - const [selectedOptionTo, set_selectedOptionTo] = useState(defaultOptionTo); - const [amount, set_amount] = useState(toNormalizedBN(0)); - const [hasTypedSomething, set_hasTypedSomething] = useState(false); - const addToken = useAddToken(); - const {dismissAllToasts} = useDismissToasts(); - const {toast} = yToast(); + const {provider, isActive, address} = useWeb3(); + const {styCRVAPY, allowances, slippage} = useYCRV(); + const {balancesNonce, balances, refresh} = useWallet(); + const {vaults} = useYearn(); + const [txStatusApprove, set_txStatusApprove] = useState(defaultTxStatus); + const [txStatusZap, set_txStatusZap] = useState(defaultTxStatus); + const [selectedOptionFrom, set_selectedOptionFrom] = useState(defaultOptionFrom); + const [selectedOptionTo, set_selectedOptionTo] = useState(defaultOptionTo); + const [amount, set_amount] = useState(toNormalizedBN(0)); + const [hasTypedSomething, set_hasTypedSomething] = useState(false); + const addToken = useAddToken(); + const {dismissAllToasts} = useDismissToasts(); + const {toast} = yToast(); /* 🔵 - Yearn Finance ****************************************************** ** useEffect to set the amount to the max amount of the selected token once @@ -89,9 +88,9 @@ function CardTransactorContextApp({ **************************************************************************/ useEffect((): void => { balancesNonce; // remove warning, force deep refresh - if (isActive && amount.raw.eq(0) && !hasTypedSomething) { + if (isActive && (amount.raw === 0n) && !hasTypedSomething) { set_amount(toNormalizedBN(balances[toAddress(selectedOptionFrom.value)]?.raw)); - } else if (!isActive && amount.raw.gt(0)) { + } else if (!isActive && (amount.raw > 0n)) { performBatchedUpdates((): void => { set_amount(toNormalizedBN(0)); set_hasTypedSomething(false); @@ -104,49 +103,41 @@ function CardTransactorContextApp({ ** out for a given in/out pair with a specific amount. This callback is ** called every 10s or when amount/in or out changes. **************************************************************************/ - const expectedOutFetcher = useCallback(async (args: [string, string, BigNumber]): Promise => { + const expectedOutFetcher = useCallback(async (args: [TAddress, TAddress, bigint]): Promise => { const [_inputToken, _outputToken, _amountIn] = args; - if (_amountIn.isZero()) { - return (Zero); + if (_amountIn === 0n) { + return (0n); } - const currentProvider = provider || getProvider(1); - if (_inputToken === YCRV_CURVE_POOL_ADDRESS) { - // Direct deposit to vault from crv/yCRV Curve LP Token to lp-yCRV Vault - const contract = new ethers.Contract( - LPYCRV_TOKEN_ADDRESS, - ['function pricePerShare() public view returns (uint256)'], - currentProvider - ); - try { - const pps = formatBN(await contract.pricePerShare()); - const _expectedOut = _amountIn.mul(pps).div(ethers.constants.WeiPerEther); - return _expectedOut; - } catch (error) { - return (Zero); - } - } else { - // Zap in - const contract = new ethers.Contract( - ZAP_YEARN_VE_CRV_ADDRESS, - ['function calc_expected_out(address, address, uint256) public view returns (uint256)'], - currentProvider - ); - try { - const _expectedOut = formatBN(await contract.calc_expected_out(_inputToken, _outputToken, _amountIn)); + try { + if (_inputToken === YCRV_CURVE_POOL_ADDRESS) { + const pps = await readContract({ + address: LPYCRV_TOKEN_ADDRESS, + abi: VAULT_ABI, + functionName: 'pricePerShare' + }); + const _expectedOut = _amountIn * pps / toBigInt(1e18); return _expectedOut; - } catch (error) { - return (Zero); } + const _expectedOut = await readContract({ + address: ZAP_YEARN_VE_CRV_ADDRESS, + abi: ZAP_CRV_ABI, + functionName: 'calc_expected_out', + args: [_inputToken, _outputToken, _amountIn] + }); + return _expectedOut; + } catch (error) { + return (0n); } - }, [provider]); + }, []); /* 🔵 - Yearn Finance ****************************************************** ** SWR hook to get the expected out for a given in/out pair with a specific ** amount. This hook is called every 10s or when amount/in or out changes. ** Calls the expectedOutFetcher callback. **************************************************************************/ - const {data: expectedOut} = useSWR( + //TODO: CHANGE THIS + const {data: expectedOut} = useSWR( isActive ? [ selectedOptionFrom.value, selectedOptionTo.value, @@ -160,44 +151,52 @@ function CardTransactorContextApp({ ** Approve the spending of token A by the corresponding ZAP contract to ** perform the swap. **************************************************************************/ - async function onApproveFrom(): Promise { - new Transaction(provider, approveERC20, set_txStatusApprove).populate( - toAddress(selectedOptionFrom.value), - selectedOptionFrom.zapVia, - ethers.constants.MaxUint256 - ).onSuccess(async (): Promise => { + const onApprove = useCallback(async (): Promise => { + const result = await approveERC20({ + connector: provider, + contractAddress: selectedOptionFrom.value, + spenderAddress: selectedOptionFrom.zapVia, + amount: MAX_UINT_256, + statusHandler: set_txStatusApprove + }); + if (result.isSuccessful) { await refresh(); - }).perform(); - } + } + }, [provider, refresh, selectedOptionFrom.value, selectedOptionFrom.zapVia]); /* 🔵 - Yearn Finance ****************************************************** ** CRV token require the allowance to be reset to 0 before being able to ** increase it. This function is called when the user wants to increase the ** allowance of the CRV token. **************************************************************************/ - async function onIncreaseCRVAllowance(): Promise { - await new Transaction(provider, approveERC20, set_txStatusApprove).populate( - toAddress(selectedOptionFrom.value), - selectedOptionFrom.zapVia, - 0 - ).perform(); - - new Transaction(provider, approveERC20, set_txStatusApprove).populate( - toAddress(selectedOptionFrom.value), - selectedOptionFrom.zapVia, - ethers.constants.MaxUint256 - ).onSuccess(async (): Promise => { - await refresh(); - }).perform(); - } + const onIncreaseCRVAllowance = useCallback(async (): Promise => { + const resultReset = await approveERC20({ + connector: provider, + contractAddress: selectedOptionFrom.value, + spenderAddress: selectedOptionFrom.zapVia, + amount: 0n, + statusHandler: set_txStatusApprove + }); + if (resultReset.isSuccessful) { + const result = await approveERC20({ + connector: provider, + contractAddress: selectedOptionFrom.value, + spenderAddress: selectedOptionFrom.zapVia, + amount: MAX_UINT_256, + statusHandler: set_txStatusApprove + }); + if (result.isSuccessful) { + await refresh(); + } + } + }, [provider, refresh, selectedOptionFrom.value, selectedOptionFrom.zapVia]); /* 🔵 - Yearn Finance ****************************************************** ** Execute a zap using the ZAP contract to migrate from a token A to a ** supported token B. **************************************************************************/ - async function onZap(): Promise { + const onZap = useCallback(async (): Promise => { dismissAllToasts(); - const addToMetamaskToast = { type: 'info' as const, content: `Add ${selectedOptionTo.symbol} to Metamask?`, @@ -215,58 +214,66 @@ function CardTransactorContextApp({ if (selectedOptionFrom.zapVia === LPYCRV_TOKEN_ADDRESS) { // Direct deposit to vault from crv/yCRV Curve LP Token to lp-yCRV Vault - new Transaction(provider, deposit, set_txStatusZap).populate( - toAddress(selectedOptionTo.value), //destination vault - amount.raw //amount_in - ).onSuccess(async (): Promise => { + const result = await deposit({ + connector: provider, + contractAddress: selectedOptionTo.value, + amount: amount.raw, //amount_in + statusHandler: set_txStatusZap + }); + if (result.isSuccessful) { set_amount(toNormalizedBN(0)); await refresh(); toast(addToMetamaskToast); - }).perform(); + } } else { // Zap in - new Transaction(provider, zap, set_txStatusZap).populate( - toAddress(selectedOptionFrom.value), //_input_token - toAddress(selectedOptionTo.value), //_output_token - amount.raw, //amount_in - expectedOut, //_min_out - slippage - ).onSuccess(async (): Promise => { + const result = await zapCRV({ + connector: provider, + contractAddress: ZAP_YEARN_VE_CRV_ADDRESS, + inputToken: selectedOptionFrom.value, //_input_token + outputToken: selectedOptionTo.value, //_output_token + amount: amount.raw, //amount_in + minAmount: toBigInt(expectedOut), //_min_out + slippage: toBigInt(slippage), + statusHandler: set_txStatusZap + }); + if (result.isSuccessful) { set_amount(toNormalizedBN(0)); await refresh(); toast(addToMetamaskToast); - }).perform(); + } } - } + }, [addToken, amount.raw, dismissAllToasts, expectedOut, provider, refresh, selectedOptionFrom.value, selectedOptionFrom.zapVia, selectedOptionTo.decimals, selectedOptionTo.icon?.props.src, selectedOptionTo.symbol, selectedOptionTo.value, slippage, toast]); + /* 🔵 - Yearn Finance ****************************************************** ** Set of memorized values to limit the number of re-rendering of the ** component. **************************************************************************/ - const fromVaultAPY = useMemo((): string => { + const fromVaultAPY = useMemo((): string => { if (toAddress(selectedOptionFrom.value) === STYCRV_TOKEN_ADDRESS) { return `APY ${formatPercent(styCRVAPY)}`; } return getVaultAPY(vaults, selectedOptionFrom.value); }, [vaults, selectedOptionFrom, styCRVAPY]); - const toVaultAPY = useMemo((): string => { + const toVaultAPY = useMemo((): string => { if (toAddress(selectedOptionTo.value) === STYCRV_TOKEN_ADDRESS) { return `APY ${formatPercent(styCRVAPY)}`; } return getVaultAPY(vaults, selectedOptionTo.value); }, [vaults, selectedOptionTo, styCRVAPY]); - const expectedOutWithSlippage = useMemo((): number => getAmountWithSlippage( + const expectedOutWithSlippage = useMemo((): number => getAmountWithSlippage( selectedOptionFrom.value, selectedOptionTo.value, - formatBN(expectedOut), + toBigInt(expectedOut), slippage ), [expectedOut, selectedOptionFrom.value, selectedOptionTo.value, slippage]); - const allowanceFrom = useMemo((): BigNumber => { + const allowanceFrom = useMemo((): bigint => { balancesNonce; // remove warning, force deep refresh - return formatBN(allowances?.[allowanceKey(1, toAddress(selectedOptionFrom.value), toAddress(selectedOptionFrom.zapVia), toAddress(address))]); + return toBigInt(allowances?.[allowanceKey(1, toAddress(selectedOptionFrom.value), toAddress(selectedOptionFrom.zapVia), toAddress(address))]); }, [balancesNonce, allowances, selectedOptionFrom.value, selectedOptionFrom.zapVia, address]); return ( @@ -285,7 +292,7 @@ function CardTransactorContextApp({ set_selectedOptionTo, set_amount, set_hasTypedSomething, - onApproveFrom, + onApproveFrom: onApprove, onIncreaseCRVAllowance, onZap }}> diff --git a/apps/ycrv/components/CardZap.tsx b/apps/ycrv/components/CardZap.tsx index 1c9d481b1..127aa6d41 100755 --- a/apps/ycrv/components/CardZap.tsx +++ b/apps/ycrv/components/CardZap.tsx @@ -1,11 +1,10 @@ import React, {useMemo} from 'react'; -import Balancer from 'react-wrap-balancer'; -import {motion} from 'framer-motion'; import {Button} from '@yearn-finance/web-lib/components/Button'; import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {cl} from '@yearn-finance/web-lib/utils/cl'; import {CRV_TOKEN_ADDRESS, LPYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {formatBN, formatToNormalizedValue, toNormalizedBN, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt, toNormalizedBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatCounterValue} from '@yearn-finance/web-lib/utils/format.value'; import {handleInputChangeEventValue} from '@yearn-finance/web-lib/utils/handlers/handleInputChangeEventValue'; import performBatchedUpdates from '@yearn-finance/web-lib/utils/performBatchedUpdates'; @@ -14,17 +13,16 @@ import {useWallet} from '@common/contexts/useWallet'; import {useYearn} from '@common/contexts/useYearn'; import ArrowDown from '@common/icons/ArrowDown'; import CardTransactorContextApp, {useCardTransactor} from '@yCRV/components/CardTransactorWrapper'; -import {CardVariants, CardVariantsInner} from '@yCRV/utils/animations'; -import {ZAP_OPTIONS_FROM, ZAP_OPTIONS_TO} from '@yCRV/utils/zapOptions'; +import {ZAP_OPTIONS_FROM, ZAP_OPTIONS_TO} from '@yCRV/constants/tokens'; import type {ChangeEvent, ReactElement} from 'react'; import type {TDropdownOption} from '@common/types/types'; -function CardZap(): ReactElement { - const {isActive} = useWeb3(); - const {balances} = useWallet(); - const {vaults, prices} = useYearn(); - const { +function CardZap(): ReactElement { + const {isActive} = useWeb3(); + const {balances} = useWallet(); + const {vaults, prices} = useYearn(); + const { txStatusApprove, txStatusZap, selectedOptionFrom, set_selectedOptionFrom, selectedOptionTo, set_selectedOptionTo, @@ -34,16 +32,16 @@ function CardZap(): ReactElement { allowanceFrom, onApproveFrom, onZap, onIncreaseCRVAllowance } = useCardTransactor(); - const ycrvPrice = useMemo((): number => ( + const ycrvPrice = useMemo((): number => ( formatToNormalizedValue( - formatBN(prices?.[YCRV_TOKEN_ADDRESS] || 0), + toBigInt(prices?.[YCRV_TOKEN_ADDRESS] || 0), 6 ) ), [prices]); - const ycrvCurvePoolPrice = useMemo((): number => ( + const ycrvCurvePoolPrice = useMemo((): number => ( formatToNormalizedValue( - formatBN(prices?.[YCRV_CURVE_POOL_ADDRESS] || 0), + toBigInt(prices?.[YCRV_CURVE_POOL_ADDRESS] || 0), 6 ) ), [prices]); @@ -51,7 +49,7 @@ function CardZap(): ReactElement { /* 🔵 - Yearn Finance ****************************************************** ** useMemo to get the current possible TO vaults path for the current FROM **************************************************************************/ - const possibleTo = useMemo((): TDropdownOption[] => { + const possibleTo = useMemo((): TDropdownOption[] => { if (selectedOptionFrom.value === YCRV_CURVE_POOL_ADDRESS) { const possibleOptions = ZAP_OPTIONS_TO.filter((option): boolean => option.value === LPYCRV_TOKEN_ADDRESS); if (selectedOptionTo.value !== LPYCRV_TOKEN_ADDRESS) { @@ -62,13 +60,13 @@ function CardZap(): ReactElement { return ZAP_OPTIONS_TO.filter((option): boolean => option.value !== selectedOptionFrom.value); }, [selectedOptionFrom.value, selectedOptionTo.value, ZAP_OPTIONS_TO]); // eslint-disable-line react-hooks/exhaustive-deps - function renderButton(): ReactElement { - const balanceForInputToken = formatBN(balances?.[toAddress(selectedOptionFrom.value)]?.raw); - const isAboveBalance = amount.raw.gt(balanceForInputToken) || balanceForInputToken.eq(Zero); - const isAboveAllowance = (amount.raw).gt(allowanceFrom); + function renderButton(): ReactElement { + const balanceForInputToken = toBigInt(balances?.[toAddress(selectedOptionFrom.value)]?.raw); + const isAboveBalance = amount.raw > balanceForInputToken || balanceForInputToken === 0n; + const isAboveAllowance = amount.raw > allowanceFrom; if (txStatusApprove.pending || isAboveAllowance) { - if (allowanceFrom.gt(Zero) && toAddress(selectedOptionFrom.value) === CRV_TOKEN_ADDRESS) { + if (allowanceFrom > 0n && toAddress(selectedOptionFrom.value) === CRV_TOKEN_ADDRESS) { return ( ); } return ( <> -
- -

{'Supercharge your'}

-

{'yield with yCRV'}

-
-
-
- -

{'Swap any token within the yCRV ecosystem for any other. Maybe you want to swap for a higher yield, or maybe you just like swapping. It’s ok, we don’t judge.'}

-
-
-
@@ -154,10 +140,11 @@ function CardZap(): ReactElement { {'Amount'}
-
+
- -
+
@@ -244,38 +231,20 @@ function CardZap(): ReactElement { ); } -function CardZapWrapper(): ReactElement { - const {txStatusApprove, txStatusZap} = useCardTransactor(); - - return ( -
- - - - - -
- -
-
- ); -} - -function WithCardTransactor(): ReactElement { +function WithCardTransactor({className}: {className: string}): ReactElement { return ( - +
+
+

{'Supercharge your yield with yCRV'}

+
+
+

{'Swap any token within the yCRV ecosystem for any other. Maybe you want to swap for a higher yield, or maybe you just like swapping. It’s ok, we don’t judge.'}

+
+ +
); } diff --git a/apps/ycrv/components/Harvests.tsx b/apps/ycrv/components/Harvests.tsx index 87394dd58..fd2d7e87e 100644 --- a/apps/ycrv/components/Harvests.tsx +++ b/apps/ycrv/components/Harvests.tsx @@ -2,20 +2,19 @@ import React, {useMemo, useState} from 'react'; import {Button} from '@yearn-finance/web-lib/components/Button'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; import {LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {HarvestListHead} from '@yCRV/components/HarvestsListHead'; +import {HarvestListRow} from '@yCRV/components/HarvestsListRow'; import {useYCRV} from '@yCRV/contexts/useYCRV'; -import {HarvestListHead} from './HarvestsListHead'; -import {HarvestListRow} from './HarvestsListRow'; - import type {ReactElement} from 'react'; import type {TYDaemonHarvests} from '@common/types/yearn'; -function Harvests(): ReactElement { - const {harvests} = useYCRV(); - const [category, set_category] = useState('all'); +function Harvests(): ReactElement { + const {harvests} = useYCRV(); + const [category, set_category] = useState('all'); - const filteredHarvests = useMemo((): TYDaemonHarvests[] => { - const _harvests = [...(harvests || [])]; + const filteredHarvests = useMemo((): TYDaemonHarvests[] => { + const _harvests = [...(harvests || [])]; if (category === 'st-yCRV') { return _harvests.filter((harvest): boolean => toAddress(harvest.vaultAddress) === STYCRV_TOKEN_ADDRESS); } @@ -27,7 +26,7 @@ function Harvests(): ReactElement { return (
-
+

{'Harvests'}

diff --git a/apps/ycrv/components/HarvestsListHead.tsx b/apps/ycrv/components/HarvestsListHead.tsx index 03e04f88a..fc214a7a4 100644 --- a/apps/ycrv/components/HarvestsListHead.tsx +++ b/apps/ycrv/components/HarvestsListHead.tsx @@ -2,7 +2,7 @@ import React from 'react'; import type {ReactElement} from 'react'; -function HarvestListHead(): ReactElement { +function HarvestListHead(): ReactElement { return (
diff --git a/apps/ycrv/components/HarvestsListRow.tsx b/apps/ycrv/components/HarvestsListRow.tsx index 15dd08672..6142bcc9d 100755 --- a/apps/ycrv/components/HarvestsListRow.tsx +++ b/apps/ycrv/components/HarvestsListRow.tsx @@ -2,7 +2,7 @@ import React from 'react'; import IconLinkOut from '@yearn-finance/web-lib/icons/IconLinkOut'; import {toAddress, truncateHex} from '@yearn-finance/web-lib/utils/address'; import {STYCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {formatBN, formatToNormalizedValue} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount, formatUSD} from '@yearn-finance/web-lib/utils/format.number'; import {formatDate} from '@yearn-finance/web-lib/utils/format.time'; import {ImageWithFallback} from '@common/components/ImageWithFallback'; @@ -10,7 +10,7 @@ import {ImageWithFallback} from '@common/components/ImageWithFallback'; import type {ReactElement} from 'react'; import type {TYDaemonHarvests} from '@common/types/yearn'; -function HarvestListRow({harvest}: {harvest: TYDaemonHarvests}): ReactElement { +function HarvestListRow({harvest}: {harvest: TYDaemonHarvests}): ReactElement { return (
@@ -34,7 +34,7 @@ function HarvestListRow({harvest}: {harvest: TYDaemonHarvests}): ReactElement {

{'Gain'}

- {formatAmount(formatToNormalizedValue(formatBN(harvest.profit).sub(formatBN(harvest.loss)), 18))} + {formatAmount(formatToNormalizedValue(toBigInt(harvest.profit) - toBigInt(harvest.loss), 18))}
diff --git a/apps/ycrv/components/QuickActions.tsx b/apps/ycrv/components/QuickActions.tsx index 189c090b1..d5f1fafc0 100644 --- a/apps/ycrv/components/QuickActions.tsx +++ b/apps/ycrv/components/QuickActions.tsx @@ -5,8 +5,8 @@ import {Dropdown} from '@common/components/TokenDropdown'; import IconArrowRight from '@common/icons/IconArrowRight'; import type {ChangeEvent, ReactElement, ReactNode} from 'react'; -import type {TBalanceData} from '@yearn-finance/web-lib/hooks/types'; import type {TDict} from '@yearn-finance/web-lib/types'; +import type {TBalanceData} from '@yearn-finance/web-lib/types/hooks'; import type {TDropdownOption} from '@common/types/types'; export type TQASelect = { @@ -40,7 +40,7 @@ export type TQAButton = { function QASelect(props: TQASelect): ReactElement { const {label, legend, options, selected, balanceSource, onSelect} = props; - function renderMultipleOptionsFallback(): ReactElement { + function renderMultipleOptionsFallback(): ReactElement { return ( )}
-
+
{children} diff --git a/apps/ycrv/constants/menu.ts b/apps/ycrv/constants/menu.ts index a474116be..e54641b6d 100644 --- a/apps/ycrv/constants/menu.ts +++ b/apps/ycrv/constants/menu.ts @@ -1,5 +1,4 @@ export const YCRV_MENU = [ {path: '/ycrv', label: 'yCRV'}, - {path: '/ycrv/holdings', label: 'Holdings'}, {path: '/ycrv/about', label: 'About'} ]; diff --git a/apps/ycrv/constants/tokens.tsx b/apps/ycrv/constants/tokens.tsx index 42e38738f..27b2fc5de 100644 --- a/apps/ycrv/constants/tokens.tsx +++ b/apps/ycrv/constants/tokens.tsx @@ -1,11 +1,63 @@ import Image from 'next/image'; -import {YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {CRV_TOKEN_ADDRESS, CVXCRV_TOKEN_ADDRESS, LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS, YVBOOST_TOKEN_ADDRESS, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; + +import type {TDropdownOption} from '@common/types/types'; + +export const YVBOOST = { + label: 'yvBOOST', + symbol: 'yvBOOST', + decimals: 18, + value: YVBOOST_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'yvBOOST'} + ) +}; + +export const YVECRV = { + label: 'yveCRV', + symbol: 'yveCRV', + decimals: 18, + value: YVECRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'yveCRV'} + ) +}; + +export const STYCRV = { + label: 'st-yCRV', + symbol: 'st-yCRV', + decimals: 18, + value: STYCRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'st-yCRV'} + ) +}; export const YCRV = { label: 'yCRV', symbol: 'yCRV', decimals: 18, value: YCRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, icon: ( {'yCRV'} ) }; + +export const LPYCRV = { + label: 'lp-yCRV', + symbol: 'lp-yCRV', + decimals: 18, + value: LPYCRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'lp-yCRV'} + ) +}; + +export const CRV = { + label: 'CRV', + symbol: 'CRV', + decimals: 18, + value: CRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'CRV'} + ) +}; + +export const CVXCRV = { + label: 'cvxCRV', + symbol: 'cvxCRV', + decimals: 18, + value: CVXCRV_TOKEN_ADDRESS, + zapVia: ZAP_YEARN_VE_CRV_ADDRESS, + icon: ( + {'cvxCRV'} + ) +}; + +export const CRVYCRV = { + label: 'Curve CRV/yCRV', + symbol: 'CRV/yCRV', + decimals: 18, + value: YCRV_CURVE_POOL_ADDRESS, + zapVia: LPYCRV_TOKEN_ADDRESS, + icon: ( + {'Curve + ) +}; + +export const LEGACY_OPTIONS_FROM: TDropdownOption[] = [YVBOOST, YVECRV]; +export const LEGACY_OPTIONS_TO: TDropdownOption[] = [STYCRV, YCRV, LPYCRV]; +export const ZAP_OPTIONS_FROM: TDropdownOption[] = [ + CRV, + ...LEGACY_OPTIONS_TO, + CVXCRV, + CRVYCRV, + ...LEGACY_OPTIONS_FROM +]; +export const ZAP_OPTIONS_TO: TDropdownOption[] = [...LEGACY_OPTIONS_TO]; diff --git a/apps/ycrv/contexts/useAllowanceHook.tsx b/apps/ycrv/contexts/useAllowanceHook.tsx new file mode 100644 index 000000000..67cf85d83 --- /dev/null +++ b/apps/ycrv/contexts/useAllowanceHook.tsx @@ -0,0 +1,58 @@ +// We need the following line so that Next.js actually refetch the data a fast +// refresh is done. Cf https://nextjs.org/docs/architecture/fast-refresh#tips +// @refresh reset + +import {useMemo} from 'react'; +import {erc20ABI, useContractReads} from 'wagmi'; +import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; +import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; +import {CRV_TOKEN_ADDRESS, CVXCRV_TOKEN_ADDRESS, LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS, YVBOOST_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt} from '@yearn-finance/web-lib/utils/decoder'; + +import type {TAddress, TDict} from '@yearn-finance/web-lib/types'; + +/* 🔵 - Yearn Finance ********************************************************** +** This context controls the allowances computation for the yCRV app +******************************************************************************/ +export function useAllowances(): TDict { + const {address} = useWeb3(); + const wagmiAddress = useMemo((): TAddress => toAddress(address), [address]); + const zapAddress = useMemo((): TAddress => ZAP_YEARN_VE_CRV_ADDRESS, []); + const poolAddress = useMemo((): TAddress => YVECRV_POOL_LP_ADDRESS, []); + const lpyCRVAddress = useMemo((): TAddress => LPYCRV_TOKEN_ADDRESS, []); + const {data, status} = useContractReads({ + contracts: [ + {address: YCRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: STYCRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: LPYCRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: YVECRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: CRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: YVBOOST_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: YCRV_CURVE_POOL_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: CVXCRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, zapAddress]}, + {address: YVECRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, poolAddress]}, + {address: CRV_TOKEN_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, poolAddress]}, + {address: YCRV_CURVE_POOL_ADDRESS, abi: erc20ABI, functionName: 'allowance', args: [wagmiAddress, lpyCRVAddress]} + ] + }); + + return useMemo((): TDict => { + if (!data || status !== 'success') { + return {}; + } + return { + [allowanceKey(1, YCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[0]), + [allowanceKey(1, STYCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[1]), + [allowanceKey(1, LPYCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[2]), + [allowanceKey(1, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[3]), + [allowanceKey(1, CRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[4]), + [allowanceKey(1, YVBOOST_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[5]), + [allowanceKey(1, YCRV_CURVE_POOL_ADDRESS, LPYCRV_TOKEN_ADDRESS, toAddress(address))]: decodeAsBigInt(data[6]), + [allowanceKey(1, CVXCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(address))]: decodeAsBigInt(data[7]), + [allowanceKey(1, YVECRV_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, toAddress(address))]: decodeAsBigInt(data[8]), + [allowanceKey(1, CRV_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, toAddress(address))]: decodeAsBigInt(data[9]), + [allowanceKey(1, YCRV_CURVE_POOL_ADDRESS, LPYCRV_TOKEN_ADDRESS, toAddress(address))]: decodeAsBigInt(data[10]) + }; + }, [data, status, address]); +} + diff --git a/apps/ycrv/contexts/useHoldingsHook.tsx b/apps/ycrv/contexts/useHoldingsHook.tsx new file mode 100644 index 000000000..346788769 --- /dev/null +++ b/apps/ycrv/contexts/useHoldingsHook.tsx @@ -0,0 +1,88 @@ +// We need the following line so that Next.js actually refetch the data a fast +// refresh is done. Cf https://nextjs.org/docs/architecture/fast-refresh#tips +// @refresh reset + +import {useMemo} from 'react'; +import {parseEther} from 'viem'; +import {useContractReads} from 'wagmi'; +import {LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, VECRV_ADDRESS, VECRV_YEARN_TREASURY_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS, YVECRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBigInt} from '@yearn-finance/web-lib/utils/decoder'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import CURVE_CRV_YCRV_LP_ABI from '@yCRV/utils/abi/curveCrvYCrvLp.abi'; +import STYCRV_ABI from '@yCRV/utils/abi/styCRV.abi'; +import YVECRV_ABI from '@yCRV/utils/abi/yveCRV.abi'; + +export type TCRVHoldings = { + legacy: bigint; + treasury: bigint; + yCRVSupply: bigint; + styCRVSupply: bigint; + lpyCRVSupply: bigint; + crvYCRVPeg: bigint; + boostMultiplier: bigint; + veCRVTotalSupply: bigint; + veCRVBalance: bigint; +} + +export const defaultHoldings = { + legacy: 0n, + treasury: 0n, + yCRVSupply: 0n, + styCRVSupply: 0n, + lpyCRVSupply: 0n, + crvYCRVPeg: 0n, + boostMultiplier: 0n, + veCRVTotalSupply: 0n, + veCRVBalance: 0n +}; + +/* 🔵 - Yearn Finance ********************************************************** +** This context controls the Holdings computation. +******************************************************************************/ +export function useHoldings(): TCRVHoldings { + const yCRVContract = {address: YCRV_TOKEN_ADDRESS, abi: YVECRV_ABI}; + const styCRVContract = {address: STYCRV_TOKEN_ADDRESS, abi: STYCRV_ABI}; + const lpyCRVContract = {address: LPYCRV_TOKEN_ADDRESS, abi: YVECRV_ABI}; + const yveCRVContract = {address: YVECRV_TOKEN_ADDRESS, abi: YVECRV_ABI}; + const veEscrowContract = {address: VECRV_ADDRESS, abi: YVECRV_ABI}; + const crvYCRVLpContract = {address: YCRV_CURVE_POOL_ADDRESS, abi: CURVE_CRV_YCRV_LP_ABI}; + + const {data, status} = useContractReads({ + contracts: [ + {...yveCRVContract, functionName: 'totalSupply'}, + {...yveCRVContract, functionName: 'balanceOf', args: [YCRV_TOKEN_ADDRESS]}, + {...veEscrowContract, functionName: 'balanceOf', args: [VECRV_YEARN_TREASURY_ADDRESS]}, + {...veEscrowContract, functionName: 'totalSupply'}, + {...yCRVContract, functionName: 'totalSupply'}, + {...styCRVContract, functionName: 'totalAssets'}, + {...lpyCRVContract, functionName: 'totalSupply'}, + {...crvYCRVLpContract, functionName: 'get_dy', args: [1n, 0n, parseEther('1')]} + ] + }); + + return useMemo((): TCRVHoldings => { + if (!data || status !== 'success') { + return defaultHoldings; + } + const yveCRVTotalSupply = decodeAsBigInt(data[0]); + const yveCRVInYCRV = decodeAsBigInt(data[1]); + const veCRVBalance = decodeAsBigInt(data[2]); //used for "Yearn Has" section + const veCRVTotalSupply = decodeAsBigInt(data[3]); + const yCRVTotalSupply = decodeAsBigInt(data[4]); + const styCRVTotalSupply = decodeAsBigInt(data[5]); + const lpyCRVTotalSupply = decodeAsBigInt(data[6]); + const crvYCRVPeg = decodeAsBigInt(data[7]); + return ({ + legacy: yveCRVTotalSupply - yveCRVInYCRV, + treasury: veCRVBalance - ((yveCRVTotalSupply - yveCRVInYCRV) - yCRVTotalSupply), + yCRVSupply: yCRVTotalSupply, + styCRVSupply: styCRVTotalSupply, + lpyCRVSupply: lpyCRVTotalSupply, + crvYCRVPeg: crvYCRVPeg, + boostMultiplier: veCRVBalance * (toBigInt(1e4) / styCRVTotalSupply), + veCRVTotalSupply: veCRVTotalSupply, + veCRVBalance: veCRVBalance + }); + }, [data, status]); +} + diff --git a/apps/ycrv/contexts/useYCRV.tsx b/apps/ycrv/contexts/useYCRV.tsx index 296f6dcbe..1af25e3d5 100755 --- a/apps/ycrv/contexts/useYCRV.tsx +++ b/apps/ycrv/contexts/useYCRV.tsx @@ -1,233 +1,91 @@ -import React, {createContext, useCallback, useContext, useMemo, useState} from 'react'; -import {Contract} from 'ethcall'; -import {ethers} from 'ethers'; +import React, {createContext, useContext, useMemo, useState} from 'react'; +import {formatUnits} from 'viem'; import useSWR from 'swr'; import {useSettings} from '@yearn-finance/web-lib/contexts/useSettings'; -import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; -import ERC20_ABI from '@yearn-finance/web-lib/utils/abi/erc20.abi'; -import {allowanceKey, toAddress} from '@yearn-finance/web-lib/utils/address'; -import {CRV_TOKEN_ADDRESS, CVXCRV_TOKEN_ADDRESS, LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, VECRV_ADDRESS, VECRV_YEARN_TREASURY_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS, YVBOOST_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; import {baseFetcher} from '@yearn-finance/web-lib/utils/fetchers'; -import {formatUnits, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; -import {getProvider, newEthCallProvider} from '@yearn-finance/web-lib/utils/web3/providers'; -import CURVE_CRV_YCRV_LP_ABI from '@yCRV/utils/abi/curveCrvYCrvLp.abi'; -import STYCRV_ABI from '@yCRV/utils/abi/styCRV.abi'; -import YVECRV_ABI from '@yCRV/utils/abi/yveCRV.abi'; +import {useAllowances} from '@yCRV/contexts/useAllowanceHook'; +import {defaultHoldings, useHoldings} from '@yCRV/contexts/useHoldingsHook'; -import type {BigNumber} from 'ethers'; import type {ReactElement} from 'react'; import type {SWRResponse} from 'swr'; +import type {TCRVHoldings} from '@yCRV/contexts/useHoldingsHook'; import type {TDict} from '@yearn-finance/web-lib/types'; import type {TYDaemonVault} from '@common/schemas/yDaemonVaultsSchemas'; import type {TYDaemonHarvests} from '@common/types/yearn'; -type THoldings = { - legacy: BigNumber; - treasury: BigNumber; - yCRVSupply: BigNumber; - styCRVSupply: BigNumber; - lpyCRVSupply: BigNumber; - crvYCRVPeg: BigNumber; - boostMultiplier: BigNumber; - veCRVTotalSupply: BigNumber; - veCRVBalance: BigNumber; -} type TYCRVContext = { styCRVMegaBoost: number, styCRVAPY: number, slippage: number, - allowances: TDict, - holdings: THoldings, + allowances: TDict, + holdings: TCRVHoldings, harvests: TYDaemonHarvests[], set_slippage: (slippage: number) => void, } -const defaultProps = { +const defaultProps = { styCRVMegaBoost: 0, styCRVAPY: 0, harvests: [], allowances: {}, slippage: 0.6, set_slippage: (): void => undefined, - holdings: { - legacy: Zero, - treasury: Zero, - yCRVSupply: Zero, - styCRVSupply: Zero, - lpyCRVSupply: Zero, - crvYCRVPeg: Zero, - boostMultiplier: Zero, - veCRVTotalSupply: Zero, - veCRVBalance: Zero - } + holdings: defaultHoldings }; /* 🔵 - Yearn Finance ********************************************************** ** This context controls the Holdings computation. ******************************************************************************/ -const YCRVContext = createContext(defaultProps); +const YCRVContext = createContext(defaultProps); export const YCRVContextApp = ({children}: {children: ReactElement}): ReactElement => { - const {provider, address, isActive} = useWeb3(); const {settings: baseAPISettings} = useSettings(); const [slippage, set_slippage] = useState(0.6); + const holdings = useHoldings(); + const allowances = useAllowances(); - // const {data: styCRVExperimentalAPY} = useSWR( - // `${baseAPISettings.yDaemonBaseURI}/1/vaults/apy/${STYCRV_TOKEN_ADDRESS}`, - // baseFetcher, - // {revalidateOnFocus: false} - // ) as SWRResponse; - - const {data: styCRVVault} = useSWR( + const {data: styCRVVault} = useSWR( `${baseAPISettings.yDaemonBaseURI || process.env.YDAEMON_BASE_URI}/1/vaults/${STYCRV_TOKEN_ADDRESS}`, baseFetcher, {revalidateOnFocus: false} ); - - const {data: yCRVHarvests} = useSWR( + const {data: yCRVHarvests} = useSWR( `${baseAPISettings.yDaemonBaseURI || process.env.YDAEMON_BASE_URI}/1/vaults/harvests/${STYCRV_TOKEN_ADDRESS},${LPYCRV_TOKEN_ADDRESS}`, baseFetcher, {revalidateOnFocus: false} ) as SWRResponse; - /* 🔵 - Yearn Finance ****************************************************** - ** SWR hook to get the holdings data for the yCRV ecosystem. - **************************************************************************/ - const numbersFetchers = useCallback(async (): Promise> => { - const currentProvider = provider || getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - - const yCRVContract = new Contract(YCRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const styCRVContract = new Contract(STYCRV_TOKEN_ADDRESS as string, STYCRV_ABI); - const lpyCRVContract = new Contract(LPYCRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const yveCRVContract = new Contract(YVECRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const veEscrowContract = new Contract(VECRV_ADDRESS as string, YVECRV_ABI); - const crvYCRVLpContract = new Contract(YCRV_CURVE_POOL_ADDRESS as string, CURVE_CRV_YCRV_LP_ABI); - - const [ - yveCRVTotalSupply, - yveCRVInYCRV, - veCRVBalance, - veCRVTotalSupply, - yCRVTotalSupply, - styCRVTotalSupply, - lpyCRVTotalSupply, - crvYCRVPeg - ] = await ethcallProvider.tryAll([ - yveCRVContract.totalSupply(), - yveCRVContract.balanceOf(YCRV_TOKEN_ADDRESS), - veEscrowContract.balanceOf(VECRV_YEARN_TREASURY_ADDRESS), - veEscrowContract.totalSupply(), - yCRVContract.totalSupply(), - styCRVContract.totalAssets(), - lpyCRVContract.totalSupply(), - crvYCRVLpContract.get_dy(1, 0, ethers.constants.WeiPerEther) - ]) as [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber]; - - return ({ - ['legacy']: yveCRVTotalSupply.sub(yveCRVInYCRV), - ['treasury']: veCRVBalance.sub(yveCRVTotalSupply.sub(yveCRVInYCRV)).sub(yCRVTotalSupply), - ['yCRVSupply']: yCRVTotalSupply, - ['styCRVSupply']: styCRVTotalSupply, - ['lpyCRVSupply']: lpyCRVTotalSupply, - ['crvYCRVPeg']: crvYCRVPeg, - ['boostMultiplier']: veCRVBalance.mul(1e4).div(styCRVTotalSupply), - ['veCRVTotalSupply']: veCRVTotalSupply, - ['veCRVBalance']: veCRVBalance - }); - }, [provider]); - const {data: holdings} = useSWR('numbers', numbersFetchers, {shouldRetryOnError: false}); - - - /* 🔵 - Yearn Finance ****************************************************** - ** Once the wallet is connected and a provider is available, we can fetch - ** the allowance informations for a specific wallet. As the possible path - ** are limited, we can hardcode the contract addresses. - ***************************************************************************/ - const getAllowances = useCallback(async (): Promise> => { - if (!isActive || !provider) { - return {}; - } - const currentProvider = provider || getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const userAddress = address; - const yCRVContract = new Contract(YCRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const styCRVContract = new Contract(STYCRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const lpyCRVContract = new Contract(LPYCRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const yveCRVContract = new Contract(YVECRV_TOKEN_ADDRESS as string, YVECRV_ABI); - const crvContract = new Contract(CRV_TOKEN_ADDRESS as string, ERC20_ABI); - const yvBoostContract = new Contract(YVBOOST_TOKEN_ADDRESS as string, ERC20_ABI); - const yCRVPoolContract = new Contract(YCRV_CURVE_POOL_ADDRESS as string, YVECRV_ABI); - const cvxCRVContract = new Contract(CVXCRV_TOKEN_ADDRESS as string, ERC20_ABI); - - const [ - yCRVAllowanceZap, styCRVAllowanceZap, lpyCRVAllowanceZap, - yveCRVAllowanceZap, crvAllowanceZap, yvBoostAllowanceZap, - cvxCRVAllowanceZap, - yveCRVAllowanceLP, crvAllowanceLP, - yCRVPoolAllowanceVault - ] = await ethcallProvider.tryAll([ - yCRVContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - styCRVContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - lpyCRVContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - yveCRVContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - crvContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - yvBoostContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - cvxCRVContract.allowance(userAddress, ZAP_YEARN_VE_CRV_ADDRESS), - yveCRVContract.allowance(userAddress, YVECRV_POOL_LP_ADDRESS), - crvContract.allowance(userAddress, YVECRV_POOL_LP_ADDRESS), - yCRVPoolContract.allowance(userAddress, LPYCRV_TOKEN_ADDRESS) - ]) as BigNumber[]; - - return ({ - // YCRV ECOSYSTEM - [allowanceKey(1, YCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: yCRVAllowanceZap, - [allowanceKey(1, STYCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: styCRVAllowanceZap, - [allowanceKey(1, LPYCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: lpyCRVAllowanceZap, - [allowanceKey(1, CVXCRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: cvxCRVAllowanceZap, - [allowanceKey(1, YCRV_CURVE_POOL_ADDRESS, LPYCRV_TOKEN_ADDRESS, toAddress(userAddress))]: yCRVPoolAllowanceVault, - // CRV ECOSYSTEM - [allowanceKey(1, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: yveCRVAllowanceZap, - [allowanceKey(1, CRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: crvAllowanceZap, - [allowanceKey(1, YVBOOST_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS, toAddress(userAddress))]: yvBoostAllowanceZap, - [allowanceKey(1, YVECRV_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, toAddress(userAddress))]: yveCRVAllowanceLP, - [allowanceKey(1, CRV_TOKEN_ADDRESS, YVECRV_POOL_LP_ADDRESS, toAddress(userAddress))]: crvAllowanceLP - }); - }, [provider, address, isActive]); - const {data: allowances} = useSWR(isActive && provider ? 'allowances' : null, getAllowances, {shouldRetryOnError: false}); - /* 🔵 - Yearn Finance ****************************************************** ** Compute the mega boost for the staked yCRV. This boost come from the ** donator, with 30_000 per week. **************************************************************************/ - const styCRVMegaBoost = useMemo((): number => { - if (!holdings || holdings.styCRVSupply === Zero) { + const styCRVMegaBoost = useMemo((): number => { + if (!holdings || holdings.styCRVSupply === 0n) { return 0; } - const fromDonatorPerWeek = 30_000; - const fromDonatorPerYear = fromDonatorPerWeek * 52; - const fromDonatorPerYearScaled = fromDonatorPerYear * 0.9; - const humanizedStyCRVSupply = Number(formatUnits(holdings.styCRVSupply, 18)); - const megaBoostAPR = fromDonatorPerYearScaled / humanizedStyCRVSupply; + const fromDonatorPerWeek = 30_000; + const fromDonatorPerYear = fromDonatorPerWeek * 52; + const fromDonatorPerYearScaled = fromDonatorPerYear * 0.9; + const humanizedStyCRVSupply = Number(formatUnits(holdings.styCRVSupply, 18)); + const megaBoostAPR = fromDonatorPerYearScaled / humanizedStyCRVSupply; return megaBoostAPR; }, [holdings]); /* 🔵 - Yearn Finance ****************************************************** ** Compute the styCRV APY based on the experimental APY and the mega boost. **************************************************************************/ - const styCRVAPY = useMemo((): number => { + const styCRVAPY = useMemo((): number => { return ((styCRVVault?.apy?.net_apy || 0) * 100); - // return ((styCRVVault?.apy?.net_apy || 0) * 100) + (styCRVMegaBoost * 100); - // return (styCRVExperimentalAPY * 100) + (styCRVMegaBoost * 100); }, [styCRVVault]); /* 🔵 - Yearn Finance ****************************************************** ** Setup and render the Context provider to use in the app. ***************************************************************************/ - const contextValue = useMemo((): TYCRVContext => ({ + const contextValue = useMemo((): TYCRVContext => ({ harvests: yCRVHarvests, - holdings: holdings as THoldings, - allowances: allowances as TDict, + holdings: holdings, + allowances: allowances, styCRVAPY, styCRVMegaBoost, slippage, diff --git a/apps/ycrv/utils/abi/curveCrvYCrvLp.abi.tsx b/apps/ycrv/utils/abi/curveCrvYCrvLp.abi.ts similarity index 100% rename from apps/ycrv/utils/abi/curveCrvYCrvLp.abi.tsx rename to apps/ycrv/utils/abi/curveCrvYCrvLp.abi.ts diff --git a/apps/ycrv/utils/abi/styCRV.abi.tsx b/apps/ycrv/utils/abi/styCRV.abi.ts similarity index 100% rename from apps/ycrv/utils/abi/styCRV.abi.tsx rename to apps/ycrv/utils/abi/styCRV.abi.ts diff --git a/apps/ycrv/utils/abi/yveCRV.abi.tsx b/apps/ycrv/utils/abi/yveCRV.abi.ts similarity index 100% rename from apps/ycrv/utils/abi/yveCRV.abi.tsx rename to apps/ycrv/utils/abi/yveCRV.abi.ts diff --git a/apps/ycrv/utils/abi/zapCRV.abi.ts b/apps/ycrv/utils/abi/zapCRV.abi.ts new file mode 100644 index 000000000..77d29f30f --- /dev/null +++ b/apps/ycrv/utils/abi/zapCRV.abi.ts @@ -0,0 +1,3 @@ +const ZAP_CRV_ABI = [{'name':'UpdateSweepRecipient', 'inputs':[{'name':'sweep_recipient', 'type':'address', 'indexed':true}], 'anonymous':false, 'type':'event'}, {'name':'UpdateMintBuffer', 'inputs':[{'name':'mint_buffer', 'type':'uint256', 'indexed':false}], 'anonymous':false, 'type':'event'}, {'stateMutability':'nonpayable', 'type':'constructor', 'inputs':[], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'zap', 'inputs':[{'name':'_input_token', 'type':'address'}, {'name':'_output_token', 'type':'address'}, {'name':'_amount_in', 'type':'uint256'}, {'name':'_min_out', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'set_sweep_recipient', 'inputs':[{'name':'_proposed_sweep_recipient', 'type':'address'}], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'relative_price', 'inputs':[{'name':'_input_token', 'type':'address'}, {'name':'_output_token', 'type':'address'}, {'name':'_amount_in', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'calc_expected_out', 'inputs':[{'name':'_input_token', 'type':'address'}, {'name':'_output_token', 'type':'address'}, {'name':'_amount_in', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'sweep', 'inputs':[{'name':'_token', 'type':'address'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'sweep', 'inputs':[{'name':'_token', 'type':'address'}, {'name':'_amount', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'nonpayable', 'type':'function', 'name':'set_mint_buffer', 'inputs':[{'name':'_new_buffer', 'type':'uint256'}], 'outputs':[]}, {'stateMutability':'view', 'type':'function', 'name':'name', 'inputs':[], 'outputs':[{'name':'', 'type':'string'}]}, {'stateMutability':'view', 'type':'function', 'name':'sweep_recipient', 'inputs':[], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'mint_buffer', 'inputs':[], 'outputs':[{'name':'', 'type':'uint256'}]}, {'stateMutability':'view', 'type':'function', 'name':'legacy_tokens', 'inputs':[{'name':'arg0', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'address'}]}, {'stateMutability':'view', 'type':'function', 'name':'output_tokens', 'inputs':[{'name':'arg0', 'type':'uint256'}], 'outputs':[{'name':'', 'type':'address'}]}] as const; + +export default ZAP_CRV_ABI; diff --git a/apps/ycrv/utils/actions.ts b/apps/ycrv/utils/actions.ts index 49caa5784..7f9dfb55f 100644 --- a/apps/ycrv/utils/actions.ts +++ b/apps/ycrv/utils/actions.ts @@ -1,27 +1,42 @@ -import {ethers} from 'ethers'; import {ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {handleTx} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {assert} from '@common/utils/assert'; +import {assertAddress, handleTx} from '@common/utils/toWagmiProvider'; +import ZAP_CRV_ABI from '@yCRV/utils/abi/zapCRV.abi'; -import type {BigNumber} from 'ethers'; +import type {TAddress} from '@yearn-finance/web-lib/types'; import type {TTxResponse} from '@yearn-finance/web-lib/utils/web3/transaction'; +import type {TWriteTransaction} from '@common/utils/toWagmiProvider'; +/* 🔵 - Yearn Finance ********************************************************** +** zapCRV is a _WRITE_ function that can be used to zap some supported tokens +** from the Curve ecosystem into one of the Yearn's yCRV ecosystem. +** +** @app - yCRV +** @param inputToken - Token to be zapped from curve +** @param outputToken - Token to be zapped into Yearn's yCRV ecosystem +** @param amount - Amount of inputToken to be zapped +** @param minAmount - Minimum amount of outputToken to be received +** @param slippage - Slippage tolerance +******************************************************************************/ +type TZapYCRV = TWriteTransaction & { + inputToken: TAddress | undefined; + outputToken: TAddress | undefined; + amount: bigint; + minAmount: bigint; + slippage: bigint; +}; +export async function zapCRV(props: TZapYCRV): Promise { + const minAmountWithSlippage = props.minAmount * (1n - (props.slippage / 100n)); + assertAddress(ZAP_YEARN_VE_CRV_ADDRESS, 'ZAP_YEARN_VE_CRV_ADDRESS'); + assertAddress(props.inputToken, 'inputToken'); + assertAddress(props.outputToken, 'outputToken'); + assert(props.amount > 0n, 'Amount must be greater than 0'); + assert(props.amount >= minAmountWithSlippage, 'Amount must be greater or equal to min amount with slippage'); -export async function zap( - provider: ethers.providers.JsonRpcProvider, - inputToken: string, - outputToken: string, - amount: BigNumber, - minAmount: BigNumber, - slippage: number -): Promise { - const signer = provider.getSigner(); - const address = await signer.getAddress(); - const contract = new ethers.Contract( - ZAP_YEARN_VE_CRV_ADDRESS, - ['function zap(address _input, address _output, uint256 _amount, uint256 _minOut, address _recipient) external returns (uint256)'], - signer - ); - const minAmountStr = Number(ethers.utils.formatUnits(minAmount, 18)); - const minAmountWithSlippage = ethers.utils.parseUnits((minAmountStr * (1 - (slippage / 100))).toFixed(18), 18); - return await handleTx(contract.zap(inputToken, outputToken, amount, minAmountWithSlippage, address)); + return await handleTx(props, { + address: ZAP_YEARN_VE_CRV_ADDRESS, + abi: ZAP_CRV_ABI, + functionName: 'zap', + args: [props.inputToken, props.outputToken, props.amount, minAmountWithSlippage] + }); } diff --git a/apps/ycrv/utils/animations.tsx b/apps/ycrv/utils/animations.tsx deleted file mode 100755 index 44dade702..000000000 --- a/apps/ycrv/utils/animations.tsx +++ /dev/null @@ -1,39 +0,0 @@ -export const CardVariantsInner = { - rest: (isFocused: boolean): unknown => ({ - width: isFocused ? 592 : 560, - height: isFocused ? 733 : 701, - padding: isFocused ? '64px' : '48px', - boxShadow: isFocused ? '0px 4px 28px 0px hsla(0, 0%, 0%, 0.25)' : '0px 0px 0px 0px hsla(0, 0%, 0%, 0)', - transition: { - duration: 0.6, - ease: [0.7, -0.4, 0.4, 1.4] - } - }), - hover: { - width: 592, - height: 733, - padding: '64px', - boxShadow: '0px 4px 28px 0px hsla(0, 0%, 0%, 0.25)', - transition: { - duration: 0.6, - ease: [0.7, -0.4, 0.4, 1.4] - } - } -}; - -export const CardVariants = { - rest: { - width: 592, - transition: { - duration: 0.6, - ease: [0.7, -0.4, 0.4, 1.4] - } - }, - hover: { - width: 592, - transition: { - duration: 0.6, - ease: [0.7, -0.4, 0.4, 1.4] - } - } -}; diff --git a/apps/ycrv/utils/zapOptions.tsx b/apps/ycrv/utils/zapOptions.tsx deleted file mode 100755 index 9cc8f402b..000000000 --- a/apps/ycrv/utils/zapOptions.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React from 'react'; -import Image from 'next/image'; -import {CRV_TOKEN_ADDRESS, CVXCRV_TOKEN_ADDRESS, LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, YCRV_CURVE_POOL_ADDRESS, YCRV_TOKEN_ADDRESS, YVBOOST_TOKEN_ADDRESS, YVECRV_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; - -import type {TDropdownOption} from '@common/types/types'; - -const LEGACY_OPTIONS_FROM: TDropdownOption[] = [ - { - label: 'yvBOOST', - symbol: 'yvBOOST', - decimals: 18, - value: YVBOOST_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'yvBOOST'} - ) - }, { - label: 'yveCRV', - symbol: 'yveCRV', - decimals: 18, - value: YVECRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'yveCRV'} - ) - } -]; - -const LEGACY_OPTIONS_TO: TDropdownOption[] = [ - { - label: 'st-yCRV', - symbol: 'st-yCRV', - decimals: 18, - value: STYCRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'st-yCRV'} - ) - }, { - label: 'yCRV', - symbol: 'yCRV', - decimals: 18, - value: YCRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'yCRV'} - ) - }, - { - label: 'lp-yCRV', - symbol: 'lp-yCRV', - decimals: 18, - value: LPYCRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'lp-yCRV'} - ) - } -]; - -const ZAP_OPTIONS_FROM: TDropdownOption[] = [ - { - label: 'CRV', - symbol: 'CRV', - decimals: 18, - value: CRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'CRV'} - ) - }, - ...LEGACY_OPTIONS_TO, - { - label: 'cvxCRV', - symbol: 'cvxCRV', - decimals: 18, - value: CVXCRV_TOKEN_ADDRESS, - zapVia: ZAP_YEARN_VE_CRV_ADDRESS, - icon: ( - {'cvxCRV'} - ) - }, - { - label: 'Curve CRV/yCRV', - symbol: 'CRV/yCRV', - decimals: 18, - value: YCRV_CURVE_POOL_ADDRESS, - zapVia: LPYCRV_TOKEN_ADDRESS, - icon: ( - {'Curve - ) - }, - ...LEGACY_OPTIONS_FROM -]; - -const ZAP_OPTIONS_TO: TDropdownOption[] = [...LEGACY_OPTIONS_TO]; - -export { - LEGACY_OPTIONS_FROM, - LEGACY_OPTIONS_TO, - ZAP_OPTIONS_FROM, - ZAP_OPTIONS_TO -}; diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 611ca5b73..000000000 --- a/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - moduleNameMapper: { - '@vaults/(.*)': ['/apps/vaults/$1'] - } -}; diff --git a/next.config.js b/next.config.js index 16b6dc36b..181be8ab4 100755 --- a/next.config.js +++ b/next.config.js @@ -17,7 +17,8 @@ module.exports = withTM(withBundleAnalyzer(withPWA({ domains: [ 'rawcdn.githack.com', 'raw.githubusercontent.com', - 'placehold.co' + 'placehold.co', + 'assets.smold.app' ] }, async rewrites() { @@ -111,41 +112,43 @@ module.exports = withTM(withBundleAnalyzer(withPWA({ // YDAEMON_BASE_URI: 'https://ydaemon-dev.yearn.finance', // YDAEMON_BASE_URI: 'https://api.ycorpo.com', // YDAEMON_BASE_URI: 'http://localhost:8080', - BASE_YEARN_ASSETS_URI: 'https://raw.githubusercontent.com/yearn/yearn-assets/master/icons/multichain-tokens/' + BASE_YEARN_ASSETS_URI: 'https://assets.smold.app/api/token/' } }))); -const {withSentryConfig} = require('@sentry/nextjs'); -module.exports = withSentryConfig( - module.exports, - { +if (process.env.NODE_ENV === 'production') { + const {withSentryConfig} = require('@sentry/nextjs'); + module.exports = withSentryConfig( + module.exports, + { // For all available options, see: // https://github.com/getsentry/sentry-webpack-plugin#options - // Suppresses source map uploading logs during build - silent: true, + // Suppresses source map uploading logs during build + silent: true, - org: 'xopowo-team', - project: 'yearn-fi' - }, - { + org: 'xopowo-team', + project: 'yearn-fi' + }, + { // For all available options, see: // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ - // Upload a larger set of source maps for prettier stack traces (increases build time) - widenClientFileUpload: true, + // Upload a larger set of source maps for prettier stack traces (increases build time) + widenClientFileUpload: true, - // Transpiles SDK to be compatible with IE11 (increases bundle size) - transpileClientSDK: true, + // Transpiles SDK to be compatible with IE11 (increases bundle size) + transpileClientSDK: true, - // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load) - tunnelRoute: '/monitoring', + // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load) + tunnelRoute: '/monitoring', - // Hides source maps from generated client bundles - hideSourceMaps: true, + // Hides source maps from generated client bundles + hideSourceMaps: true, - // Automatically tree-shake Sentry logger statements to reduce bundle size - disableLogger: true - } -); + // Automatically tree-shake Sentry logger statements to reduce bundle size + disableLogger: true + } + ); +} diff --git a/package.json b/package.json index 411cbe5b9..fa84168ae 100644 --- a/package.json +++ b/package.json @@ -2,86 +2,85 @@ "name": "yearnfi", "version": "0.1.23", "scripts": { - "dev": "NODE_OPTIONS='--inspect' next", + "dev": "next", + "inspect": "NODE_OPTIONS='--inspect' next", "dev:ts": "tsc --watch", "start": "tsc && next build && next start", "build": "tsc && next build", "export": "tsc && next build && next export -o ipfs", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "bump": "bump", - "test": "jest" + "test": "vitest run" }, "dependencies": { - "@gnosis.pm/gp-v2-contracts": "^1.1.2", + "@cowprotocol/cow-sdk": "^2.1.0", "@headlessui/react": "^1.7.14", - "@next/bundle-analyzer": "^13.1.1", - "@next/font": "^13.1.1", + "@next/bundle-analyzer": "^13.4.4", + "@next/font": "^13.4.4", + "@popperjs/core": "^2.11.8", "@react-hookz/deep-equal": "^1.0.4", - "@sentry/nextjs": "^7.52.1", + "@sentry/nextjs": "^7.53.1", "@wagmi/core": "^1.0.8", - "@yearn-finance/web-lib": "^0.20.39", - "axios": "^1.2.2", + "@yearn-finance/web-lib": "^0.20.48", + "axios": "^1.4.0", "dayjs": "^1.11.7", "formidable": "^2.1.1", - "framer-motion": "^8.0.4", + "framer-motion": "^10.12.16", "graphql": "^16.6.0", - "graphql-request": "^5.1.0", + "graphql-request": "^6.1.0", "html2canvas": "^1.4.1", - "jest": "^29.5.0", - "next": "^13.1.1", + "next": "^13.4.4", "next-pwa": "^5.6.0", - "next-seo": "^5.15.0", + "next-seo": "^6.0.0", "nprogress": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-paginate": "^8.1.4", + "react-paginate": "^8.2.0", "react-popper": "^2.3.0", - "react-wrap-balancer": "^0.2.4", - "recharts": "^2.2.0", - "swr": "^2.0.0", - "tailwindcss": "^3.2.4", + "react-wrap-balancer": "^0.5.0", + "recharts": "^2.6.2", + "swr": "^2.1.5", + "tailwindcss": "^3.3.2", "telegraf": "^4.12.2", - "viem": "^0.3.37", - "wagmi": "^1.0.8", - "wido": "^0.2.0", + "viem": "^0.3.41", + "wagmi": "^1.0.9", + "wido": "^0.2.8", "zod": "^3.21.4" }, "devDependencies": { "@testing-library/react": "^14.0.0", - "@types/jest": "^29.5.1", - "@types/node": "^18.11.18", + "@types/node": "^20.2.5", "@types/nprogress": "^0.2.0", - "@types/react": "^18.0.26", - "@types/react-dom": "^18.0.10", - "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.47.1", - "autoprefixer": "^10.4.13", - "babel-loader": "^9.1.0", + "@types/react": "^18.2.7", + "@types/react-dom": "^18.2.4", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", + "@vitejs/plugin-react": "^4.0.0", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.2", "bump": "^0.2.5", - "eslint": "8.31.0", - "eslint-config-next": "^13.1.1", - "eslint-import-resolver-typescript": "^3.5.3", + "eslint": "8.41.0", + "eslint-config-next": "^13.4.4", + "eslint-import-resolver-typescript": "^3.5.5", "eslint-plugin-brackets": "^0.1.3", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-react": "^7.32.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-simple-import-sort": "^8.0.0", - "eslint-plugin-tailwindcss": "^3.8.0", + "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-tailwindcss": "^3.12.1", "eslint-plugin-unused-imports": "^2.0.0", "next-transpile-modules": "^10.0.0", - "postcss": "^8.4.20", + "postcss": "^8.4.24", "postcss-import": "^15.1.0", - "postcss-nesting": "^10.2.0", - "sass": "^1.57.1", - "sharp": "^0.31.3", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.2", + "postcss-nesting": "^11.2.2", + "sass": "^1.62.1", + "sharp": "^0.32.1", + "ts-loader": "^9.4.3", "typescript": "^5.0.4", - "zocker": "^1.3.0" + "vitest": "^0.31.3" }, "resolutions": { "bn.js": "5.2.1", - "@gnosis.pm/safe-apps-sdk": "7.5.0", "babel-loader": "9.1.0", "framer-motion": "7.6.15", "ethereumjs-util": "6.1.0", diff --git a/pages/_app.tsx b/pages/_app.tsx index ff71f9fad..eb541d87c 100755 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -17,7 +17,7 @@ import type {AppProps} from 'next/app'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; -import '../style.css'; +import '../style.css'; const aeonik = localFont({ variable: '--font-aeonik', @@ -37,11 +37,11 @@ const aeonik = localFont({ type TGetLayout = NextComponentType & {getLayout: (p: ReactElement, router: NextRouter) => ReactElement} const WithLayout = memo(function WithLayout(props: AppProps): ReactElement { - const {Component, pageProps, router} = props; - const getLayout = (Component as TGetLayout).getLayout || ((page: ReactElement): ReactElement => page); + const {Component, pageProps, router} = props; + const getLayout = (Component as TGetLayout).getLayout || ((page: ReactElement): ReactElement => page); // eslint-disable-next-line @typescript-eslint/naming-convention - const {value} = useLocalStorageValue('yearn.finance/feedback-popover'); - const {name} = useCurrentApp(router); + const {value} = useLocalStorageValue('yearn.finance/feedback-popover'); + const {name} = useCurrentApp(router); return (
@@ -67,8 +67,8 @@ const WithLayout = memo(function WithLayout(props: AppProps): ReactElement { }); const App = memo(function App(props: AppProps): ReactElement { - const {Component, pageProps, router} = props; - const {manifest} = useCurrentApp(router); + const {Component, pageProps, router} = props; + const {manifest} = useCurrentApp(router); return ( @@ -87,7 +87,7 @@ const App = memo(function App(props: AppProps): ReactElement { ); }); -function MyApp(props: AppProps): ReactElement { +function MyApp(props: AppProps): ReactElement { return (
> { const data: TDict = {}; - const chunks = []; + const chunks = []; for (let i = 0; i < tokens.length; i += 5_000) { chunks.push(tokens.slice(i, i + 5_000)); } + const nativeTokenWrapper = getNativeTokenWrapperContract(chainID); const nativeTokenWrapperName = getNativeTokenWrapperName(chainID); for (const chunkTokens of chunks) { const calls = []; for (const element of chunkTokens) { - const {token} = element; - const ownerAddress = address; - const isEth = toAddress(token) === toAddress(ETH_TOKEN_ADDRESS); + const {token} = element; + const ownerAddress = address; + const isEth = toAddress(token) === toAddress(ETH_TOKEN_ADDRESS); if (isEth) { - calls.push({address: toWagmiAddress(MULTICALL3_ADDRESS), abi: AGGREGATE3_ABI, functionName: 'getEthBalance', args: [ownerAddress]}); + const multicall3Contract = {address: MULTICALL3_ADDRESS, abi: AGGREGATE3_ABI}; + const baseContract = {address: nativeTokenWrapper, abi: erc20ABI}; + calls.push({...multicall3Contract, functionName: 'getEthBalance', args: [ownerAddress]}); + calls.push({...baseContract, functionName: 'decimals'}); + calls.push({...baseContract, functionName: 'symbol'}); } else { - calls.push({address: toWagmiAddress(token), abi: erc20ABI, functionName: 'balanceOf', args: [ownerAddress]}); + const baseContract = {address: toAddress(token), abi: erc20ABI}; + calls.push({...baseContract, functionName: 'balanceOf', args: [ownerAddress]}); + calls.push({...baseContract, functionName: 'decimals'}); + calls.push({...baseContract, functionName: 'symbol'}); } } try { const results = await multicall({contracts: calls as never[], chainId: chainID}); - let rIndex = 0; + let rIndex = 0; for (const element of tokens) { const {token} = element; const balanceOf = decodeAsBigInt(results[rIndex++]); @@ -85,6 +93,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const balances = await getBatchBalances({chainID, address, tokens}); return res.status(200).json({balances: serialize(balances), chainID: req.body.chainID}); } catch (error) { - Sentry.captureException(error, {tags: {rpc: getRPC(chainID), chainID, address}}); + captureException(error, {tags: {rpc: getRPC(chainID), chainID, address}}); } } diff --git a/pages/index.tsx b/pages/index.tsx index 55ea75db9..a5e437fb3 100755 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -3,12 +3,12 @@ import Balancer from 'react-wrap-balancer'; import Image from 'next/image'; import Link from 'next/link'; import {useClientEffect} from '@yearn-finance/web-lib/hooks/useClientEffect'; -import {YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {YBAL_TOKEN_ADDRESS, YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; import LogoYearn from '@common/icons/LogoYearn'; import type {ReactElement} from 'react'; -const apps = [ +const apps = [ { href: '/vaults', title: 'Vaults', @@ -28,6 +28,17 @@ const apps = [ src={`${process.env.BASE_YEARN_ASSETS_URI}/1/${YCRV_TOKEN_ADDRESS}/logo-128.png`} loading={'eager'} priority /> + }, { + href: '/ybal', + title: 'yBal', + description: 'get the best Balancer yields in DeFi.', + icon: {'yBal'} }, { href: '/veyfi', title: 'veYFI', @@ -47,16 +58,16 @@ const apps = [ } ]; -function AppBox({app}: {app: typeof apps[0]}): ReactElement { +function AppBox({app}: {app: typeof apps[0]}): ReactElement { useClientEffect((): VoidFunction => { const featuresEl = document.getElementById(app.href); if (featuresEl) { - const cleanup = (): void => { + const cleanup = (): void => { featuresEl.removeEventListener('pointermove', pointermove); featuresEl.removeEventListener('pointerleave', pointerleave); }; - const pointermove = (ev: MouseEvent): void => { + const pointermove = (ev: MouseEvent): void => { const rect = featuresEl.getBoundingClientRect(); if (featuresEl?.style) { featuresEl.style.setProperty('--opacity', '0.3'); @@ -65,7 +76,7 @@ function AppBox({app}: {app: typeof apps[0]}): ReactElement { } }; - const pointerleave = (): void => { + const pointerleave = (): void => { if (featuresEl?.style) { featuresEl.style.setProperty('--opacity', '0'); } @@ -96,10 +107,10 @@ function AppBox({app}: {app: typeof apps[0]}): ReactElement { ); } -function TextAnimation(): ReactElement { +function TextAnimation(): ReactElement { const hasBeenTriggerd = useRef(false); - function onStartAnimation(): void { + function onStartAnimation(): void { hasBeenTriggerd.current = true; const words = document.getElementsByClassName('word') as HTMLCollectionOf; const wordArray: HTMLSpanElement[][] = []; @@ -186,10 +197,10 @@ function TextAnimation(): ReactElement { ); } -function Index(): ReactElement { +function Index(): ReactElement { return ( <> -
+
diff --git a/pages/vaults/[chainID]/[address].tsx b/pages/vaults/[chainID]/[address].tsx index f6f763ce9..f893cf587 100755 --- a/pages/vaults/[chainID]/[address].tsx +++ b/pages/vaults/[chainID]/[address].tsx @@ -33,13 +33,13 @@ function Index(vault: InferGetServerSidePropsType): R const router = useRouter(); const {refresh} = useWallet(); const {toast, toastMaster} = yToast(); - + const [toastState, set_toastState] = useState<{id?: string; isOpen: boolean}>({isOpen: false}); const currentVault = useRef(vaults[toAddress(router.query.address as string)] || vault); useEffect((): void => { if (address && isActive) { - const tokensToRefresh = []; + const tokensToRefresh = []; if (currentVault?.current?.address) { tokensToRefresh.push({token: toAddress(currentVault.current.address)}); } @@ -136,7 +136,7 @@ export const getServerSideProps: GetServerSideProps = async (cont if (typeof chainID !== 'string' || !Object.keys(CHAINS).includes(chainID)) { return {notFound: true}; } - + const address = getAddress(context.query.address); if (!address || !ADDRESS_REGEX.test(address) || isZeroAddress(address)) { diff --git a/pages/vaults/about.tsx b/pages/vaults/about.tsx index 92352b09e..69a0056d2 100755 --- a/pages/vaults/about.tsx +++ b/pages/vaults/about.tsx @@ -6,7 +6,7 @@ import SettingsOverwrite from '@common/components/SettingsOverwrite'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; -function About(): ReactElement { +function About(): ReactElement { return (
@@ -26,7 +26,7 @@ function About(): ReactElement {

-
+
diff --git a/pages/vaults/factory.tsx b/pages/vaults/factory.tsx index fe8ef9798..c8eaad70a 100644 --- a/pages/vaults/factory.tsx +++ b/pages/vaults/factory.tsx @@ -1,12 +1,11 @@ import React, {useCallback, useEffect, useMemo, useState} from 'react'; -import Balancer from 'react-wrap-balancer'; -import {Contract} from 'ethcall'; -import useSWR from 'swr'; +import {Balancer} from 'react-wrap-balancer'; import {useAsync} from '@react-hookz/web'; import VaultListFactory from '@vaults/components/list/VaultListFactory'; import VAULT_FACTORY_ABI from '@vaults/utils/abi/vaultFactory.abi'; -import {createNewVaultsAndStrategies, estimateGasForCreateNewVaultsAndStrategies} from '@vaults/utils/actions/createVaultFromFactory'; +import {createNewVaultsAndStrategies, gasOfCreateNewVaultsAndStrategies} from '@vaults/utils/actions'; import Wrapper from '@vaults/Wrapper'; +import {multicall} from '@wagmi/core'; import {Button} from '@yearn-finance/web-lib/components/Button'; import Renderable from '@yearn-finance/web-lib/components/Renderable'; import {yToast} from '@yearn-finance/web-lib/components/yToast'; @@ -15,18 +14,16 @@ import {useWeb3} from '@yearn-finance/web-lib/contexts/useWeb3'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import LinkOut from '@yearn-finance/web-lib/icons/IconLinkOut'; import ERC20_ABI from '@yearn-finance/web-lib/utils/abi/erc20.abi'; -import {addressZero, toAddress} from '@yearn-finance/web-lib/utils/address'; -import {VAULT_FACTORY_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; -import {Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {toAddress} from '@yearn-finance/web-lib/utils/address'; +import {VAULT_FACTORY_ADDRESS, ZERO_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {decodeAsBoolean, decodeAsString} from '@yearn-finance/web-lib/utils/decoder'; import {formatAmount} from '@yearn-finance/web-lib/utils/format.number'; -import {getProvider, newEthCallProvider} from '@yearn-finance/web-lib/utils/web3/providers'; -import {defaultTxStatus, Transaction} from '@yearn-finance/web-lib/utils/web3/transaction'; +import {defaultTxStatus} from '@yearn-finance/web-lib/utils/web3/transaction'; import {Dropdown} from '@common/components/GaugeDropdown'; import {ImageWithFallback} from '@common/components/ImageWithFallback'; import {CurveContextApp, useCurve} from '@common/contexts/useCurve'; import {useYearn} from '@common/contexts/useYearn'; -import type {BigNumber, providers} from 'ethers'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; import type {TAddress} from '@yearn-finance/web-lib/types'; @@ -40,18 +37,18 @@ type TGaugeDisplayData = { gaugeAddress: TAddress } -const defaultOption: TDropdownGaugeOption = { +const defaultOption: TDropdownGaugeOption = { label: '', value: { name: '', - tokenAddress: addressZero, - poolAddress: addressZero, - gaugeAddress: addressZero, + tokenAddress: ZERO_ADDRESS, + poolAddress: ZERO_ADDRESS, + gaugeAddress: ZERO_ADDRESS, APY: 0 } }; -function Factory(): ReactElement { +function Factory(): ReactElement { const {mutateVaultList} = useYearn(); const {provider, isActive} = useWeb3(); const {safeChainID} = useChainID(); @@ -68,35 +65,36 @@ function Factory(): ReactElement { ** associated vault. **************************************************************************/ const [{result: filteredGauges}, fetchGaugesAction] = useAsync(async function fetchAlreadyCreatedGauges( - _provider: providers.JsonRpcProvider, _safeChainID: number, _gaugesFromYearn: TCurveGaugesFromYearn ): Promise { if ((_gaugesFromYearn || []).length === 0) { return []; } - const currentProvider = _safeChainID === 1 ? _provider || getProvider(1) : getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const curveVaultFactory = new Contract(VAULT_FACTORY_ADDRESS, VAULT_FACTORY_ABI); + const baseContract = {address: VAULT_FACTORY_ADDRESS, abi: VAULT_FACTORY_ABI}; const calls = []; for (const gauge of _gaugesFromYearn) { - calls.push(curveVaultFactory.canCreateVaultPermissionlessly(gauge.gauge_address)); + calls.push({ + ...baseContract, + functionName: 'canCreateVaultPermissionlessly', + args: [toAddress(gauge.gauge_address)] + }); } - const canCreateVaults = await ethcallProvider.tryAll(calls) as boolean[]; - return _gaugesFromYearn.filter((_gauge: TCurveGaugeFromYearn, index: number): boolean => canCreateVaults[index]); + const canCreateVaults = await multicall({contracts: calls, chainId: _safeChainID}); + return _gaugesFromYearn.filter((_gauge: TCurveGaugeFromYearn, index: number): boolean => decodeAsBoolean(canCreateVaults[index])); }, []); useEffect((): void => { - fetchGaugesAction.execute(provider, safeChainID, gaugesFromYearn); - }, [fetchGaugesAction, gaugesFromYearn, provider, safeChainID]); + fetchGaugesAction.execute(safeChainID, gaugesFromYearn); + }, [fetchGaugesAction, gaugesFromYearn, safeChainID]); /* 🔵 - Yearn Finance ****************************************************** ** We need to create the possible elements for the dropdown by removing all ** the extra impossible gauges and formating them to the expected ** TDropdownGaugeOption type **************************************************************************/ - const gaugesOptions = useMemo((): TDropdownGaugeOption[] => { + const gaugesOptions = useMemo((): TDropdownGaugeOption[] => { return ( (filteredGauges || []) .filter((item: TCurveGaugeFromYearn): boolean => item.weight !== '0') @@ -125,16 +123,20 @@ function Factory(): ReactElement { ** We need to fetch the name and symbol from the gauge contract. **************************************************************************/ const [{result: gaugeDisplayData, status}, fetchGaugeDisplayDataAction] = useAsync(async function fetchGaugeDisplayData( - _provider: providers.JsonRpcProvider, _safeChainID: number, _selectedOption: TDropdownGaugeOption ): Promise { - const currentProvider = _safeChainID === 1 ? _provider || getProvider(1) : getProvider(1); - const ethcallProvider = await newEthCallProvider(currentProvider); - const curveGauge = new Contract(toAddress(_selectedOption.value.gaugeAddress), ERC20_ABI); + const baseContract = {address: _selectedOption.value.gaugeAddress, abi: ERC20_ABI}; + const results = await multicall({ + contracts: [ + {...baseContract, functionName: 'name'}, + {...baseContract, functionName: 'symbol'} + ], + chainId: _safeChainID + }); - const calls = [curveGauge.name(), curveGauge.symbol()]; - const [name, symbol] = await ethcallProvider.tryAll(calls) as [string, string]; + const name = decodeAsString(results[0]); + const symbol = decodeAsString(results[1]); return ({ name: name.replace('Curve.fi', '').replace('Gauge Deposit', '') || _selectedOption.value.name, symbol: symbol.replace('-gauge', '').replace('-f', '') || _selectedOption.value.name, @@ -144,51 +146,58 @@ function Factory(): ReactElement { }, undefined); useEffect((): void => { - fetchGaugeDisplayDataAction.execute(provider, safeChainID, selectedOption); - }, [fetchGaugeDisplayDataAction, provider, safeChainID, selectedOption]); + fetchGaugeDisplayDataAction.execute(safeChainID, selectedOption); + }, [fetchGaugeDisplayDataAction, safeChainID, selectedOption]); /* 🔵 - Yearn Finance ****************************************************** ** Perform a smartContract call to the ZAP contract to get the expected - ** out for a given in/out pair with a specific amount. This callback is - ** called every 10s or when amount/in or out changes. + ** out for a given in/out pair with a specific amount. **************************************************************************/ - const fetchEstimate = useCallback(async (): Promise => { + //TODO: ENSURE IT'S CALLED EVERY 10s + const [{result: estimate}, actions] = useAsync(async function fetchEstimate(): Promise { set_hasError(false); try { - return await estimateGasForCreateNewVaultsAndStrategies(provider, toAddress(selectedOption.value.gaugeAddress)); + return await gasOfCreateNewVaultsAndStrategies({ + connector: provider, + contractAddress: VAULT_FACTORY_ADDRESS, + gaugeAddress: selectedOption.value.gaugeAddress + }); } catch (error) { - const err = error as {reason: string, code: string}; + const err = error as {reason: string, code: string}; if (err.code === 'UNPREDICTABLE_GAS_LIMIT') { toast({type: 'warning', content: (err?.reason || '').replace('execution reverted: ', '')}); } else { toast({type: 'error', content: (err?.reason || '').replace('execution reverted: ', '')}); set_hasError(true); } - return Zero; + return 0n; } - //eslint-disable-next-line react-hooks/exhaustive-deps - }, [provider, selectedOption?.value?.gaugeAddress]); //toast is a false negative error - const {data: estimate} = useSWR( - 'gasEstimate', - (!isActive || selectedOption.value.gaugeAddress === addressZero || safeChainID !== 1) ? null : fetchEstimate, - {shouldRetryOnError: false} - ); + }, 0n); + useEffect((): void => { + if (!isActive || toAddress(selectedOption.value.gaugeAddress) === ZERO_ADDRESS || safeChainID !== 1) { + return; + } + actions.execute(); + }, [actions, isActive, provider, safeChainID, selectedOption, selectedOption.value.gaugeAddress]); - async function onCreateNewVault(): Promise { - new Transaction(provider, createNewVaultsAndStrategies, set_txStatus).populate( - selectedOption.value.gaugeAddress - ).onSuccess(async (): Promise => { - set_selectedOption(defaultOption); + const onCreateNewVault = useCallback(async (): Promise => { + const result = await createNewVaultsAndStrategies({ + connector: provider, + contractAddress: VAULT_FACTORY_ADDRESS, + gaugeAddress: selectedOption.value.gaugeAddress, + statusHandler: set_txStatus + }); + if (result.isSuccessful) { await setTimeout(async (): Promise => { await Promise.all([ - fetchGaugesAction.execute(provider, safeChainID, gaugesFromYearn), + fetchGaugesAction.execute(safeChainID, gaugesFromYearn), mutateVaultList() ]); }, 1000); - }).perform(); - } + } + }, [fetchGaugesAction, gaugesFromYearn, mutateVaultList, provider, safeChainID, selectedOption.value.gaugeAddress]); - function loadingFallback(): ReactElement { + function loadingFallback(): ReactElement { return (
@@ -294,7 +303,12 @@ function Factory(): ReactElement { diff --git a/pages/vaults/index.tsx b/pages/vaults/index.tsx index 71b8434ee..45e48be2e 100644 --- a/pages/vaults/index.tsx +++ b/pages/vaults/index.tsx @@ -12,7 +12,7 @@ import Renderable from '@yearn-finance/web-lib/components/Renderable'; import {useChainID} from '@yearn-finance/web-lib/hooks/useChainID'; import {useSessionStorage} from '@yearn-finance/web-lib/hooks/useSessionStorage'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatBN} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount} from '@yearn-finance/web-lib/utils/format.number'; import ListHead from '@common/components/ListHead'; import ListHero from '@common/components/ListHero'; @@ -29,17 +29,17 @@ import type {TYDaemonVault} from '@common/schemas/yDaemonVaultsSchemas'; import type {TSortDirection} from '@common/types/types'; import type {TPossibleSortBy} from '@vaults/hooks/useSortVaults'; -function HeaderUserPosition(): ReactElement { - const {cumulatedValueInVaults} = useWallet(); - const {earned} = useYearn(); +function HeaderUserPosition(): ReactElement { + const {cumulatedValueInVaults} = useWallet(); + const {earned} = useYearn(); - const formatedYouEarned = useMemo((): string => { + const formatedYouEarned = useMemo((): string => { const amount = (earned?.totalUnrealizedGainsUSD || 0) > 0 ? earned?.totalUnrealizedGainsUSD || 0 : 0; - return formatAmount(amount)?.toString() ?? ''; + return formatAmount(amount) ?? ''; }, [earned?.totalUnrealizedGainsUSD]); - const formatedYouHave = useMemo((): string => { - return formatAmount(cumulatedValueInVaults || 0)?.toString() ?? ''; + const formatedYouHave = useMemo((): string => { + return formatAmount(cumulatedValueInVaults || 0) ?? ''; }, [cumulatedValueInVaults]); return ( @@ -68,20 +68,20 @@ function HeaderUserPosition(): ReactElement { ); } -function Index(): ReactElement { - const {safeChainID} = useChainID(); - const {balances, balancesNonce} = useWallet(); - const {vaults, vaultsMigrations, vaultsRetired, isLoadingVaultList} = useYearn(); - const [sort, set_sort] = useSessionStorage<{sortBy: TPossibleSortBy, sortDirection: TSortDirection}>( +function Index(): ReactElement { + const {safeChainID} = useChainID(); + const {balances, balancesNonce} = useWallet(); + const {vaults, vaultsMigrations, vaultsRetired, isLoadingVaultList} = useYearn(); + const [sort, set_sort] = useSessionStorage<{sortBy: TPossibleSortBy, sortDirection: TSortDirection}>( 'yVaultsSorting', {sortBy: 'apy', sortDirection: 'desc'} ); - const {shouldHideDust, shouldHideLowTVLVaults, category, searchValue, set_category, set_searchValue} = useAppSettings(); + const {shouldHideDust, shouldHideLowTVLVaults, category, searchValue, set_category, set_searchValue} = useAppSettings(); - const filterHoldingsCallback = useCallback((address: TAddress): boolean => { + const filterHoldingsCallback = useCallback((address: TAddress): boolean => { balancesNonce; - const holding = balances?.[toAddress(address)]; - const hasValidBalance = formatBN(holding?.raw).gt(0); - const balanceValue = holding?.normalizedValue || 0; + const holding = balances?.[toAddress(address)]; + const hasValidBalance = toBigInt(holding?.raw) > 0n; + const balanceValue = holding?.normalizedValue || 0; if (shouldHideDust && balanceValue < 0.01) { return false; } @@ -91,11 +91,11 @@ function Index(): ReactElement { return false; }, [balances, shouldHideDust, balancesNonce]); - const filterMigrationCallback = useCallback((address: TAddress): boolean => { + const filterMigrationCallback = useCallback((address: TAddress): boolean => { balancesNonce; - const holding = balances?.[toAddress(address)]; - const hasValidPrice = formatBN(holding?.rawPrice).gt(0); - const hasValidBalance = formatBN(holding?.raw).gt(0); + const holding = balances?.[toAddress(address)]; + const hasValidPrice = toBigInt(holding?.rawPrice) > 0n; + const hasValidBalance = toBigInt(holding?.raw) > 0n; if (hasValidBalance && (hasValidPrice ? (holding?.normalizedValue || 0) >= 0.01 : true)) { return true; } @@ -106,17 +106,17 @@ function Index(): ReactElement { ** It's best to memorize the filtered vaults, which saves a lot of processing time by only ** performing the filtering once. **********************************************************************************************/ - const curveVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Curve'); - const velodromeVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Velodrome'); - const stablesVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Stablecoin'); - const balancerVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Balancer'); - const cryptoVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Volatile'); - const holdingsVaults = useFilteredVaults(vaults, ({address}): boolean => filterHoldingsCallback(address)); - const migratableVaults = useFilteredVaults(vaultsMigrations, ({address}): boolean => filterMigrationCallback(address)); - const retiredVaults = useFilteredVaults(vaultsRetired, ({address}): boolean => filterMigrationCallback(address)); + const curveVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Curve'); + const velodromeVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Velodrome'); + const stablesVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Stablecoin'); + const balancerVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Balancer'); + const cryptoVaults = useFilteredVaults(vaults, ({category}): boolean => category === 'Volatile'); + const holdingsVaults = useFilteredVaults(vaults, ({address}): boolean => filterHoldingsCallback(address)); + const migratableVaults = useFilteredVaults(vaultsMigrations, ({address}): boolean => filterMigrationCallback(address)); + const retiredVaults = useFilteredVaults(vaultsRetired, ({address}): boolean => filterMigrationCallback(address)); - const categoriesToDisplay = useMemo((): TListHeroCategory[] => { - const categories = [ + const categoriesToDisplay = useMemo((): TListHeroCategory[] => { + const categories = [ {value: 'Featured Vaults', label: 'Featured', isSelected: category === 'Featured Vaults'}, {value: 'Crypto Vaults', label: 'Crypto', isSelected: category === 'Crypto Vaults'}, {value: 'Stables Vaults', label: 'Stables', isSelected: category === 'Stables Vaults'}, @@ -138,8 +138,8 @@ function Index(): ReactElement { ** decide which vaults to display based on the category. No extra filters are applied. ** The possible lists are memoized to avoid unnecessary re-renders. **********************************************************************************************/ - const vaultsToDisplay = useMemo((): TYDaemonVault[] => { - let _vaultList: TYDaemonVault[] = [...Object.values(vaults || {})] as TYDaemonVault[]; + const vaultsToDisplay = useMemo((): TYDaemonVault[] => { + let _vaultList: TYDaemonVault[] = [...Object.values(vaults || {})] as TYDaemonVault[]; if (category === 'Curve Vaults') { _vaultList = curveVaults; @@ -169,14 +169,14 @@ function Index(): ReactElement { ** Then, on the vaultsToDisplay list, we apply the search filter. The search filter is ** implemented as a simple string.includes() on the vault name. **********************************************************************************************/ - const searchedVaultsToDisplay = useMemo((): TYDaemonVault[] => { - const vaultsToUse = [...vaultsToDisplay]; + const searchedVaultsToDisplay = useMemo((): TYDaemonVault[] => { + const vaultsToUse = [...vaultsToDisplay]; if (searchValue === '') { return vaultsToUse; } return vaultsToUse.filter((vault): boolean => { - const searchString = getVaultName(vault); + const searchString = getVaultName(vault); return searchString.toLowerCase().includes(searchValue.toLowerCase()); }); }, [vaultsToDisplay, searchValue]); @@ -186,13 +186,13 @@ function Index(): ReactElement { ** is done via a custom method that will sort the vaults based on the sortBy and ** sortDirection values. **********************************************************************************************/ - const sortedVaultsToDisplay = useSortVaults([...searchedVaultsToDisplay], sort.sortBy, sort.sortDirection); + const sortedVaultsToDisplay = useSortVaults([...searchedVaultsToDisplay], sort.sortBy, sort.sortDirection); /* 🔵 - Yearn Finance ************************************************************************** ** Callback method used to sort the vaults list. ** The use of useCallback() is to prevent the method from being re-created on every render. **********************************************************************************************/ - const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { + const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { set_sort({sortBy: newSortBy as TPossibleSortBy, sortDirection: newSortDirection as TSortDirection}); }, [set_sort]); @@ -200,7 +200,7 @@ function Index(): ReactElement { ** The VaultList component is memoized to prevent it from being re-created on every render. ** It contains either the list of vaults, is some are available, or a message to the user. **********************************************************************************************/ - const VaultList = useMemo((): ReactNode => { + const VaultList = useMemo((): ReactNode => { if (isLoadingVaultList && category === 'Holdings') { return (
-
+
{'Holdings'} - + diff --git a/pages/vaults/migrate.unused.tsx b/pages/vaults/migrate.unused.tsx deleted file mode 100644 index f2415ef62..000000000 --- a/pages/vaults/migrate.unused.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import VaultListExternalMigration from '@vaults/components/list/VaultListExternalMigration.unused'; -import Wrapper from '@vaults/Wrapper'; - -import type {NextRouter} from 'next/router'; -import type {ReactElement} from 'react'; - -function Migrate(): ReactElement { - return ( -
- -
- -
- -
- ); -} - -Migrate.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { - return {page}; -}; - -export default Migrate; diff --git a/pages/veyfi/index.tsx b/pages/veyfi/index.tsx index b6d32db38..7b8ba260e 100755 --- a/pages/veyfi/index.tsx +++ b/pages/veyfi/index.tsx @@ -4,7 +4,7 @@ import {LockTab} from '@veYFI/components/LockTab'; import {ManageLockTab} from '@veYFI/components/ManageLockTab'; import {useVotingEscrow} from '@veYFI/contexts/useVotingEscrow'; import Wrapper from '@veYFI/Wrapper'; -import {formatBN, formatToNormalizedValue} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {formatAmount} from '@yearn-finance/web-lib/utils/format.number'; import {PageProgressBar} from '@common/components/PageProgressBar'; import {SummaryData} from '@common/components/SummaryData'; @@ -17,8 +17,8 @@ import type {ReactElement} from 'react'; function Index(): ReactElement { const {votingEscrow, positions, isLoading} = useVotingEscrow(); - const totalLockedYFI = formatToNormalizedValue(formatBN(votingEscrow?.supply), 18); - const yourLockedYFI = formatToNormalizedValue(formatBN(positions?.deposit?.underlyingBalance), 18); + const totalLockedYFI = formatToNormalizedValue(toBigInt(votingEscrow?.supply), 18); + const yourLockedYFI = formatToNormalizedValue(toBigInt(positions?.deposit?.underlyingBalance), 18); const tabs = [ {id: 'lock', label: 'Lock YFI', content: }, @@ -39,11 +39,11 @@ function Index(): ReactElement { items={[ { label: 'Total Locked YFI', - content: formatAmount(totalLockedYFI, 4)?.toString() ?? '-' + content: formatAmount(totalLockedYFI, 4) ?? '-' }, { label: 'Your Locked YFI', - content: formatAmount(yourLockedYFI, 4)?.toString() ?? '-' + content: formatAmount(yourLockedYFI, 4) ?? '-' }, { label: 'Expiration for the lock', diff --git a/pages/ybal/about.tsx b/pages/ybal/about.tsx new file mode 100755 index 000000000..67f1e33b1 --- /dev/null +++ b/pages/ybal/about.tsx @@ -0,0 +1,182 @@ +import React, {useState} from 'react'; +import Balancer from 'react-wrap-balancer'; +import {Button} from '@yearn-finance/web-lib/components/Button'; +import {LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS, ZAP_YEARN_VE_CRV_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import SettingsOverwrite from '@common/components/SettingsOverwrite'; +import {useYBal} from '@yBal/contexts/useYBal'; +import Wrapper from '@yBal/Wrapper'; + +import type {NextRouter} from 'next/router'; +import type {ReactElement} from 'react'; + +type TContractListRowProps = { + label: string; + address: string; +} + +function ContractListRow({label, address}: TContractListRowProps): ReactElement { + return ( +

+ {label} + {': '} + + {address} + +

+ ); +} + +export function AboutContent(): ReactElement { + const {slippage, set_slippage} = useYBal(); + const [localSlippage, set_localSlippage] = useState(slippage); + + return ( + <> +
+
+

{'Better Balancer yield,'}

+

{'with yBAL.'}

+
+
+ +

{'yBAL is Yearn’s liquid veBAL wrapper system. yBAL shares the same mechanics as yCRV but adapted to work within the Balancer ecosystem. (Our naming guys probably aren’t getting a raise this year).'}

+

{'yBAL offers users the best risk-adjusted yields with the same simple auto harvesting and auto-compounding features that Yearn is known (and loved) for. '}

+
+
+
+ +
+
+

{'People always ask yBAL'}

+

{'never how BAL?'}

+
+
+ +

+ {'Users can mint yBAL tokens by locking their 80-20 BAL-WETH tokens to Yearn’s whitelisted voter (but pls note: this action is irreversible. Once a user mints there is no way to redeem, as the overall position is continually re-locked).'} +

+

+ {'Once minted, yBAL can be staked into (you guessed it) st-yBAL for more yield. Or you can provide liquidity with (you guessed it) lp-yBAL for… more yield.'} +

+

{'Users can use the yBAL UI to swap between yBAL ecosystem tokens at will, so if one token is earning more yield than the other you don’t have to miss out.'}

+
+
+
+ + +
+
+

{'Let’s talk yield'}

+
+
+ +

{'With yBAL users get auto compounded yield for that lovely passive hands off yield feeling. The source of this yield is from various tokens, but Yearn’s automated process take care of selling each of these tokens and compounding it back into yBAL to increase the users position. TLDR, you can relax while Yearn smart contracts do the heavy lifting.'}

+

{'yBAL also optimizes gauge voting to further maximize the yield that flows to st-yBAL, which is streamed along with the protocol fee revenue earned by Yearn’s voter position. More yield for you, without having to lift a finger.'}

+
+
+
+ + +
+
+

{'Contract corner'}

+
+
+ +

+ {'The yBAL ecosystem is powered by smart contracts; programs that run on blockchains (in yBAL’s case Ethereum) with transparent functions that can be read by anyone. It wouldn\'t be open and transparent finance if we didn\'t let you check out our contracts. Go ahead and peek anon, it\'s ok.'} +

+ {[ + {label: 'Zap', address: ZAP_YEARN_VE_CRV_ADDRESS}, + {label: 'yBal', address: YBAL_TOKEN_ADDRESS}, + {label: 'st-yBal', address: STYBAL_TOKEN_ADDRESS}, + {label: 'lp-yBal', address: LPYBAL_TOKEN_ADDRESS} + ].map(ContractListRow)} +
+
+
+ +
+
+

{'Don’t get '}

+

{'caught slippin’'}

+
+
+ +

+ {'Slippage is set to 1% and hidden by default to streamline the experience for the average user.'} +

+

+ {'For advanced apes users worried about MEV we advise using '} + {'SecureRpc'} + + {'.'} +

+

+ {'If the above sentence causes your brain to wrinkle and eyes to glaze over, then you do not need to worry about this step. '} +

+
+
+
+ +
+
+ { + set_localSlippage(parseFloat(e.target.value) || 0); + }} /> +

{'%'}

+
+ + + +
+
+
+ + + + ); +} + +function About(): ReactElement { + return ( +
+ +
+ ); +} + +About.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { + return {page}; +}; + +export default About; diff --git a/pages/ybal/index.tsx b/pages/ybal/index.tsx new file mode 100755 index 000000000..9e3b254a2 --- /dev/null +++ b/pages/ybal/index.tsx @@ -0,0 +1,252 @@ +import React, {Fragment, useCallback, useMemo} from 'react'; +import {LPYBAL_TOKEN_ADDRESS, STYBAL_TOKEN_ADDRESS, YBAL_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatAmount, formatPercent} from '@yearn-finance/web-lib/utils/format.number'; +import {formatCounterValue, formatCounterValueRaw} from '@yearn-finance/web-lib/utils/format.value'; +import ValueAnimation from '@common/components/ValueAnimation'; +import {useWallet} from '@common/contexts/useWallet'; +import {useYearn} from '@common/contexts/useYearn'; +import {useBalance} from '@common/hooks/useBalance'; +import {useTokenPrice} from '@common/hooks/useTokenPrice'; +import {getVaultAPY} from '@common/utils'; +import CardZap from '@yBal/components/CardZap'; +import {Harvests} from '@yBal/components/Harvests'; +import {useYBal} from '@yBal/contexts/useYBal'; +import Wrapper from '@yBal/Wrapper'; + +import type {NextRouter} from 'next/router'; +import type {ReactElement} from 'react'; + +function HeaderPosition(): ReactElement { + const {holdings} = useYBal(); + const balanceOfStyBal = useBalance(STYBAL_TOKEN_ADDRESS); + const balanceOfLpyBal = useBalance(LPYBAL_TOKEN_ADDRESS); + const styBalPrice = useTokenPrice(STYBAL_TOKEN_ADDRESS); + const lpyBalPrice = useTokenPrice(LPYBAL_TOKEN_ADDRESS); + + const formatedYearnHas = useMemo((): string => ( + holdings?.veBalBalance ? + formatAmount(formatToNormalizedValue(holdings.veBalBalance, 18), 0, 0) + : '' + ), [holdings?.veBalBalance]); + + const formatedYouHave = useMemo((): string => ( + formatCounterValueRaw( + (balanceOfStyBal.normalized * styBalPrice) + + + (balanceOfLpyBal.normalized * lpyBalPrice), + 1 + ) + ), [balanceOfStyBal.normalized, styBalPrice, balanceOfLpyBal.normalized, lpyBalPrice]); + + return ( + +
+

{'Yearn has'}

+ + + +
+
+

{'You have'}

+ + + +
+
+ ); +} + +function Holdings(): ReactElement { + const {balances} = useWallet(); + const {holdings, styBalAPY} = useYBal(); + const {vaults} = useYearn(); + + const lpyBalAPY = useMemo((): number => Number(getVaultAPY(vaults, LPYBAL_TOKEN_ADDRESS)), [vaults]); + const yBalPrice = useTokenPrice(YBAL_TOKEN_ADDRESS); + const styBalPrice = useTokenPrice(STYBAL_TOKEN_ADDRESS); + const lpyBalPrice = useTokenPrice(LPYBAL_TOKEN_ADDRESS); + const balanceOfStyBal = useBalance(STYBAL_TOKEN_ADDRESS); + const balanceOfLpyBal = useBalance(LPYBAL_TOKEN_ADDRESS); + + const formatBigNumberOver10K = useCallback((v: bigint): string => { + if (toBigInt(v) > (toBigInt(10000) * toBigInt(1e18))) { + return formatAmount(formatToNormalizedValue(toBigInt(v), 18), 0, 0) ?? ''; + } + return formatAmount(formatToNormalizedValue(toBigInt(v), 18)) ?? ''; + }, []); + + const formatNumberOver10K = useCallback((v: number): string => { + if (v >= 10000) { + return formatAmount(v, 0, 0) ?? ''; + } + return formatAmount(v) ?? ''; + }, []); + + return ( +
+ + +
+ +
+
+
+ + {'PEG: '} + +

+ {holdings?.balYBalPeg ? (formatPercent((formatToNormalizedValue(holdings?.balYBalPeg, 18) + 0.0015) * 100)): formatPercent(0)} +

+
+
+ +
+
+ + {'st-yBal'} + +
+ +
+ + {'My Balance: '} + +

+ {formatNumberOver10K(balances[STYBAL_TOKEN_ADDRESS]?.normalized || 0)} +

+
+
+ + {'Value: '} + +

+ {formatCounterValue(balanceOfStyBal.normalized, styBalPrice)} +

+
+ +
+ +
+ {'APY: '} + + {formatPercent(styBalAPY ?? 0)} + +
+
+ + {'Total Assets: '} + +

+ {holdings?.styBalSupply ? formatCounterValue( + formatToNormalizedValue(holdings.styBalSupply, 18), + yBalPrice + ) : formatAmount(0)} +

+
+
+ + {'yBal Deposits: '} + +

+ {formatBigNumberOver10K(holdings.styBalSupply)} +

+
+
+ +
+
+ + {'lp-yBal'} + +
+ +
+ + {'My Balance: '} + +

+ {formatNumberOver10K(balances[LPYBAL_TOKEN_ADDRESS]?.normalized || 0)} +

+
+
+ + {'Value: '} + +

+ {formatCounterValue(balanceOfLpyBal.normalized, lpyBalPrice)} +

+
+ +
+ +
+ {'APY: '} + + {formatPercent(lpyBalAPY ?? 0)} + +
+
+ + {'Total Assets: '} + +

+ {holdings?.lpyBalSupply ? formatCounterValue( + formatToNormalizedValue(holdings.lpyBalSupply, 18), + lpyBalPrice + ) : formatAmount(0)} +

+
+
+ + {'yBal Deposits: '} + +

+ {formatBigNumberOver10K(holdings.lpyBalSupply)} +

+
+
+
+
+ + +
+ ); +} + +Holdings.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { + return {page}; +}; + + +export default Holdings; diff --git a/pages/ybribe/about.tsx b/pages/ybribe/about.tsx index 22bc0c811..f32798c4f 100755 --- a/pages/ybribe/about.tsx +++ b/pages/ybribe/about.tsx @@ -8,7 +8,7 @@ import Wrapper from '@yBribe/Wrapper'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; -function About(): ReactElement { +function About(): ReactElement { return (
diff --git a/pages/ybribe/index.tsx b/pages/ybribe/index.tsx index 6bfed1092..5c4d16ba1 100755 --- a/pages/ybribe/index.tsx +++ b/pages/ybribe/index.tsx @@ -5,7 +5,7 @@ import {Button} from '@yearn-finance/web-lib/components/Button'; import Renderable from '@yearn-finance/web-lib/components/Renderable'; import {useSessionStorage} from '@yearn-finance/web-lib/hooks/useSessionStorage'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatBN, formatToNormalizedValue, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {isTAddress} from '@yearn-finance/web-lib/utils/isTAddress'; import ListHead from '@common/components/ListHead'; import ListHero from '@common/components/ListHero'; @@ -17,77 +17,76 @@ import {GaugeListRow} from '@yBribe/components/claim/GaugeListRow'; import {useBribes} from '@yBribe/contexts/useBribes'; import Wrapper from '@yBribe/Wrapper'; -import type {BigNumber} from 'ethers'; import type {NextRouter} from 'next/router'; import type {ReactElement, ReactNode} from 'react'; import type {TAddress} from '@yearn-finance/web-lib/types'; import type {TCurveGauge} from '@common/schemas/curveSchemas'; import type {TSortDirection} from '@common/types/types'; -function GaugeList(): ReactElement { - const {tokens, prices} = useYearn(); - const {currentRewards, nextRewards, claimable} = useBribes(); - const {gauges} = useCurve(); - const [category, set_category] = useState('all'); - const [searchValue, set_searchValue] = useState(''); - const [sort, set_sort] = useSessionStorage<{sortBy: string, sortDirection: TSortDirection}>( +function GaugeList(): ReactElement { + const {tokens, prices} = useYearn(); + const {currentRewards, nextRewards, claimable} = useBribes(); + const {gauges} = useCurve(); + const [category, set_category] = useState('all'); + const [searchValue, set_searchValue] = useState(''); + const [sort, set_sort] = useSessionStorage<{sortBy: string, sortDirection: TSortDirection}>( 'yGaugeListBribeSorting', {sortBy: '', sortDirection: 'desc'} ); - const getRewardValue = useCallback((address: TAddress, value: BigNumber): number => { - const tokenInfo = tokens?.[address]; - const tokenPrice = prices?.[address]; - const decimals = tokenInfo?.decimals || 18; - const bribeAmount = formatToNormalizedValue(formatBN(value), decimals); - const bribeValue = bribeAmount * (Number(tokenPrice || 0) / 100); + const getRewardValue = useCallback((address: TAddress, value: bigint): number => { + const tokenInfo = tokens?.[address]; + const tokenPrice = prices?.[address]; + const decimals = tokenInfo?.decimals || 18; + const bribeAmount = formatToNormalizedValue(toBigInt(value), decimals); + const bribeValue = bribeAmount * (Number(tokenPrice || 0) / 100); return bribeValue; }, [prices, tokens]); - const filteredGauges = useMemo((): TCurveGauge[] => { + const filteredGauges = useMemo((): TCurveGauge[] => { if (category === 'claimable') { return gauges.filter((gauge): boolean => { - const currentClaimableMapV3 = Object.values(claimable?.v3?.[toAddress(gauge.gauge)] || {}); - return currentClaimableMapV3.some((value: BigNumber): boolean => value.gt(0)); + const currentClaimableMapV3 = Object.values(claimable?.[toAddress(gauge.gauge)] || {}); + return currentClaimableMapV3.some((value: bigint): boolean => value > 0); }); } return gauges.filter((gauge): boolean => { - const hasCurrentRewardsV3 = currentRewards?.v3?.[toAddress(gauge.gauge)] !== undefined; - const hasNextRewardsV3 = nextRewards?.v3?.[toAddress(gauge.gauge)] !== undefined; + const hasCurrentRewardsV3 = currentRewards?.[toAddress(gauge.gauge)] !== undefined; + const hasNextRewardsV3 = nextRewards?.[toAddress(gauge.gauge)] !== undefined; return hasCurrentRewardsV3 || hasNextRewardsV3; }); }, [category, gauges, currentRewards, nextRewards, claimable]); - const searchedGauges = useMemo((): TCurveGauge[] => { - const gaugesToSearch = [...filteredGauges]; + const searchedGauges = useMemo((): TCurveGauge[] => { + const gaugesToSearch = [...filteredGauges]; if (searchValue === '') { return gaugesToSearch; } return gaugesToSearch.filter((gauge): boolean => { - const searchString = `${gauge.name} ${gauge.gauge}`; + const searchString = `${gauge.name} ${gauge.gauge}`; return searchString.toLowerCase().includes(searchValue.toLowerCase()); }); }, [filteredGauges, searchValue]); - const sortedGauges = useMemo((): TCurveGauge[] => { + const sortedGauges = useMemo((): TCurveGauge[] => { if (sort.sortBy === 'name') { return searchedGauges.sort((a, b): number => stringSort({a: a.name, b: b.name, sortDirection: sort.sortDirection})); } if (sort.sortBy === 'rewards') { return searchedGauges.sort((a, b): number => { - const allARewards = Object.entries(currentRewards?.v3?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { + const allARewards = Object.entries(currentRewards?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { if (!isTAddress(address)) { return 0; } - const aBribeValue = getRewardValue(address, value || Zero); + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); - const allBRewards = Object.entries(currentRewards?.v3?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { + const allBRewards = Object.entries(currentRewards?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { if (!isTAddress(address)) { return 0; } - const aBribeValue = getRewardValue(address, value || Zero); + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); @@ -99,19 +98,19 @@ function GaugeList(): ReactElement { } if (sort.sortBy === 'pendingRewards') { return searchedGauges.sort((a, b): number => { - const allARewards = Object.entries(nextRewards?.v3?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { + const allARewards = Object.entries(nextRewards?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { if (!isTAddress(address)) { return 0; } - const aBribeValue = getRewardValue(address, value || Zero); + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); - const allBRewards = Object.entries(nextRewards?.v3?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { + const allBRewards = Object.entries(nextRewards?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { if (!isTAddress(address)) { return 0; } - const aBribeValue = getRewardValue(address, value || Zero); + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); @@ -123,14 +122,14 @@ function GaugeList(): ReactElement { } return searchedGauges; - }, [sort.sortBy, sort.sortDirection, searchedGauges, currentRewards?.v3, getRewardValue, nextRewards?.v3]); + }, [sort.sortBy, sort.sortDirection, searchedGauges, currentRewards, getRewardValue, nextRewards]); - const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { + const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { set_sort({sortBy: newSortBy, sortDirection: newSortDirection as TSortDirection}); }, [set_sort]); return ( -
+
-
+
{'Get more for your votes.'}

diff --git a/pages/ybribe/offer-bribe.tsx b/pages/ybribe/offer-bribe.tsx index d99753ebf..588f27452 100755 --- a/pages/ybribe/offer-bribe.tsx +++ b/pages/ybribe/offer-bribe.tsx @@ -5,7 +5,7 @@ import {Button} from '@yearn-finance/web-lib/components/Button'; import Renderable from '@yearn-finance/web-lib/components/Renderable'; import {useSessionStorage} from '@yearn-finance/web-lib/hooks/useSessionStorage'; import {toAddress} from '@yearn-finance/web-lib/utils/address'; -import {formatBN, formatToNormalizedValue, Zero} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; import {isTAddress} from '@yearn-finance/web-lib/utils/isTAddress'; import ListHead from '@common/components/ListHead'; import ListHero from '@common/components/ListHero'; @@ -17,37 +17,36 @@ import {GaugeListRow} from '@yBribe/components/bribe/GaugeListRow'; import {useBribes} from '@yBribe/contexts/useBribes'; import Wrapper from '@yBribe/Wrapper'; -import type {BigNumber} from 'ethers'; import type {NextRouter} from 'next/router'; import type {ReactElement, ReactNode} from 'react'; import type {TCurveGauge} from '@common/schemas/curveSchemas'; import type {TSortDirection} from '@common/types/types'; -function GaugeList(): ReactElement { - const {tokens, prices} = useYearn(); - const {gauges} = useCurve(); - const {currentRewards, nextRewards} = useBribes(); - const [category, set_category] = useState('all'); - const [searchValue, set_searchValue] = useState(''); - const [sort, set_sort] = useSessionStorage<{sortBy: string, sortDirection: TSortDirection}>( +function GaugeList(): ReactElement { + const {tokens, prices} = useYearn(); + const {gauges} = useCurve(); + const {currentRewards, nextRewards} = useBribes(); + const [category, set_category] = useState('all'); + const [searchValue, set_searchValue] = useState(''); + const [sort, set_sort] = useSessionStorage<{sortBy: string, sortDirection: TSortDirection}>( 'yGaugeListOfferBribeSorting', {sortBy: '', sortDirection: 'desc'} ); - const getRewardValue = useCallback((address: string, value: BigNumber): number => { + const getRewardValue = useCallback((address: string, value: bigint): number => { if (!isTAddress(address)) { return 0; } - const tokenInfo = tokens?.[address]; - const tokenPrice = prices?.[address]; - const decimals = tokenInfo?.decimals || 18; - const bribeAmount = formatToNormalizedValue(formatBN(value), decimals); - const bribeValue = bribeAmount * (Number(tokenPrice || 0) / 100); + const tokenInfo = tokens?.[address]; + const tokenPrice = prices?.[address]; + const decimals = tokenInfo?.decimals || 18; + const bribeAmount = formatToNormalizedValue(toBigInt(value), decimals); + const bribeValue = bribeAmount * (Number(tokenPrice || 0) / 100); return bribeValue; }, [prices, tokens]); - const standardGauges = useMemo((): TCurveGauge[] => gauges.filter((gauge): boolean => !gauge.factory), [gauges]); - const factoryGauges = useMemo((): TCurveGauge[] => gauges.filter((gauge): boolean => gauge.factory), [gauges]); - const filteredGauges = useMemo((): TCurveGauge[] => { + const standardGauges = useMemo((): TCurveGauge[] => gauges.filter((gauge): boolean => !gauge.factory), [gauges]); + const factoryGauges = useMemo((): TCurveGauge[] => gauges.filter((gauge): boolean => gauge.factory), [gauges]); + const filteredGauges = useMemo((): TCurveGauge[] => { if (category === 'standard') { return standardGauges; } @@ -57,31 +56,31 @@ function GaugeList(): ReactElement { return gauges; }, [category, gauges, factoryGauges, standardGauges]); - const searchedGauges = useMemo((): TCurveGauge[] => { - const gaugesToSearch = [...filteredGauges]; + const searchedGauges = useMemo((): TCurveGauge[] => { + const gaugesToSearch = [...filteredGauges]; if (searchValue === '') { return gaugesToSearch; } return gaugesToSearch.filter((gauge): boolean => { - const searchString = `${gauge.name} ${gauge.gauge}`; + const searchString = `${gauge.name} ${gauge.gauge}`; return searchString.toLowerCase().includes(searchValue.toLowerCase()); }); }, [filteredGauges, searchValue]); - const sortedGauges = useMemo((): TCurveGauge[] => { + const sortedGauges = useMemo((): TCurveGauge[] => { if (sort.sortBy === 'name') { return searchedGauges.sort((a, b): number => stringSort({a: a.name, b: b.name, sortDirection: sort.sortDirection})); } if (sort.sortBy === 'rewards') { return searchedGauges.sort((a, b): number => { - const allARewards = Object.entries(currentRewards?.v3?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { - const aBribeValue = getRewardValue(address, value || Zero); + const allARewards = Object.entries(currentRewards?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); - const allBRewards = Object.entries(currentRewards?.v3?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { - const aBribeValue = getRewardValue(address, value || Zero); + const allBRewards = Object.entries(currentRewards?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); @@ -93,13 +92,13 @@ function GaugeList(): ReactElement { } if (sort.sortBy === 'pendingRewards') { return searchedGauges.sort((a, b): number => { - const allARewards = Object.entries(nextRewards?.v3?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { - const aBribeValue = getRewardValue(address, value || Zero); + const allARewards = Object.entries(nextRewards?.[toAddress(a.gauge)] || {}).reduce((acc, [address, value]): number => { + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); - const allBRewards = Object.entries(nextRewards?.v3?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { - const aBribeValue = getRewardValue(address, value || Zero); + const allBRewards = Object.entries(nextRewards?.[toAddress(b.gauge)] || {}).reduce((acc, [address, value]): number => { + const aBribeValue = getRewardValue(address, value || 0n); return acc + aBribeValue; }, 0); @@ -110,14 +109,14 @@ function GaugeList(): ReactElement { }); } return searchedGauges; - }, [sort.sortBy, sort.sortDirection, searchedGauges, currentRewards?.v3, getRewardValue, nextRewards?.v3]); + }, [sort.sortBy, sort.sortDirection, searchedGauges, currentRewards, getRewardValue, nextRewards]); - const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { + const onSort = useCallback((newSortBy: string, newSortDirection: string): void => { set_sort({sortBy: newSortBy, sortDirection: newSortDirection as TSortDirection}); }, [set_sort]); return ( -

+
-
+
{'Buy votes to boost emissions.'}

diff --git a/pages/ycrv/about.tsx b/pages/ycrv/about.tsx index d4ba76e44..da3a3ec3a 100755 --- a/pages/ycrv/about.tsx +++ b/pages/ycrv/about.tsx @@ -30,9 +30,9 @@ function ContractListRow({label, address}: TContractListRowProps): ReactElement ); } -function About(): ReactElement { - const {slippage, set_slippage} = useYCRV(); - const [localSlippage, set_localSlippage] = useState(slippage); +function About(): ReactElement { + const {slippage, set_slippage} = useYCRV(); + const [localSlippage, set_localSlippage] = useState(slippage); return (

@@ -159,7 +159,7 @@ function About(): ReactElement { {'Slippage tolerance'}
-
+
( - holdings?.veCRVBalance ? - formatAmount(formatToNormalizedValue(holdings.veCRVBalance, 18), 0, 0) - : '' - ), [holdings?.veCRVBalance]); - - const formatedYouHave = useMemo((): ReactNode => ( - formatCounterValueRaw( - (balanceOfStyCRV.normalized * stycrvPrice) - + - (balanceOfLpyCRV.normalized * lpycrvPrice), - 1 - ) - ), [balanceOfStyCRV.normalized, stycrvPrice, balanceOfLpyCRV.normalized, lpycrvPrice]); - - return ( - -
-

{'Yearn has'}

- - - -
-
-

{'You have'}

- - - -
-
- ); -} - -function Holdings(): ReactElement { - const {balances} = useWallet(); - const {holdings, styCRVMegaBoost, styCRVAPY} = useYCRV(); - const {vaults} = useYearn(); - const {curveWeeklyFees, cgPrices} = useCurve(); - - const lpCRVAPY = useMemo((): string => getVaultAPY(vaults, LPYCRV_TOKEN_ADDRESS), [vaults]); - const ycrvPrice = useTokenPrice(YCRV_TOKEN_ADDRESS); - const stycrvPrice = useTokenPrice(STYCRV_TOKEN_ADDRESS); - const lpycrvPrice = useTokenPrice(LPYCRV_TOKEN_ADDRESS); - const balanceOfStyCRV = useBalance(STYCRV_TOKEN_ADDRESS); - const balanceOfLpyCRV = useBalance(LPYCRV_TOKEN_ADDRESS); - - const formatBigNumberOver10K = useCallback((v: BigNumber): string => { - if (formatBN(v)?.gt(ethers.constants.WeiPerEther.mul(10000))) { - return formatAmount(formatToNormalizedValue(v || 0, 18), 0, 0)?.toString() ?? ''; - } - return formatAmount(formatToNormalizedValue(v || 0, 18))?.toString() ?? ''; - }, []); - - const formatNumberOver10K = useCallback((v: number): string => { - if (v >= 10000) { - return formatAmount(v, 0, 0)?.toString() ?? ''; - } - return formatAmount(v)?.toString() ?? ''; - }, []); - - const latestCurveFeesValue = useMemo((): number => { - const {weeklyFeesTable} = curveWeeklyFees; - - if (!weeklyFeesTable) { - return 0; - } - - if (weeklyFeesTable[0]?.rawFees > 0) { - return weeklyFeesTable[0].rawFees; - } - - return weeklyFeesTable[1]?.rawFees || 0; - }, [curveWeeklyFees]); - - const currentVeCRVAPY = useMemo((): number => { - return ( - latestCurveFeesValue / ( - formatToNormalizedValue(formatBN(holdings?.veCRVTotalSupply), 18) * cgPrices?.['curve-dao-token']?.usd - ) * 52 * 100 - ); - }, [holdings, latestCurveFeesValue, cgPrices]); - - const curveAdminFeePercent = useMemo((): number => { - return (currentVeCRVAPY * Number(holdings?.boostMultiplier) / 10000); - }, [holdings, currentVeCRVAPY]); - - return ( -
- - - -
-
-
-
- - {holdings?.treasury ? `${formatBigNumberOver10K(holdings?.treasury || 0)} ` : '- '} - {'veCRV'} - -

{'Yearn Treasury'}

-
-
- - {holdings?.legacy ? `${formatBigNumberOver10K(holdings?.legacy || 0)} ` : '- '} - {'yveCRV'} - -

{'Legacy system'}

-
-
- - {holdings?.yCRVSupply ? `${formatBigNumberOver10K(holdings?.yCRVSupply || 0)} ` : '- '} - {'yCRV'} - - -

- {`(Price = $${(formatAmount(ycrvPrice || 0))} | Peg = ${( - holdings?.crvYCRVPeg ? (formatPercent( - (formatToNormalizedValue(holdings?.crvYCRVPeg, 18) + 0.0015) * 100) - ): formatPercent(0) - )})`} -

-
-
-
- -
- - -
-
- {'Product: '} -

- {'st-yCRV'} -

-
-
- {'APY: '} - - {styCRVAPY ? `${formatPercent(styCRVAPY)}*` : `${formatPercent(0)}`} - -
-
- {'Total Assets: '} -

- {holdings?.styCRVSupply ? formatCounterValue( - formatToNormalizedValue(holdings.styCRVSupply, 18), - ycrvPrice - ) : formatAmount(0)} -

-
-
- {'yCRV Deposits: '} -

- {formatBigNumberOver10K(holdings?.styCRVSupply || 0)} -

-
-
- {'My Balance: '} -
-

- {formatNumberOver10K(balances[STYCRV_TOKEN_ADDRESS]?.normalized || 0)} -

-

- {formatCounterValue(balanceOfStyCRV.normalized, stycrvPrice)} -

-
-
-
- -
-
- {'Product: '} -

- {'lp-yCRV'} -

-
-
- {'APY: '} - - {lpCRVAPY ? `${(lpCRVAPY || '').replace('APY', '')}` : `${formatPercent(0)}`} - -
-
- {'Total Assets: '} -

- {holdings?.lpyCRVSupply ? formatCounterValue( - formatToNormalizedValue(holdings?.lpyCRVSupply, 18), - lpycrvPrice - ) : formatAmount(0)} -

-
-
- {'yCRV Deposits: '} -

- {formatBigNumberOver10K(holdings?.lpyCRVSupply || 0)} -

-
-
- {'My Balance: '} -
-

- {formatNumberOver10K(balances[LPYCRV_TOKEN_ADDRESS]?.normalized || 0)} -

-

- {formatCounterValue( - balanceOfLpyCRV?.normalized, - lpycrvPrice - )} -

-
-
-
- -
-

- {styCRVAPY ? `*${formatPercent(styCRVAPY)} APY: ` : `*${formatPercent(0)} APY: `} -

-

- {`∙ ${curveAdminFeePercent ? formatPercent(curveAdminFeePercent) : formatPercent(0)} Curve Admin Fees (${formatAmount(Number(holdings?.boostMultiplier) / 10000)}x boost)`} -

-

- {`∙ ${styCRVAPY && curveAdminFeePercent && styCRVMegaBoost ? formatAmount(styCRVAPY - (curveAdminFeePercent + (styCRVMegaBoost * 100)), 2, 2) : '0.00'}% Gauge Voting Bribes`} -

-

- {`∙ ${styCRVMegaBoost ? formatPercent(styCRVMegaBoost * 100) : formatPercent(0)} Mega Boost`} -

-
-
-
- - - -
- ); -} - -Holdings.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { - return {page}; -}; - - -export default Holdings; diff --git a/pages/ycrv/index.tsx b/pages/ycrv/index.tsx index fdc849c9d..066876325 100755 --- a/pages/ycrv/index.tsx +++ b/pages/ycrv/index.tsx @@ -1,129 +1,345 @@ -import React from 'react'; -import {Button} from '@yearn-finance/web-lib/components/Button'; -import {useClientEffect} from '@yearn-finance/web-lib/hooks/useClientEffect'; -import CardMigrateLegacy from '@yCRV/components/CardMigrateLegacy'; +import React, {Fragment, useCallback, useMemo} from 'react'; +import {LPYCRV_TOKEN_ADDRESS, STYCRV_TOKEN_ADDRESS, YCRV_TOKEN_ADDRESS} from '@yearn-finance/web-lib/utils/constants'; +import {formatToNormalizedValue, toBigInt} from '@yearn-finance/web-lib/utils/format.bigNumber'; +import {formatAmount, formatPercent} from '@yearn-finance/web-lib/utils/format.number'; +import {formatCounterValue, formatCounterValueRaw} from '@yearn-finance/web-lib/utils/format.value'; +import ValueAnimation from '@common/components/ValueAnimation'; +import {useCurve} from '@common/contexts/useCurve'; +import {useWallet} from '@common/contexts/useWallet'; +import {useYearn} from '@common/contexts/useYearn'; +import {useBalance} from '@common/hooks/useBalance'; +import {useTokenPrice} from '@common/hooks/useTokenPrice'; +import {getVaultAPY} from '@common/utils'; import CardZap from '@yCRV/components/CardZap'; +import {Harvests} from '@yCRV/components/Harvests'; +import {useYCRV} from '@yCRV/contexts/useYCRV'; import Wrapper from '@yCRV/Wrapper'; import type {NextRouter} from 'next/router'; import type {ReactElement} from 'react'; -function TextAnimation(): ReactElement { - function onStartAnimation(): void { - const words = document.getElementsByClassName('word') as HTMLCollectionOf; - const wordArray: HTMLSpanElement[][] = []; - let currentWord = 0; +function HeaderPosition(): ReactElement { + const {holdings} = useYCRV(); + const balanceOfStyCRV = useBalance(STYCRV_TOKEN_ADDRESS); + const balanceOfLpyCRV = useBalance(LPYCRV_TOKEN_ADDRESS); + const stycrvPrice = useTokenPrice(STYCRV_TOKEN_ADDRESS); + const lpycrvPrice = useTokenPrice(LPYCRV_TOKEN_ADDRESS); - words[currentWord].style.opacity = '1'; - for (const word of Array.from(words)) { - splitLetters(word); - } + const formatedYearnHas = useMemo((): string => ( + holdings?.veCRVBalance ? + formatAmount(formatToNormalizedValue(holdings.veCRVBalance, 18), 0, 0) + : '' + ), [holdings?.veCRVBalance]); + + const formatedYouHave = useMemo((): string => ( + formatCounterValueRaw( + (balanceOfStyCRV.normalized * stycrvPrice) + + + (balanceOfLpyCRV.normalized * lpycrvPrice), + 1 + ) + ), [balanceOfStyCRV.normalized, stycrvPrice, balanceOfLpyCRV.normalized, lpycrvPrice]); + + return ( + +
+

{'Yearn has'}

+ + + +
+
+

{'You have'}

+ + + +
+
+ ); +} + +function ZapAndStats(): ReactElement { + const {balances} = useWallet(); + const {holdings, styCRVMegaBoost, styCRVAPY} = useYCRV(); + const {vaults} = useYearn(); + const {curveWeeklyFees, cgPrices} = useCurve(); - function changeWord(): void { - const cw = wordArray[currentWord]; - const nw = currentWord == words.length-1 ? wordArray[0] : wordArray[currentWord+1]; - if (!cw || !nw) { - return; - } - for (let i = 0; i < cw.length; i++) { - animateLetterOut(cw, i); - } - - for (let i = 0; i < nw.length; i++) { - nw[i].className = 'letter behind'; - if (nw?.[0]?.parentElement?.style) { - nw[0].parentElement.style.opacity = '1'; - } - animateLetterIn(nw, i); - } - currentWord = (currentWord == wordArray.length-1) ? 0 : currentWord+1; + const lpCRVAPY = useMemo((): string => getVaultAPY(vaults, LPYCRV_TOKEN_ADDRESS), [vaults]); + const ycrvPrice = useTokenPrice(YCRV_TOKEN_ADDRESS); + const stycrvPrice = useTokenPrice(STYCRV_TOKEN_ADDRESS); + const lpycrvPrice = useTokenPrice(LPYCRV_TOKEN_ADDRESS); + const balanceOfStyCRV = useBalance(STYCRV_TOKEN_ADDRESS); + const balanceOfLpyCRV = useBalance(LPYCRV_TOKEN_ADDRESS); + + const formatBigNumberOver10K = useCallback((v: bigint): string => { + if (toBigInt(v) > (toBigInt(10000) * toBigInt(1e18))) { + return formatAmount(formatToNormalizedValue(toBigInt(v), 18), 0, 0) ?? ''; } + return formatAmount(formatToNormalizedValue(toBigInt(v), 18)) ?? ''; + }, []); - function animateLetterOut(cw: HTMLSpanElement[], i: number): void { - setTimeout((): void => { - cw[i].className = 'letter out'; - }, i*80); + const formatNumberOver10K = useCallback((v: number): string => { + if (v >= 10000) { + return formatAmount(v, 0, 0) ?? ''; } + return formatAmount(v) ?? ''; + }, []); + + const latestCurveFeesValue = useMemo((): number => { + const {weeklyFeesTable} = curveWeeklyFees; - function animateLetterIn(nw: HTMLSpanElement[], i: number): void { - setTimeout((): void => { - nw[i].className = 'letter in'; - }, 340+(i*80)); + if (!weeklyFeesTable) { + return 0; } - function splitLetters(word: HTMLSpanElement): void { - const content = word.innerHTML; - word.innerHTML = ''; - const letters = []; - for (let i = 0; i < content.length; i++) { - const letter = document.createElement('span'); - letter.className = 'letter'; - letter.innerHTML = content.charAt(i); - word.appendChild(letter); - letters.push(letter); - } - - wordArray.push(letters); + if (weeklyFeesTable[0]?.rawFees > 0) { + return weeklyFeesTable[0].rawFees; } - setTimeout((): void => { - changeWord(); - setInterval(changeWord, 3000); - }, 3000); - } + return weeklyFeesTable[1]?.rawFees || 0; + }, [curveWeeklyFees]); - useClientEffect((): void => { - onStartAnimation(); - }, []); + const currentVeCRVAPY = useMemo((): number => { + return ( + latestCurveFeesValue / ( + formatToNormalizedValue(toBigInt(holdings?.veCRVTotalSupply), 18) * cgPrices?.['curve-dao-token']?.usd + ) * 52 * 100 + ); + }, [holdings, latestCurveFeesValue, cgPrices]); + + const curveAdminFeePercent = useMemo((): number => { + return (currentVeCRVAPY * Number(holdings?.boostMultiplier) / 10000); + }, [holdings, currentVeCRVAPY]); - return ( - <> -
-

- {'Gigantic'} - {'Seismic'} - {'Substantial'} - {'Immense'} - {'Colossal'} - {'Humongous'} - {'Giant'} - {'Stupendous'} - {'Jumbo'} -

-
- - ); -} -function Index(): ReactElement { return ( - <> -
-
- +
+ +
+
+
+ + {'Price/PEG: '} + +

+ {`Price = $${(formatAmount(ycrvPrice || 0))} | Peg = ${( + holdings?.crvYCRVPeg ? (formatPercent( + (formatToNormalizedValue(holdings?.crvYCRVPeg, 18) + 0.0015) * 100) + ): formatPercent(0) + )}`} +

+
+ +
+ + {'Yearn Treasury: '} + +

+ {holdings?.treasury ? `${formatBigNumberOver10K(holdings.treasury)} ` : '- '} + {'veCRV'} +

+
+ +
+ + {'Legacy system: '} + +

+ {holdings?.legacy ? `${formatBigNumberOver10K(holdings.legacy)} ` : '- '} + {'yveCRV'} +

+
-
-

{'Whatever word you choose, get supercharged yields on CRV with Yearn.'}

+ +
+
+ + {'st-yCRV'} + +
+ +
+ + {'My Balance: '} + +

+ {formatNumberOver10K(balances[STYCRV_TOKEN_ADDRESS]?.normalized || 0)} +

+
+
+ + {'Value: '} + +

+ {formatCounterValue(balanceOfStyCRV.normalized, stycrvPrice)} +

+
+ +
+ +
+ + {'APY: '} + + + + {`${formatPercent(styCRVAPY ?? 0)}*`} + + +
+

+ {styCRVAPY ? `*${formatPercent(styCRVAPY)} APY: ` : `*${formatPercent(0)} APY: `} +

+

+ {`∙ ${curveAdminFeePercent ? formatPercent(curveAdminFeePercent) : formatPercent(0)} Curve Admin Fees (${formatAmount(Number(holdings?.boostMultiplier) / 10000)}x boost)`} +

+

+ {`∙ ${styCRVAPY && curveAdminFeePercent && styCRVMegaBoost ? formatAmount(styCRVAPY - (curveAdminFeePercent + (styCRVMegaBoost * 100)), 2, 2) : '0.00'}% Gauge Voting Bribes`} +

+

+ {`∙ ${styCRVMegaBoost ? formatPercent(styCRVMegaBoost * 100) : formatPercent(0)} Mega Boost`} +

+
+
+
+
+
+ + {'Total Assets: '} + +

+ {holdings?.styCRVSupply ? formatCounterValue( + formatToNormalizedValue(holdings.styCRVSupply, 18), + ycrvPrice + ) : formatAmount(0)} +

+
+
+ + {'yBal Deposits: '} + +

+ {formatBigNumberOver10K(holdings.styCRVSupply)} +

+
-
- + +
+
+ + {'lp-yCRV'} + +
+ +
+ + {'My Balance: '} + +

+ {formatNumberOver10K(balances[LPYCRV_TOKEN_ADDRESS]?.normalized || 0)} +

+
+
+ + {'Value: '} + +

+ {formatCounterValue(balanceOfLpyCRV.normalized, lpycrvPrice)} +

+
+ +
+ +
+ + {'APY: '} + + + {lpCRVAPY ? `${(lpCRVAPY || '').replace('APY', '')}` : `${formatPercent(0)}`} + +
+
+ + {'Total Assets: '} + +

+ {holdings?.lpyCRVSupply ? formatCounterValue( + formatToNormalizedValue(holdings.lpyCRVSupply, 18), + lpycrvPrice + ) : formatAmount(0)} +

+
+
+ + {'yBal Deposits: '} + +

+ {formatBigNumberOver10K(holdings.lpyCRVSupply)} +

+
-
- - -
- +
+ ); +} + +function Holdings(): ReactElement { + return ( +
+ + + +
); } -Index.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { +Holdings.getLayout = function getLayout(page: ReactElement, router: NextRouter): ReactElement { return {page}; }; -export default Index; + +export default Holdings; diff --git a/public/apps/ybal-manifest.json b/public/apps/ybal-manifest.json new file mode 100755 index 000000000..2e21a8f9f --- /dev/null +++ b/public/apps/ybal-manifest.json @@ -0,0 +1,35 @@ +{ + "name": "yBal", + "short_name": "yBal", + "description": "The best Balancer yields in defi. *mic drop*", + "iconPath": "./favicons/favicon.svg", + "locale": "en-US", + "uri": "https://yearn.finance/ybal/", + "og": "https://yearn.finance/apps/ybal-og.png", + "twitter": "@iearnfinance", + "github": "https://github.com/Majorfi/y", + "icons": [ + { + "src": "./favicons/android-icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "./favicons/android-icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "./favicons/android-icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#000000", + "title_color": "#ffffff", + "start_url": "/", + "display": "standalone", + "orientation": "portrait" +} diff --git a/tsconfig.json b/tsconfig.json index 28622f804..f32bcfaa4 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,73 +1,64 @@ { - "compilerOptions": { - "rootDirs": [ - "." - ], - "baseUrl": ".", - "paths": { - "@common/*": ["apps/common/*"], - "@vaults/*": ["apps/vaults/*"], - "@veYFI/*": ["apps/veyfi/*"], - "@yBribe/*": ["apps/ybribe/*"], - "@yCRV/*": ["apps/ycrv/*"], - }, - /* Basic Options */ - "target": "esnext", - "module": "esnext", - "lib": [ - "es6", - "es7", - "esnext", - "dom" - ], - "allowJs": true, - "jsx": "preserve", - "removeComments": false, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "inlineSourceMap": true, - "inlineSources": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "incremental": true, - "isolatedModules": true, - "plugins": [ - { - "name": "next" - } - ] - }, - "exclude": [ - "node_modules", - "_app" - ], - "include": [ - "**/*.css", - "**/*.ts", - "**/*.tsx", - "**/*.d.tsx", - "public", - "postcss.config.js", - "tailwind.config.js", - "next.config.js", - "theme.config.js", - ".eslintrc.js", - ".next/types/**/*.ts", - "jest.config.js", - "worker/index.js" -] + "compilerOptions": { + "rootDirs": ["."], + "baseUrl": ".", + "paths": { + "@common/*": ["apps/common/*"], + "@vaults/*": ["apps/vaults/*"], + "@veYFI/*": ["apps/veyfi/*"], + "@yBribe/*": ["apps/ybribe/*"], + "@yCRV/*": ["apps/ycrv/*"], + "@yBal/*": ["apps/ybal/*"], + }, + /* Basic Options */ + "target": "esnext", + "module": "esnext", + "lib": ["es6", "es7", "esnext", "dom"], + "allowJs": true, + "jsx": "preserve", + "removeComments": false, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "inlineSourceMap": true, + "inlineSources": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "isolatedModules": true, + "plugins": [{"name": "next"}] + }, + "exclude": [ + "node_modules", + "_app" + ], + "include": [ + "**/*.css", + "**/*.ts", + "**/*.tsx", + "**/*.d.tsx", + "public", + "postcss.config.js", + "tailwind.config.js", + "next.config.js", + "theme.config.js", + ".eslintrc.js", + ".next/types/**/*.ts", + "jest.config.js", + "vitest.config.ts", + "worker/index.js" + ] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..a559f3d43 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,25 @@ +import path from 'path'; +import {defineConfig} from 'vitest/config'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@vaults': path.resolve(__dirname, './apps/vaults'), + '@yBal': path.resolve(__dirname, './apps/ybal'), + '@common': path.resolve(__dirname, './apps/common'), + '@veYFI': path.resolve(__dirname, './apps/veyfi'), + '@yBribe': path.resolve(__dirname, './apps/ybribe'), + '@yCRV': path.resolve(__dirname, './apps/ycrv') + } + }, + test: { + globals: true, + environment: 'node', + deps: { + inline: ['@yearn-finance/web-lib'] + } + } +}); diff --git a/yarn.lock b/yarn.lock index 91e91dda1..430308f7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,12 +7,17 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + "@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": @@ -24,88 +29,45 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/compat-data@^7.21.5": - version "7.21.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" - integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== - -"@babel/core@^7.11.1": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== +"@babel/core@^7.11.1", "@babel/core@^7.21.4": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" - integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -118,61 +80,51 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" + integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.3" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== - dependencies: - "@babel/compat-data" "^7.21.5" + "@babel/compat-data" "^7.22.0" "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" - integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== +"@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-replace-supers" "^7.22.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" + semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -181,22 +133,10 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" @@ -213,54 +153,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== dependencies: - "@babel/types" "^7.21.0" + "@babel/types" "^7.22.3" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.21.4": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== - dependencies: - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-module-imports" "^7.21.4" "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -269,10 +188,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -284,24 +203,17 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-simple-access@^7.21.5": version "7.21.5" @@ -324,11 +236,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - "@babel/helper-string-parser@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" @@ -339,7 +246,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": +"@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== @@ -354,23 +261,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/helpers@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" "@babel/highlight@^7.18.6": version "7.18.6" @@ -381,15 +279,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" - integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== - -"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -398,127 +291,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-optional-chaining" "^7.22.3" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": +"@babel/plugin-proposal-private-property-in-object@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== @@ -528,7 +310,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -543,14 +325,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -585,7 +360,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-attributes@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" + integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -599,14 +381,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -620,7 +395,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -655,28 +430,39 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" + integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.18.6": +"@babel/plugin-transform-async-to-generator@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== @@ -692,14 +478,31 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.20.2": +"@babel/plugin-transform-block-scoping@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.20.2": +"@babel/plugin-transform-class-properties@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" + integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-class-static-block@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" + integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -714,18 +517,18 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -744,6 +547,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-dynamic-import@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" + integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" @@ -752,12 +563,20 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-export-namespace-from@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" + integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -768,6 +587,14 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-json-strings@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" + integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" @@ -775,6 +602,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-logical-assignment-operators@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" + integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" @@ -782,7 +617,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.19.6": +"@babel/plugin-transform-modules-amd@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== @@ -790,23 +625,23 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-modules-systemjs@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": @@ -817,20 +652,47 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-new-target@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" + integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" + integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" + integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.3" "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" @@ -840,12 +702,47 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== +"@babel/plugin-transform-optional-catch-binding@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" + integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-methods@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" + integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" + integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -854,12 +751,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-react-jsx-self@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz#ec98d4a9baafc5a1eb398da4cf94afbb40254a54" + integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-react-jsx-source@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": @@ -876,7 +787,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -905,12 +816,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" + integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -920,38 +839,34 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-unicode-sets-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" + integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/preset-env@^7.11.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" + integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -961,44 +876,61 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.3" + "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-class-properties" "^7.22.3" + "@babel/plugin-transform-class-static-block" "^7.22.3" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-dynamic-import" "^7.22.1" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-export-namespace-from" "^7.22.3" + "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-json-strings" "^7.22.3" "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.3" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" + "@babel/plugin-transform-new-target" "^7.22.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" + "@babel/plugin-transform-numeric-separator" "^7.22.3" + "@babel/plugin-transform-object-rest-spread" "^7.22.3" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-optional-catch-binding" "^7.22.3" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-private-methods" "^7.22.3" + "@babel/plugin-transform-private-property-in-object" "^7.22.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-spread" "^7.20.7" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.3" "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" + "@babel/types" "^7.22.4" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -1018,76 +950,46 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.20.7", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" -"@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== dependencies: "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - "@coinbase/wallet-sdk@^3.6.6": version "3.6.6" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.6.6.tgz#4a0758fe0fe0ba3ed7e33b5bb6eb094ff8bd6c98" @@ -1111,10 +1013,27 @@ stream-browserify "^3.0.0" util "^0.12.4" +"@cowprotocol/contracts@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@cowprotocol/contracts/-/contracts-1.4.0.tgz#e93e5f25aac76feeaa348fa57231903274676247" + integrity sha512-XLs3SlPmXD4lbiWIO7mxxuCn1eE5isuO6EUlE1cj17HqN/wukDAN0xXYPx6umOH/XdjGS33miMiPHELEyY9siw== + +"@cowprotocol/cow-sdk@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@cowprotocol/cow-sdk/-/cow-sdk-2.1.0.tgz#b66adf0c4f6d9e6690762a1c3e169db5ba8feff1" + integrity sha512-/2bM58kddP1um9COO5XNPl88gOmnzAPr8fK6EGsdPkPuAQZtCfOWGvqajTtM+shixA21ZaATcSnNL57s5Zd8qw== + dependencies: + "@cowprotocol/contracts" "^1.4.0" + "@ethersproject/abstract-signer" "^5.7.0" + cross-fetch "^3.1.5" + exponential-backoff "^3.1.1" + graphql-request "^4.3.0" + limiter "^2.1.0" + "@csstools/selector-specificity@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz#c9c61d9fe5ca5ac664e1153bb0aa0eba1c6d6308" - integrity sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== "@emotion/is-prop-valid@^0.8.2": version "0.8.8" @@ -1128,14 +1047,136 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.5.2" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1143,6 +1184,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -1485,35 +1531,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@faker-js/faker@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.6.0.tgz#9ea331766084288634a9247fcd8b84f16ff4ba07" - integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== - -"@gnosis.pm/gp-v2-contracts@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gnosis.pm/gp-v2-contracts/-/gp-v2-contracts-1.1.2.tgz#0453bb097377dc63cf46ee195f7e521d429f7e22" - integrity sha512-BvZMNS+fwITb+qs+trs2fyvYksa6MPjjLze9AOXPnvcKVYFEGwG6cfsecBswEMo+xevLIQNDyF7HZRhN7ply8w== - -"@gnosis.pm/safe-apps-sdk@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-7.5.0.tgz#59033c62726abacbf988286ea57250e7581444e8" - integrity sha512-OaF2agv2zfPExzedv1eOGtt3W+rnwGFwtuP37epofhsnDgqS/JMPoqyDLRSvyWYlU22OeKvtghTppvRfaEnUTw== - dependencies: - "@gnosis.pm/safe-react-gateway-sdk" "^3.1.3" - ethers "^5.6.8" - -"@gnosis.pm/safe-react-gateway-sdk@^3.1.3": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-react-gateway-sdk/-/safe-react-gateway-sdk-3.5.2.tgz#088b0d5db2eb7524ff4141795ecf948adc40c97c" - integrity sha512-6P2uJMnhHcJeErd/t13ChH6sda+vUIOqcrcUDKyWCNXpcmMniPcZzkQxZ8cYz186gQFbslsHSjQ6twnh4yhXUw== - dependencies: - cross-fetch "^3.1.5" - -"@graphql-typed-document-node/core@^3.1.1": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04" - integrity sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA== +"@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== "@headlessui/react@1.7.11": version "1.7.11" @@ -1548,226 +1569,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1778,30 +1583,30 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -1809,14 +1614,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@json-rpc-tools/provider@^1.5.5": version "1.7.6" resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6" @@ -1903,18 +1700,6 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/dom@^10.15.3": - version "10.15.5" - resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.5.tgz#4af18f8136d85c2fc997cac98121c969f6731802" - integrity sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA== - dependencies: - "@motionone/animation" "^10.15.1" - "@motionone/generators" "^10.15.1" - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" - hey-listen "^1.0.8" - tslib "^2.3.1" - "@motionone/dom@^10.15.5", "@motionone/dom@^10.16.2": version "10.16.2" resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.16.2.tgz#0c44df8ee3d1cfc50ee11d27050b27824355a61a" @@ -1974,122 +1759,87 @@ "@motionone/dom" "^10.16.2" tslib "^2.3.1" -"@next/bundle-analyzer@^13.1.1": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-13.2.3.tgz#8a34f595f9d213b39fc68f5246f59d5043f8c6f4" - integrity sha512-hPAT0ja6zHmEIrLYAWmdtpS07FCuUL8TxKP5ekzel+NoP4cNOykBS2Y265ciJwurpisd8Ux29g3QgeyBBSBnLA== +"@next/bundle-analyzer@^13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-13.4.4.tgz#629f318007291203645a335e5387f50053223a98" + integrity sha512-OxdqGfzElMjcLDw3XkUTqpEjyB/R2n3sOjiWuOGm414j5hAD2AIcXWv4q6FTN9rERgojrkw+g3z5yeLZgJ3YKg== dependencies: webpack-bundle-analyzer "4.7.0" -"@next/env@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.3.tgz#77ca49edb3c1d7c5263bb8f2ebe686080e98279e" - integrity sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow== +"@next/env@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.4.tgz#46b620f6bef97fe67a1566bf570dbb791d40c50a" + integrity sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg== -"@next/eslint-plugin-next@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.3.tgz#5af8ddeac6dbe028c812a0e59c41952c004d95d5" - integrity sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q== +"@next/eslint-plugin-next@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.4.tgz#0df2f699e61b97c65035f87f54795f799e12fead" + integrity sha512-5jnh7q6I15efnjR/rR+/TGTc9hn53g3JTbEjAMjmeQiExKqEUgIXqrHI5zlTNlNyzCPkBB860/ctxXheZaF2Vw== dependencies: glob "7.1.7" -"@next/font@^13.1.1": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/font/-/font-13.2.3.tgz#96d8a1b431425b47e01f3620118d570e2148e312" - integrity sha512-7EHzk0f7FVYICLUZTpyPk93IfcTUao++Xt1Sgb+Zk5dVOCYHabqLtlF5ywSoXIqyFlo0qlshEBxsrzHAGTWkDw== - -"@next/swc-android-arm-eabi@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz#85eed560c87c7996558c868a117be9780778f192" - integrity sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw== - -"@next/swc-android-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz#8ac54ca9795a48afc4631b4823a4864bd5db0129" - integrity sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w== - -"@next/swc-darwin-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz#f674e3c65aec505b6d218a662ade3fe248ccdbda" - integrity sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w== - -"@next/swc-darwin-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz#a15ea7fb4c46034a8f5e387906d0cad08387075a" - integrity sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw== - -"@next/swc-freebsd-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz#f7ac6ae4f7d706ff2431f33e40230a554c8c2cbc" - integrity sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g== - -"@next/swc-linux-arm-gnueabihf@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz#84ad9e9679d55542a23b590ad9f2e1e9b2df62f7" - integrity sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA== - -"@next/swc-linux-arm64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz#56f9175bc632d647c60b9e8bedc0875edf92d8b7" - integrity sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA== - -"@next/swc-linux-arm64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz#7d4cf00e8f1729a3de464da0624773f5d0d14888" - integrity sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g== - -"@next/swc-linux-x64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz#17de404910c4ebf7a1d366b19334d7e27e126ab0" - integrity sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ== - -"@next/swc-linux-x64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz#07cb7b7f3a3a98034e2533f82638a9b099ba4ab1" - integrity sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA== - -"@next/swc-win32-arm64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz#b9ac98c954c71ec9de45d3497a8585096b873152" - integrity sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ== - -"@next/swc-win32-ia32-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz#5ec48653a48fd664e940c69c96bba698fdae92eb" - integrity sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA== - -"@next/swc-win32-x64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz#cd432f280beb8d8de5b7cd2501e9f502e9f3dd72" - integrity sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q== - -"@noble/curves@1.0.0", "@noble/curves@~1.0.0": +"@next/font@^13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/font/-/font-13.4.4.tgz#513632591a1041e39c1020022c0995ca78dde4fc" + integrity sha512-iYmL/O0rV9NS8a2UXuRoZOzImz8Q0mM8bAmxtj8nccrpwZ6iOOZlbf2d0Genczl4wtuXRXVPR8goGjJM4C2SDg== + +"@next/swc-darwin-arm64@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz#8c14083c2478e2a9a8d140cce5900f76b75667ff" + integrity sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw== + +"@next/swc-darwin-x64@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz#5fe01c65c80fcb833c8789fd70f074ea99893864" + integrity sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg== + +"@next/swc-linux-arm64-gnu@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz#f2e071f38e8a6cdadf507cc5d28956f73360d064" + integrity sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA== + +"@next/swc-linux-arm64-musl@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz#23bf75c544e54562bc24ec1be036e4bd9cf89e2c" + integrity sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A== + +"@next/swc-linux-x64-gnu@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz#bd42590950a01957952206f89cf5622e7c9e4196" + integrity sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ== + +"@next/swc-linux-x64-musl@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz#907d81feb1abec3daec0ecb61e3f39b56e7aeafe" + integrity sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA== + +"@next/swc-win32-arm64-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz#1d754d2bb10bdf9907c0acc83711438697c3b5fe" + integrity sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A== + +"@next/swc-win32-ia32-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz#77b2c7f7534b675d46e46301869e08d504d23956" + integrity sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg== + +"@next/swc-win32-x64-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz#faab69239f8a9d0be7cd473e65f5a07735ef7b0e" + integrity sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw== + +"@noble/curves@1.0.0", "@noble/curves@^1.0.0", "@noble/curves@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" integrity sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw== dependencies: "@noble/hashes" "1.3.0" -"@noble/ed25519@^1.7.0": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" - integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== - -"@noble/hashes@1.3.0", "@noble/hashes@~1.3.0": +"@noble/hashes@1.3.0", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== -"@noble/hashes@^1.1.2": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/secp256k1@^1.6.3": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2117,22 +1867,27 @@ integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== "@pkgr/utils@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" - integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" + integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== dependencies: cross-spawn "^7.0.3" + fast-glob "^3.2.12" is-glob "^4.0.3" - open "^8.4.0" + open "^9.1.0" picocolors "^1.0.0" - tiny-glob "^0.2.9" - tslib "^2.4.0" + tslib "^2.5.0" "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@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" @@ -2204,9 +1959,9 @@ picomatch "^2.3.1" "@rushstack/eslint-patch@^1.1.3": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz#f5635b36fc0dad96ef1e542a302cd914230188c0" + integrity sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w== "@safe-global/safe-apps-provider@^0.15.2": version "0.15.2" @@ -2269,26 +2024,26 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@sentry-internal/tracing@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.52.1.tgz#c98823afd2f9814466fa26f24a1a54fe63b27c24" - integrity sha512-6N99rE+Ek0LgbqSzI/XpsKSLUyJjQ9nychViy+MP60p1x+hllukfTsDbNtUNrPlW0Bx+vqUrWKkAqmTFad94TQ== +"@sentry-internal/tracing@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.53.1.tgz#85517ba93ee721424c865706f7ff4eaab1569e6d" + integrity sha512-a4H4rvVdz0XDGgNfRqc7zg6rMt2P1P05xBmgfIfztYy94Vciw1QMdboNiT7einr8ra8wogdEaK4Pe2AzYAPBJQ== dependencies: - "@sentry/core" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/core" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" tslib "^1.9.3" -"@sentry/browser@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.52.1.tgz#f112ca4170bb5023f050bdcbcce5621b475a46eb" - integrity sha512-HrCOfieX68t+Wj42VIkraLYwx8kN5311SdBkHccevWs2Y2dZU7R9iLbI87+nb5kpOPQ7jVWW7d6QI/yZmliYgQ== +"@sentry/browser@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.53.1.tgz#1efd94cd9a56360fc401b99043eeaaac3da2e70e" + integrity sha512-1zas2R6riJaj0k7FoeieCW0SuC7UyKaBGA6jEG2LsgIqyD7IDOlF3BPZ4Yt08GFav0ImpyhGn5Vbrq5JLbeQdw== dependencies: - "@sentry-internal/tracing" "7.52.1" - "@sentry/core" "7.52.1" - "@sentry/replay" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry-internal/tracing" "7.53.1" + "@sentry/core" "7.53.1" + "@sentry/replay" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" tslib "^1.9.3" "@sentry/cli@^1.74.6": @@ -2303,88 +2058,88 @@ proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.52.1.tgz#4de702937ba8944802bb06eb8dfdf089c39f6bab" - integrity sha512-36clugQu5z/9jrit1gzI7KfKbAUimjRab39JeR0mJ6pMuKLTTK7PhbpUAD4AQBs9qVeXN2c7h9SVZiSA0UDvkg== +"@sentry/core@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.53.1.tgz#c091a9d7fd010f8a2cb1dd71d949a8e453e35d4c" + integrity sha512-DAH8IJNORJJ7kQLqsZuhMkN6cwJjXzFuuUoZor7IIDHIHjtl51W+2F3Stg3+I3ZoKDfJfUNKqhipk2WZjG0FBg== dependencies: - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" tslib "^1.9.3" -"@sentry/integrations@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.52.1.tgz#e8a5988477e8d295fa1d90ce5628c1a7794c2a09" - integrity sha512-4uejF01723wzEHjcP5AcNcV+Z/6U27b1LyaDu0jY3XDry98MMjhS/ASzecLpaEFxi3dh/jMTUrNp1u7WMj59Lg== +"@sentry/integrations@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.53.1.tgz#49db5eb5dbacab4509e22fd1ca1b94d155cae7c1" + integrity sha512-Y2Sq+nkYG2FFYWZ3NLDUdFdJQEAfSNL95MeoIAjpAioHmPBOHXoRwUzAMlaOR/2VibaKwGEIGwsHofj7RwtjrA== dependencies: - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" localforage "^1.8.1" tslib "^1.9.3" -"@sentry/nextjs@^7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.52.1.tgz#82acfb43b3670f67626a99503f645d15ec9f4350" - integrity sha512-zd1StGdAn0vSS21l4gVyzCtfnEbJ+e5ZIgLZiaLUOSvKdMAtIlhXTotpn7CILIx+PzjOwiRFWp1XtSoU4FZyZg== +"@sentry/nextjs@^7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.53.1.tgz#5c95cff16839f1e77ef1d554fb3af30681c180eb" + integrity sha512-b8wQwk0NPNsRKHc9wCik0suXrfN/HYWIKYWOCQkdSm01DnPD/J5ROBHzo4XfuaI+pwAIgboSrKIr3e2DjUnMRw== dependencies: "@rollup/plugin-commonjs" "24.0.0" - "@sentry/core" "7.52.1" - "@sentry/integrations" "7.52.1" - "@sentry/node" "7.52.1" - "@sentry/react" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/core" "7.53.1" + "@sentry/integrations" "7.53.1" + "@sentry/node" "7.53.1" + "@sentry/react" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" "@sentry/webpack-plugin" "1.20.0" chalk "3.0.0" rollup "2.78.0" stacktrace-parser "^0.1.10" tslib "^1.9.3" -"@sentry/node@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.52.1.tgz#3939bf47485461d990f6fe192d9fdced6ed95953" - integrity sha512-n3frjYbkY/+eZ5RTQMaipv6Hh9w3ia40GDeRK6KJQit7OLKLmXisD+FsdYzm8Jc784csSvb6HGGVgqLpO1p9Og== +"@sentry/node@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.53.1.tgz#d4c47477cf4305e352b511635d1d3d4d160e8bd7" + integrity sha512-B4ax8sRd54xj4ad+4eY2EOKNt0Mh1NjuLW1zUKS8HW3h0bmuaDFzGuhEVvEY5H4SaV6tZKj1c0dvnMnyUbYkhA== dependencies: - "@sentry-internal/tracing" "7.52.1" - "@sentry/core" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry-internal/tracing" "7.53.1" + "@sentry/core" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/react@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.52.1.tgz#5f30919f4680493558c5233165b2092d2b59f6d1" - integrity sha512-RRH+GJE5TNg5QS86bSjSZuR2snpBTOO5/SU9t4BOqZMknzhMVTClGMm84hffJa9pMPMJPQ2fWQAbhrlD8RcF6w== +"@sentry/react@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.53.1.tgz#885f743b4b48639a4d415ee401632f02e59dbbbb" + integrity sha512-eEOY/peBepSD/nhPn4SU77aYdjQfAI1svOqpG4sbpjaGZU1P6L7+IIGmip8l2T68oPEeKDaiH9Qy/3uxu55B/Q== dependencies: - "@sentry/browser" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/browser" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/replay@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.52.1.tgz#272a0bcb79bb9ffce99b5dcaf864f18d729ce0da" - integrity sha512-A+RaUmpU9/yBHnU3ATemc6wAvobGno0yf5R6fZYkAFoo2FCR2YG6AXxkTazymIf8v2DnLGaSDORYDPdhQClU9A== +"@sentry/replay@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.53.1.tgz#543272827d3ca034c62b0a822503d0a57c9229e7" + integrity sha512-5He5JLJiYLeWtXHC53z2ZzfbgAedafbHNZVS4+MBCOtydCk7cnuyJ0gGV6Rfxej/lZSNXZxOdW7HeMhzBtZCxw== dependencies: - "@sentry/core" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/core" "7.53.1" + "@sentry/types" "7.53.1" + "@sentry/utils" "7.53.1" -"@sentry/types@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.52.1.tgz#bcff6d0462d9b9b7b9ec31c0068fe02d44f25da2" - integrity sha512-OMbGBPrJsw0iEXwZ2bJUYxewI1IEAU2e1aQGc0O6QW5+6hhCh+8HO8Xl4EymqwejjztuwStkl6G1qhK+Q0/Row== +"@sentry/types@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.53.1.tgz#3eefbad851f2d0deff67285d7e976d23d7d06a41" + integrity sha512-/ijchRIu+jz3+j/zY+7KRPfLSCY14fTx5xujjbOdmEKjmIHQmwPBdszcQm40uwofrR8taV4hbt5MFN+WnjCkCw== -"@sentry/utils@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.52.1.tgz#4a3e49b918f78dba4524c924286210259020cac5" - integrity sha512-MPt1Xu/jluulknW8CmZ2naJ53jEdtdwCBSo6fXJvOTI0SDqwIPbXDVrsnqLAhVJuIN7xbkj96nuY/VBR6S5sWg== +"@sentry/utils@7.53.1": + version "7.53.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.53.1.tgz#b1f9f1dd4de7127287ad5027c2bd1133c5590486" + integrity sha512-DKJA1LSUOEv4KOR828MzVuLh+drjeAgzyKgN063OEKmnirgjgRgNNS8wUgwpG0Tn2k6ANZGCwrdfzPeSBxshKg== dependencies: - "@sentry/types" "7.52.1" + "@sentry/types" "7.53.1" tslib "^1.9.3" "@sentry/webpack-plugin@1.20.0": @@ -2395,25 +2150,6 @@ "@sentry/cli" "^1.74.6" webpack-sources "^2.0.0 || ^3.0.0" -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@solana/buffer-layout@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" @@ -2422,23 +2158,22 @@ buffer "~6.0.3" "@solana/web3.js@^1.70.1": - version "1.73.3" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.3.tgz#60e6bd68f6f364d4be360b1e0a03a0a68468a029" - integrity sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg== + version "1.77.3" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.77.3.tgz#2cbeaa1dd24f8fa386ac924115be82354dfbebab" + integrity sha512-PHaO0BdoiQRPpieC1p31wJsBaxwIOWLh8j2ocXNKX8boCQVldt26Jqm2tZE4KlrvnCIV78owPLv1pEUgqhxZ3w== dependencies: "@babel/runtime" "^7.12.5" - "@noble/ed25519" "^1.7.0" - "@noble/hashes" "^1.1.2" - "@noble/secp256k1" "^1.6.3" + "@noble/curves" "^1.0.0" + "@noble/hashes" "^1.3.0" "@solana/buffer-layout" "^4.0.0" agentkeepalive "^4.2.1" bigint-buffer "^1.1.5" bn.js "^5.0.0" borsh "^0.7.0" bs58 "^4.0.1" - buffer "6.0.1" + buffer "6.0.3" fast-stable-stringify "^1.0.0" - jayson "^3.4.4" + jayson "^4.1.0" node-fetch "^2.6.7" rpc-websockets "^7.5.1" superstruct "^0.14.2" @@ -2587,10 +2322,10 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" -"@swc/helpers@0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== dependencies: tslib "^2.4.0" @@ -2602,9 +2337,9 @@ mini-svg-data-uri "^1.2.3" "@tailwindcss/line-clamp@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.2.tgz#f353c5a8ab2c939c6267ac5b907f012e5ee130f9" - integrity sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw== + version "0.4.4" + resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz#767cf8e5d528a5d90c9740ca66eb079f5e87d423" + integrity sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g== "@tailwindcss/typography@^0.5.9": version "0.5.9" @@ -2636,16 +2371,16 @@ "@tanstack/query-persist-client-core" "4.29.11" "@tanstack/react-query-persist-client@^4.28.0": - version "4.29.11" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.29.11.tgz#4ca3f86c023f22dc29f01a91d2903f26f1fefe9c" - integrity sha512-UeAtTbzdbCq7XgYbqskIKPZV2zmAzzF946p7VOg9/YPgGvrXojs3PEdViE+Ue8o6foLPqf5MOUcAu1yo/cCqgQ== + version "4.29.12" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.29.12.tgz#a3d3dc8dc4318689b275f7329db3619b710401e1" + integrity sha512-rh6zZJB+3j8lr+YsEkVadnqmUELmqNFZQzGGsHS5col/YOjYsMe9ppqaUjIMJ2aXnFXye50sbe4KxHhSGoaNVw== dependencies: "@tanstack/query-persist-client-core" "4.29.11" "@tanstack/react-query@^4.28.0": - version "4.29.11" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.11.tgz#053bd6e9d63ce07a523976263ae78a5e130eb2ad" - integrity sha512-aLaOAhBnCr12YKPjDsZOc0fAtkyaW7f9KfVfw49oYpfe0H9EPXBUgDBIKJ8qdHF3uGzTVSMcmpiw1Za41BLZlw== + version "4.29.12" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.12.tgz#de111cf1d6c389b86acacfaf972302914cfa1208" + integrity sha512-zhcN6+zF6cxprxhTHQajHGlvxgK8npnp9uLe9yaWhGc6sYcPWXzyO4raL4HomUzQOPzu3jLvkriJQ7BOrDM8vA== dependencies: "@tanstack/query-core" "4.29.11" use-sync-external-store "^1.2.0" @@ -2678,38 +2413,17 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== +"@types/chai-subset@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" + integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@types/chai" "*" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" - integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== - dependencies: - "@babel/types" "^7.3.0" +"@types/chai@*", "@types/chai@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/connect@^3.4.33": version "3.4.35" @@ -2719,9 +2433,9 @@ "@types/node" "*" "@types/d3-array@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" - integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.5.tgz#857c1afffd3f51319bbc5b301956aca68acaa7b8" + integrity sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A== "@types/d3-color@*": version "3.1.0" @@ -2770,9 +2484,9 @@ integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== "@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== dependencies: "@types/ms" "*" @@ -2794,44 +2508,10 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.1": - version "29.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" - integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -2848,10 +2528,10 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^18.11.18": - version "18.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" - integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== +"@types/node@*", "@types/node@^20.2.5": + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/node@^12.12.54": version "12.20.55" @@ -2863,34 +2543,22 @@ resolved "https://registry.yarnpkg.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f" integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A== -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^18.0.0": +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.4": version "18.2.4" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== dependencies: "@types/react" "*" -"@types/react-dom@^18.0.10": - version "18.0.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" - integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.0.26": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== +"@types/react@*", "@types/react@^18.2.7": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.7.tgz#dfb4518042a3117a045b8c222316f83414a783b3" + integrity sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2904,19 +2572,14 @@ "@types/node" "*" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/trusted-types@^2.0.2": version "2.0.3" @@ -2930,102 +2593,144 @@ dependencies: "@types/node" "*" -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== +"@typescript-eslint/eslint-plugin@^5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.47.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" - integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/type-utils" "5.54.1" - "@typescript-eslint/utils" "5.54.1" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.42.0", "@typescript-eslint/parser@^5.47.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" - integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== +"@typescript-eslint/parser@^5.42.0", "@typescript-eslint/parser@^5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" - integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" -"@typescript-eslint/type-utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" - integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== dependencies: - "@typescript-eslint/typescript-estree" "5.54.1" - "@typescript-eslint/utils" "5.54.1" + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" - integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== -"@typescript-eslint/typescript-estree@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" - integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" - integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== +"@typescript-eslint/utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" - integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" +"@vitejs/plugin-react@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" + integrity sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ== + dependencies: + "@babel/core" "^7.21.4" + "@babel/plugin-transform-react-jsx-self" "^7.21.0" + "@babel/plugin-transform-react-jsx-source" "^7.19.6" + react-refresh "^0.14.0" + +"@vitest/expect@0.31.4": + version "0.31.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.31.4.tgz#115c517404488bf3cb6ce4ac411c40d8e86891b8" + integrity sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg== + dependencies: + "@vitest/spy" "0.31.4" + "@vitest/utils" "0.31.4" + chai "^4.3.7" + +"@vitest/runner@0.31.4": + version "0.31.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.31.4.tgz#e99abee89132a500d9726a53b58dfc9160db1078" + integrity sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg== + dependencies: + "@vitest/utils" "0.31.4" + concordance "^5.0.4" + p-limit "^4.0.0" + pathe "^1.1.0" + +"@vitest/snapshot@0.31.4": + version "0.31.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.31.4.tgz#59a42046fec4950a1ac70cf0ec64aada3b995559" + integrity sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA== + dependencies: + magic-string "^0.30.0" + pathe "^1.1.0" + pretty-format "^27.5.1" + +"@vitest/spy@0.31.4": + version "0.31.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.31.4.tgz#fce8e348cea32deff79996d116c67893b19cc47d" + integrity sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag== + dependencies: + tinyspy "^2.1.0" + +"@vitest/utils@0.31.4": + version "0.31.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.31.4.tgz#5cfdcecfd604a7dbe3972cfe0f2b1e0af1246ad2" + integrity sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ== + dependencies: + concordance "^5.0.4" + loupe "^2.3.6" + pretty-format "^27.5.1" + "@wagmi/chains@0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-0.3.1.tgz#5d8e8ef1bcd8637c9f3ead8626595b12a01c35e4" @@ -3157,15 +2862,7 @@ "@walletconnect/safe-json" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-types@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz#b79519f679cd6a5fa4a1bea888f27c1916689a20" - integrity sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg== - dependencies: - keyvaluestorage-interface "^1.0.0" - tslib "1.14.1" - -"@walletconnect/jsonrpc-types@^1.0.3": +"@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== @@ -3173,7 +2870,7 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.7", "@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": version "1.0.8" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -3182,15 +2879,6 @@ "@walletconnect/jsonrpc-types" "^1.0.3" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz#7fa58e6671247e64e189828103282e6258f5330f" - integrity sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg== - dependencies: - "@walletconnect/environment" "^1.0.1" - "@walletconnect/jsonrpc-types" "^1.0.2" - tslib "1.14.1" - "@walletconnect/jsonrpc-ws-connection@^1.0.11": version "1.0.11" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.11.tgz#1ce59d86f273d576ca73385961303ebd44dd923f" @@ -3308,14 +2996,7 @@ tslib "1.14.1" uint8arrays "^3.0.0" -"@walletconnect/safe-json@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.1.tgz#9813fa0a7a544b16468730c2d7bed046ed160957" - integrity sha512-Fm7e31oSYY15NQr8SsLJheKAy5L744udZf2lJKcz6wFmPJEzf7hOF0866o/rrldRzJnjZ4H2GJ45pFudsnLW5A== - dependencies: - tslib "1.14.1" - -"@walletconnect/safe-json@^1.0.2": +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== @@ -3434,10 +3115,10 @@ motion "10.15.5" qrcode "1.5.3" -"@yearn-finance/web-lib@^0.20.39": - version "0.20.39" - resolved "https://registry.yarnpkg.com/@yearn-finance/web-lib/-/web-lib-0.20.39.tgz#bc2e55acca76a7637980783fabf68ff1a1f91d72" - integrity sha512-iRft/dSi0NWXEiec02fdB7cc0M6NLowCEPDGhsmmOQ26PjogaiYm0HILSf/5e4BGeAyNChm0kMlkehUKOeJvNA== +"@yearn-finance/web-lib@^0.20.48": + version "0.20.48" + resolved "https://registry.yarnpkg.com/@yearn-finance/web-lib/-/web-lib-0.20.48.tgz#e44cbfd8d16b6969d96bdbae9482ae3a3b56d800" + integrity sha512-9ET4i8z27PxE/D+AZVHh+e77p78SOMuGEVEsPawZZT8UHrrXIAL7kXRDnaCSbM3vRgiV8eorz9Swc4szU9PU5w== dependencies: "@headlessui/react" "1.7.11" "@ledgerhq/iframe-provider" "^0.4.3" @@ -3492,31 +3173,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.0.0: +acorn-walk@^8.0.0, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.0.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.8.0: +acorn@^8.0.4, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -3581,13 +3243,6 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -3612,7 +3267,12 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^3.0.3, anymatch@~3.1.2: +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3625,13 +3285,6 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -3644,6 +3297,14 @@ aria-query@^5.0.0, aria-query@^5.1.3: dependencies: deep-equal "^2.0.5" +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" @@ -3708,6 +3369,11 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -3740,13 +3406,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.13: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== +autoprefixer@^10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -3758,9 +3424,9 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.6.2: - version "4.6.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" - integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== axios@^0.21.0: version "0.21.4" @@ -3769,10 +3435,10 @@ axios@^0.21.0: dependencies: follow-redirects "^1.14.0" -axios@^1.2.2, axios@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== +axios@^1.3.3, axios@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -3785,19 +3451,6 @@ axobject-query@^3.1.1: dependencies: deep-equal "^2.0.5" -babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - babel-loader@9.1.0, babel-loader@^8.2.5: version "9.1.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.0.tgz#839e9ae88aea930864ef9ec0f356dfca96ecf238" @@ -3806,7 +3459,7 @@ babel-loader@9.1.0, babel-loader@^8.2.5: find-cache-dir "^3.3.2" schema-utils "^4.0.0" -babel-loader@^9.1.0: +babel-loader@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== @@ -3814,76 +3467,29 @@ babel-loader@^9.1.0: find-cache-dir "^3.3.2" schema-utils "^4.0.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== dependencies: "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" + "@babel/helper-define-polyfill-provider" "^0.4.0" balanced-match@^1.0.0: version "1.0.2" @@ -3912,6 +3518,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + bigint-buffer@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" @@ -3952,6 +3563,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + bn.js@5.2.1, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^5.0.0, bn.js@^5.1.1, 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" @@ -3966,6 +3582,13 @@ borsh@^0.7.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4005,22 +3628,15 @@ browserify-aes@^1.0.6: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== +browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== dependencies: - fast-json-stable-stringify "2.x" + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" @@ -4029,13 +3645,6 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - 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" @@ -4064,14 +3673,6 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" - integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -4105,6 +3706,25 @@ bump@^0.2.5: resolved "https://registry.yarnpkg.com/bump/-/bump-0.2.5.tgz#16d5567b75e77ea6597a805c10294c578495b47b" integrity sha512-d4CZYvcP317+twjo7PhGd+EptYjvw83itgaxbJtJnHE64qH29qMtqAQ5vb3x3Su7WuaPjow88GBgp0FDBxbm8w== +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4123,20 +3743,28 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: + version "1.0.30001492" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b" + integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: - version "1.0.30001464" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" - integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" chalk@3.0.0: version "3.0.0" @@ -4163,10 +3791,10 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -char-regex@^1.0.2: +check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" @@ -4188,11 +3816,6 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - 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" @@ -4201,11 +3824,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - classnames@^2.2.5: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -4232,30 +3850,11 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - clsx@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -4275,7 +3874,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -4308,6 +3907,11 @@ commander@^2.20.0, commander@^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== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4328,16 +3932,25 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.6.0, convert-source-map@^1.7.0: +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== + dependencies: + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" + js-string-escape "^1.0.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" + well-known-symbols "^2.0.0" + +convert-source-map@^1.7.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" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -4350,10 +3963,10 @@ copy-to-clipboard@^3.3.3: dependencies: toggle-selection "^1.0.6" -core-js-compat@^3.25.1: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" - integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: browserslist "^4.21.5" @@ -4381,11 +3994,11 @@ create-hmac@^1.1.4: sha.js "^2.4.8" cross-fetch@^3.1.4, cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + version "3.1.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" + integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== dependencies: - node-fetch "2.6.7" + node-fetch "^2.6.11" cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -4419,14 +4032,14 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: - version "3.2.2" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e" - integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" @@ -4499,6 +4112,13 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== + dependencies: + time-zone "^1.0.0" + dayjs@^1.11.7: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" @@ -4540,21 +4160,24 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" deep-equal@^2.0.5: - version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" - integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" is-arguments "^1.1.1" - is-array-buffer "^3.0.1" + is-array-buffer "^3.0.2" is-date-object "^1.0.5" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -4562,7 +4185,7 @@ deep-equal@^2.0.5: object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" @@ -4579,16 +4202,34 @@ deep-is@^0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -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== +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== @@ -4596,11 +4237,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -4639,20 +4275,6 @@ detect-libc@^2.0.0, detect-libc@^2.0.1: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detective@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" - dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -4666,15 +4288,10 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - dijkstrajs@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" - integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" + integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== dir-glob@^3.0.1: version "3.0.1" @@ -4714,11 +4331,6 @@ dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" -drange@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/drange/-/drange-1.1.1.tgz#b2aecec2aab82fcef11dbbd7b9e32b83f8f6c0b8" - integrity sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA== - drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -4751,16 +4363,16 @@ eip1193-provider@1.0.1: "@json-rpc-tools/provider" "^1.5.5" ejs@^3.1.6: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284: - version "1.4.325" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.325.tgz#7b97238a61192d85d055d97f3149832b3617d37b" - integrity sha512-K1C03NT4I7BuzsRdCU5RWkgZxtswnKDYM6/eMhkEXqKu4e5T+ck610x3FPzu1y7HVFSiQKZqP16gnJzPpji1TQ== +electron-to-chromium@^1.4.411: + version "1.4.416" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz#7291f704168d3842ae4da3ae9fdc7bfbeb97d116" + integrity sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA== elliptic@6.5.4, elliptic@^6.5.2: version "6.5.4" @@ -4775,11 +4387,6 @@ elliptic@6.5.4, elliptic@^6.5.2: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4802,33 +4409,26 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.12.0: + version "5.14.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4836,8 +4436,8 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" @@ -4845,18 +4445,19 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: is-string "^1.0.7" is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-get-iterator@^1.1.2: +es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== @@ -4908,6 +4509,34 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +esbuild@^0.17.5: + version "0.17.19" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -4918,22 +4547,17 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -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@^4.0.0: version "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@^13.1.1: - version "13.2.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.2.3.tgz#8a952bfd856f492684a30dd5fcdc8979c97c1cc2" - integrity sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ== +eslint-config-next@^13.4.4: + version "13.4.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.4.tgz#95356e96f3796ad0587fa2aaa51ec4a81e71cedc" + integrity sha512-z/PMbm6L0iC/fwISULxe8IVy4DtNqZk2wQY711o35klenq70O6ns82A8yuMVCFjHC0DIyB2lyugesRtuk9u8dQ== dependencies: - "@next/eslint-plugin-next" "13.2.3" + "@next/eslint-plugin-next" "13.4.4" "@rushstack/eslint-patch" "^1.1.3" "@typescript-eslint/parser" "^5.42.0" eslint-import-resolver-node "^0.3.6" @@ -4952,23 +4576,24 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: is-core-module "^2.11.0" resolve "^1.22.1" -eslint-import-resolver-typescript@^3.5.2, eslint-import-resolver-typescript@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz#db5ed9e906651b7a59dd84870aaef0e78c663a05" - integrity sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ== +eslint-import-resolver-typescript@^3.5.2, eslint-import-resolver-typescript@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== dependencies: debug "^4.3.4" - enhanced-resolve "^5.10.0" - get-tsconfig "^4.2.0" - globby "^13.1.2" - is-core-module "^2.10.0" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" is-glob "^4.0.3" - synckit "^0.8.4" + synckit "^0.8.5" eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -4979,7 +4604,7 @@ eslint-plugin-brackets@^0.1.3: dependencies: lodash "^4.17.2" -eslint-plugin-import@^2.26.0: +eslint-plugin-import@^2.26.0, eslint-plugin-import@^2.27.5: version "2.27.5" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== @@ -5027,7 +4652,7 @@ eslint-plugin-react-hooks@^4.5.0, eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.31.7, eslint-plugin-react@^7.32.0: +eslint-plugin-react@^7.31.7, eslint-plugin-react@^7.32.2: version "7.32.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== @@ -5048,15 +4673,15 @@ eslint-plugin-react@^7.31.7, eslint-plugin-react@^7.32.0: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-plugin-simple-import-sort@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-8.0.0.tgz#9d9a2372b0606e999ea841b10458a370a6ccc160" - integrity sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw== +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" + integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== -eslint-plugin-tailwindcss@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.10.1.tgz#727193f78cc22b9b358ef5f99de2177d173a5209" - integrity sha512-NLPZ6b6nd/8CgGNMQ6NDiPUfBLQpSGu/u9RyX3MCZOwzNs2dFt1OamNAiRuo3Ixh7Gv4t5UcAcdNt8z74UDJkA== +eslint-plugin-tailwindcss@^3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.12.1.tgz#ab7fc554b97872208460aac6921f391683c992f1" + integrity sha512-LyIRV0rx6prTpJZsSCXSNJ34Yry3Nj9OJwvzh1xTsiG6+UCnAPW1Bx41s7vZzUDKMlwFgpUN9Me+NK12T4DHYg== dependencies: fast-glob "^3.2.5" postcss "^8.4.4" @@ -5081,37 +4706,28 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@8.31.0: - version "8.31.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" - integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== +eslint@8.41.0: + version "8.41.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== dependencies: - "@eslint/eslintrc" "^1.4.1" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5121,24 +4737,22 @@ eslint@8.31.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -5146,26 +4760,20 @@ eslint@8.31.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + eslint-visitor-keys "^3.4.1" -esquery@^1.4.0: +esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -5199,7 +4807,7 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -esutils@^2.0.2: +esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -5260,7 +4868,7 @@ ethereumjs-util@6.1.0: safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethers@^5.6.8, ethers@^5.7.2: +ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5342,26 +4950,30 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +execa@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== extract-files@^9.0.0: version "9.0.0" @@ -5378,10 +4990,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-equals@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-4.0.3.tgz#72884cc805ec3c6679b99875f6b7654f39f0e8c7" - integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-equals@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.12" @@ -5394,7 +5011,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5426,13 +5043,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5445,7 +5055,7 @@ file-uri-to-path@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.1: +filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== @@ -5561,13 +5171,11 @@ framer-motion@7.6.15: optionalDependencies: "@emotion/is-prop-valid" "^0.8.2" -framer-motion@^8.0.4: - version "8.5.5" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-8.5.5.tgz#e30e9087bfc9b3367459f83b4d9fe7efd5acade6" - integrity sha512-5IDx5bxkjWHWUF3CVJoSyUVOtrbAxtzYBBowRE2uYI/6VYhkEBD+rbTHEGuUmbGHRj6YqqSfoG7Aa1cLyWCrBA== +framer-motion@^10.12.16: + version "10.12.16" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.12.16.tgz#ccba11d216ac370c6bc65fcd9953a61deb54f071" + integrity sha512-w/SfWEIWJkYSgRHYBmln7EhcNo31ao8Xexol8lGXf1pR/tlnBtf1HcxoUmEiEh6pacB4/geku5ami53AAQWHMQ== dependencies: - "@motionone/dom" "^10.15.3" - hey-listen "^1.0.8" tslib "^2.4.0" optionalDependencies: "@emotion/is-prop-valid" "^0.8.2" @@ -5599,7 +5207,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5619,7 +5227,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5629,18 +5237,24 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: @@ -5648,12 +5262,7 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -5666,10 +5275,12 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-tsconfig@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.4.0.tgz#64eee64596668a81b8fce18403f94f245ee0d4e5" - integrity sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ== +get-tsconfig@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" + integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== + dependencies: + resolve-pkg-maps "^1.0.0" github-from-package@0.0.0: version "0.0.0" @@ -5690,6 +5301,18 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -5702,7 +5325,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5744,11 +5367,6 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globalyzer@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -5761,10 +5379,10 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^13.1.2: - version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" - integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== dependencies: dir-glob "^3.0.1" fast-glob "^3.2.11" @@ -5783,15 +5401,10 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - goober@^2.1.10: - version "2.1.12" - resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.12.tgz#6c1645314ac9a68fe76408e1f502c63df8a39042" - integrity sha512-yXHAvO08FU1JgTXX6Zn6sYCUFfB/OJSX8HHjDSgerZHZmFKAb08cykp5LBw5QnmyMcZyPRMqkdyHUSSzge788Q== + version "2.1.13" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.13.tgz#e3c06d5578486212a76c9eba860cbc3232ff6d7c" + integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ== gopd@^1.0.1: version "1.0.1" @@ -5801,11 +5414,6 @@ gopd@^1.0.1: get-intrinsic "^1.1.3" graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5815,6 +5423,20 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql-request@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-4.3.0.tgz#b934e08fcae764aa2cdc697d3c821f046cb5dbf2" + integrity sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow== + dependencies: + cross-fetch "^3.1.5" + extract-files "^9.0.0" + form-data "^3.0.0" + graphql-request@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-5.2.0.tgz#a05fb54a517d91bb2d7aefa17ade4523dc5ebdca" @@ -5825,6 +5447,14 @@ graphql-request@^5.1.0: extract-files "^9.0.0" form-data "^3.0.0" +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + graphql@^16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" @@ -5926,11 +5556,6 @@ hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - html2canvas@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" @@ -5952,6 +5577,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -5980,9 +5610,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" - integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== + version "4.3.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -5992,14 +5622,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -6023,7 +5645,7 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.3, internal-slot@^1.0.4: +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -6045,7 +5667,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1: +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== @@ -6054,11 +5676,6 @@ is-array-buffer@^3.0.1: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" @@ -6091,10 +5708,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.10.0, is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -6105,11 +5722,16 @@ 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: +is-docker@^2.0.0: 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" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6120,11 +5742,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -6144,6 +5761,13 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -6237,6 +5861,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -6314,62 +5943,20 @@ isomorphic-ws@^4.0.1: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" -jayson@^3.4.4: - version "3.7.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" - integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== +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" @@ -6381,351 +5968,9 @@ jayson@^3.4.4: eyes "^0.1.8" isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" - lodash "^4.17.20" uuid "^8.3.2" ws "^7.4.5" -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -6744,49 +5989,26 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -js-sdsl@^4.1.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" - integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -6804,11 +6026,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - 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: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" @@ -6847,11 +6064,16 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@>=2.2.2, json5@^1.0.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: +json5@>=2.2.2, json5@^1.0.2, json5@^2.2.0, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -6879,6 +6101,11 @@ jsonpointer@^5.0.0: array-includes "^3.1.5" object.assign "^4.1.3" +just-performance@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/just-performance/-/just-performance-4.3.0.tgz#cc2bc8c9227f09e97b6b1df4cd0de2df7ae16db1" + integrity sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q== + keccak@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" @@ -6903,11 +6130,6 @@ keyvaluestorage-interface@^1.0.0: resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -6940,11 +6162,18 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -lilconfig@^2.0.5, lilconfig@^2.0.6: +lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +limiter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-2.1.0.tgz#d38d7c5b63729bb84fb0c4d8594b7e955a5182a2" + integrity sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw== + dependencies: + just-performance "4.3.0" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -6975,6 +6204,11 @@ lit@2.7.4: lit-element "^3.3.0" lit-html "^2.7.0" +local-pkg@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" + integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== + localforage@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" @@ -7016,11 +6250,6 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -7031,7 +6260,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7043,6 +6272,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^2.3.1, loupe@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7081,24 +6317,26 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -make-dir@^3.0.0, make-dir@^3.0.2: +magic-string@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== dependencies: - tmpl "1.0.5" + blueimp-md5 "^2.10.0" md5.js@^1.3.4: version "1.3.5" @@ -7144,6 +6382,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -7195,6 +6438,16 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" +mlly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.3.0.tgz#3184cb80c6437bda861a9f452ae74e3434ed9cd1" + integrity sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw== + dependencies: + acorn "^8.8.2" + pathe "^1.1.0" + pkg-types "^1.0.3" + ufo "^1.1.2" + motion@10.15.5: version "10.15.5" resolved "https://registry.yarnpkg.com/motion/-/motion-10.15.5.tgz#d336ddbdd37bc28bb99fbb243fe309df6c685ad6" @@ -7232,15 +6485,24 @@ multiformats@^9.4.2: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.14.0, nan@^2.2.1: version "2.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.4, nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== napi-build-utils@^1.0.1: version "1.0.2" @@ -7269,10 +6531,10 @@ next-pwa@^5.6.0: workbox-webpack-plugin "^6.5.4" workbox-window "^6.5.4" -next-seo@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.15.0.tgz#b1a90508599774982909ea44803323c6fb7b50f4" - integrity sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg== +next-seo@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.0.0.tgz#4568dc61a44dbdf5fe5ff44156cd0ff8804889a2" + integrity sha512-jKKt1p1z4otMA28AyeoAONixVjdYmgFCWwpEFtu+DwRHQDllVX3RjtyXbuCQiUZEfQ9rFPBpAI90vDeLZlMBdg== next-transpile-modules@^10.0.0: version "10.0.0" @@ -7281,35 +6543,33 @@ next-transpile-modules@^10.0.0: dependencies: enhanced-resolve "^5.10.0" -next@^13.1.1: - version "13.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-13.2.3.tgz#92d170e7aca421321f230ff80c35c4751035f42e" - integrity sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w== +next@^13.4.4: + version "13.4.4" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.4.tgz#d1027c8d77f4c51be0b39f671b4820db03c93e60" + integrity sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA== dependencies: - "@next/env" "13.2.3" - "@swc/helpers" "0.4.14" + "@next/env" "13.4.4" + "@swc/helpers" "0.5.1" + busboy "1.6.0" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.1.1" + zod "3.21.4" optionalDependencies: - "@next/swc-android-arm-eabi" "13.2.3" - "@next/swc-android-arm64" "13.2.3" - "@next/swc-darwin-arm64" "13.2.3" - "@next/swc-darwin-x64" "13.2.3" - "@next/swc-freebsd-x64" "13.2.3" - "@next/swc-linux-arm-gnueabihf" "13.2.3" - "@next/swc-linux-arm64-gnu" "13.2.3" - "@next/swc-linux-arm64-musl" "13.2.3" - "@next/swc-linux-x64-gnu" "13.2.3" - "@next/swc-linux-x64-musl" "13.2.3" - "@next/swc-win32-arm64-msvc" "13.2.3" - "@next/swc-win32-ia32-msvc" "13.2.3" - "@next/swc-win32-x64-msvc" "13.2.3" + "@next/swc-darwin-arm64" "13.4.4" + "@next/swc-darwin-x64" "13.4.4" + "@next/swc-linux-arm64-gnu" "13.4.4" + "@next/swc-linux-arm64-musl" "13.4.4" + "@next/swc-linux-x64-gnu" "13.4.4" + "@next/swc-linux-x64-musl" "13.4.4" + "@next/swc-win32-arm64-msvc" "13.4.4" + "@next/swc-win32-ia32-msvc" "13.4.4" + "@next/swc-win32-x64-msvc" "13.4.4" node-abi@^3.3.0: - version "3.33.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.33.0.tgz#8b23a0cec84e1c5f5411836de6a9b84bccf26e7f" - integrity sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog== + version "3.43.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.43.0.tgz#468dc09af3c262ef2fb3a0d2ff34cf8fba61952a" + integrity sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ== dependencies: semver "^7.3.5" @@ -7318,22 +6578,15 @@ node-addon-api@^2.0.0: 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-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-fetch@^2.6.7, node-fetch@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== +node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.6.8: + version "2.6.11" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" @@ -7342,15 +6595,10 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7369,6 +6617,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + nprogress@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" @@ -7384,7 +6639,7 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== @@ -7466,13 +6721,21 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.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== +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" is-wsl "^2.2.0" opener@^1.5.2: @@ -7499,13 +6762,20 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -7542,16 +6812,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.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== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -7572,6 +6832,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -7582,12 +6847,22 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.0.tgz#e2e13f6c62b31a3289af4ba19886c230f295ec03" + integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -7654,18 +6929,27 @@ pino@7.11.0: sonic-boom "^2.2.1" thread-stream "^0.15.1" -pirates@^4.0.4: +pirates@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" @@ -7681,15 +6965,6 @@ popmotion@11.0.5: style-value-types "5.1.2" tslib "2.4.0" -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - postcss-import@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" @@ -7699,32 +6974,32 @@ postcss-import@^15.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-js@^4.0.0: +postcss-js@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== dependencies: lilconfig "^2.0.5" - yaml "^1.10.2" + yaml "^2.1.1" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.0.11" -postcss-nesting@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" - integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== +postcss-nesting@^11.2.2: + version "11.2.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-11.2.2.tgz#ddedfea5a1fdcd8d753298d82297ad15d5640c0f" + integrity sha512-aOTiUniAB1bcPE6GGiynWRa6PZFPhOTAm5q3q5cem6QeSijIHHkWr6gs65ukCZMXeak8yXeZVbBJET3VM+HlhA== dependencies: "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" @@ -7738,9 +7013,9 @@ postcss-selector-parser@6.0.10: util-deprecate "^1.0.2" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7764,25 +7039,20 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.0.9, postcss@^8.4.20, postcss@^8.4.4: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.4: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -preact@^10.12.0: +preact@^10.12.0, preact@^10.5.9: version "10.15.1" resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== -preact@^10.5.9: - version "10.13.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.13.0.tgz#f8bd3cf257a4dbe41da71a52131b79916d4ca89d" - integrity sha512-ERdIdUpR6doqdaSIh80hvzebHB7O6JxycOhyzAeLEchqOq/4yueslQbfnPwXaNhAYacFTyCclhwkEbOumT0tHw== - prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -7811,7 +7081,7 @@ 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== -pretty-format@^27.0.2: +pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -7820,15 +7090,6 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - process-warning@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" @@ -7839,14 +7100,6 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prop-types@^15, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -7879,11 +7132,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - qrcode@1.5.3, qrcode@^1.5.1: version "1.5.3" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" @@ -7895,9 +7143,9 @@ qrcode@1.5.3, qrcode@^1.5.1: yargs "^15.3.1" qs@^6.10.3, qs@^6.11.0: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + 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" @@ -7931,19 +7179,6 @@ quick-format-unescaped@^4.0.3: resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -randexp@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738" - integrity sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w== - dependencies: - drange "^1.0.2" - ret "^0.2.0" - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -7970,9 +7205,9 @@ react-dom@^18.2.0: scheduler "^0.23.0" react-fast-compare@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz#53933d9e14f364281d6cba24bfed7a4afb808b5f" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-hot-toast@2.4.0: version "2.4.0" @@ -7991,20 +7226,15 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.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-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-paginate@^8.1.4: - version "8.1.4" - resolved "https://registry.yarnpkg.com/react-paginate/-/react-paginate-8.1.4.tgz#f62bfef4f07bb420f3a994e0284d1065a865a6b9" - integrity sha512-c3rxjcTEqeDQa6LqXifxLeFguY2qy2CHGRphVjHLFFMGfIHyaJ+v3bOvIlLYEeohwQ1q+cQpknjsqBVrkc/SNA== +react-paginate@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/react-paginate/-/react-paginate-8.2.0.tgz#947c3dcb444a6c16c1bcf8361871aa135baa3dcd" + integrity sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw== dependencies: prop-types "^15" @@ -8016,19 +7246,24 @@ react-popper@^2.3.0: react-fast-compare "^3.0.1" warning "^4.0.2" -react-resize-detector@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-7.1.2.tgz#8ef975dd8c3d56f9a5160ac382ef7136dcd2d86c" - integrity sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw== +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-resize-detector@^8.0.4: + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-8.1.0.tgz#1c7817db8bc886e2dbd3fbe3b26ea8e56be0524a" + integrity sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w== dependencies: lodash "^4.17.21" -react-smooth@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.2.tgz#0ef24213628cb13bf4305194a050e1db4302a3a1" - integrity sha512-pgqSp1q8rAGtF1bXQE0m3CHGLNfZZh5oA5o1tsPLXRHnKtkujMIJ8Ws5nO1mTySZf1c4vgwlEk+pHi3Ln6eYLw== +react-smooth@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.3.tgz#2845fa8f22914f2e4445856d5688fb8a7d72f3ae" + integrity sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg== dependencies: - fast-equals "^4.0.3" + fast-equals "^5.0.0" react-transition-group "2.9.0" react-transition-group@2.9.0: @@ -8041,10 +7276,10 @@ react-transition-group@2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-wrap-balancer@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/react-wrap-balancer/-/react-wrap-balancer-0.2.4.tgz#1f112df575958400f253186aa9a7fd5ee9528ed1" - integrity sha512-MVL9/Tw1X72t0i5Y/2j3YmSx1vkJJ22b5Vb+vZ/IOEdq7r9JPNzTfnfkB8wrl98Jwx+F6VCwJXmU7a1lT5PtCA== +react-wrap-balancer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/react-wrap-balancer/-/react-wrap-balancer-0.5.0.tgz#a63b14b6a125c8f15509e6f8be7e2faaae5ad8a9" + integrity sha512-5vwe5QDczQ9zwAtv3iEVj8hdMbNwQtM/QlSNLJfDUzRE9noPtxevb+Kon916Mu2RUorCrAtashQ1F9BVBjdeZg== react@18.2.0, react@^18.2.0: version "18.2.0" @@ -8061,9 +7296,9 @@ read-cache@^1.0.0: pify "^2.3.0" readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" - integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -8088,17 +7323,17 @@ recharts-scale@^0.4.4: dependencies: decimal.js-light "^2.4.1" -recharts@^2.2.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.4.3.tgz#23b7cd988423449b04a826baa057675b833789b1" - integrity sha512-/hkRHTQShEOKDYd2OlKLIvGA0X9v/XVO/mNeRoDHg0lgFRL2KbGzeqVnStI3mMfORUZ6Hak4JbQ+uDiin1Foqg== +recharts@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.6.2.tgz#f26dc7954ab9df8e49a50aa36ed9c7177bd0a0a5" + integrity sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig== dependencies: classnames "^2.2.5" eventemitter3 "^4.0.1" lodash "^4.17.19" react-is "^16.10.2" - react-resize-detector "^7.1.2" - react-smooth "^2.0.1" + react-resize-detector "^8.0.4" + react-smooth "^2.0.2" recharts-scale "^0.4.4" reduce-css-calc "^2.1.8" victory-vendor "^36.6.8" @@ -8135,24 +7370,19 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpu-core@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" - integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" @@ -8183,38 +7413,17 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.20.0: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.2: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -8232,11 +7441,6 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -ret@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" - integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -8295,6 +7499,13 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" +rollup@^3.21.0: + version "3.23.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.23.0.tgz#b8d6146dac4bf058ee817f92820988e9b358b564" + integrity sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ== + optionalDependencies: + fsevents "~2.3.2" + rpc-websockets@^7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" @@ -8308,6 +7519,13 @@ rpc-websockets@^7.5.1: bufferutil "^4.0.1" utf-8-validate "^5.0.2" +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8358,10 +7576,10 @@ 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.57.1: - version "1.58.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" - integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== +sass@^1.62.1: + version "1.62.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" + integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -8403,22 +7621,15 @@ secp256k1@^3.0.1: nan "^2.14.0" safe-buffer "^5.1.2" -semver@7.x: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" @@ -8449,16 +7660,16 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -sharp@^0.31.3: - version "0.31.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688" - integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== +sharp@^0.32.1: + version "0.32.1" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.1.tgz#41aa0d0b2048b2e0ee453d9fcb14ec1f408390fe" + integrity sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg== dependencies: color "^4.2.3" detect-libc "^2.0.1" - node-addon-api "^5.0.0" + node-addon-api "^6.1.0" prebuild-install "^7.1.1" - semver "^7.3.8" + semver "^7.5.0" simple-get "^4.0.1" tar-fs "^2.1.1" tunnel-agent "^0.6.0" @@ -8484,6 +7695,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -8519,11 +7735,6 @@ sirv@^1.0.7: mrmime "^1.0.0" totalist "^1.0.0" -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -8551,14 +7762,6 @@ 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-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - 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" @@ -8567,7 +7770,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +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" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -8594,17 +7797,10 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== stacktrace-parser@^0.1.10: version "0.1.10" @@ -8613,6 +7809,11 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +std-env@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.3.tgz#a54f06eb245fdcfef53d56f3c0251f1d5c3d01fe" + integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -8633,20 +7834,17 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8669,6 +7867,15 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -8715,11 +7922,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - strip-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" @@ -8730,6 +7932,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" @@ -8747,6 +7954,13 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strip-literal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" + integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== + dependencies: + acorn "^8.8.2" + style-value-types@5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.1.2.tgz#6be66b237bd546048a764883528072ed95713b62" @@ -8762,6 +7976,19 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" +sucrase@^3.32.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.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" @@ -8798,14 +8025,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swr@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.1.0.tgz#10245d5a50f6d5d208ea9278f76839ab3058d5b8" - integrity sha512-4hYl5p3/KalQ1MORealM79g/DtLohmud6yyfXw5l4wjtFksYUnocRFudvyaoUtgj3FrVNK9lS25Av9dsZYvz0g== +swr@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.1.5.tgz#688effa719c03f6d35c66decbb0f8e79c7190399" + integrity sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw== dependencies: use-sync-external-store "^1.2.0" -synckit@^0.8.4: +synckit@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== @@ -8813,34 +8040,34 @@ synckit@^0.8.4: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" -tailwindcss@^3.2.4, tailwindcss@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07" - integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== +tailwindcss@^3.2.7, tailwindcss@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" didyoumean "^1.2.2" dlv "^1.1.3" fast-glob "^3.2.12" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.6" + jiti "^1.18.2" + lilconfig "^2.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.0.9" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" + resolve "^1.22.2" + sucrase "^3.32.0" tapable@^2.2.0: version "2.2.1" @@ -8898,35 +8125,26 @@ tempy@^0.6.0: unique-string "^2.0.0" terser-webpack-plugin@^5.3.3: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" -terser@^5.0.0, terser@^5.16.5: - version "5.16.5" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a" - integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== +terser@^5.0.0, terser@^5.16.8: + version "5.17.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" + integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" source-map-support "~0.5.20" -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - 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" @@ -8944,6 +8162,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thread-stream@^0.15.1: version "0.15.2" resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" @@ -8956,18 +8188,30 @@ thread-stream@^0.15.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tiny-glob@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" - integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== - dependencies: - globalyzer "0.1.0" - globrex "^0.1.2" +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +tinybench@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.0.tgz#4711c99bbf6f3e986f67eb722fed9cddb3a68ba5" + integrity sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA== + +tinypool@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.5.0.tgz#3861c3069bf71e4f1f5aa2d2e6b3aaacc278961e" + integrity sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ== + +tinyspy@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.1.1.tgz#9e6371b00c259e5c5b301917ca18c01d40ae558c" + integrity sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== to-fast-properties@^2.0.0: version "2.0.0" @@ -8998,24 +8242,15 @@ tr46@1.0.1, tr46@^1.0.1, tr46@~0.0.3: dependencies: punycode "^2.1.0" -ts-jest@^29.1.0: - version "29.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" - integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-loader@^9.4.2: - version "9.4.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" - integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +ts-loader@^9.4.3: + version "9.4.3" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.3.tgz#55cfa7c28dd82a2de968ae45c3adb75fb888b27e" + integrity sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -9043,9 +8278,9 @@ tslib@2.4.0: integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== tsutils@^3.21.0: version "3.21.0" @@ -9068,7 +8303,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: +type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -9083,11 +8318,6 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" @@ -9119,6 +8349,11 @@ typescript@^5.0.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +ufo@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" + integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== + uint8arrays@^3.0.0, uint8arrays@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" @@ -9171,15 +8406,20 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -9231,15 +8471,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - valtio@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.10.5.tgz#7852125e3b774b522827d96bd9c76d285c518678" @@ -9249,9 +8480,9 @@ valtio@1.10.5: use-sync-external-store "1.2.0" victory-vendor@^36.6.8: - version "36.6.8" - resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.8.tgz#5a1c555ca99a39fdb66a6c959c8426eb834893a2" - integrity sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ== + version "36.6.10" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.10.tgz#e7e3646deaf0e850bc60dffdad6d7a4abee40632" + integrity sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA== dependencies: "@types/d3-array" "^3.0.3" "@types/d3-ease" "^3.0.0" @@ -9268,10 +8499,10 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" -viem@^0.3.28, viem@^0.3.37: - version "0.3.37" - resolved "https://registry.yarnpkg.com/viem/-/viem-0.3.37.tgz#0426863c52f4b77547bd3216b8ac66e32a38dda5" - integrity sha512-17jycP/1Hy9DsDpHlaaI7bbAHBDYGfVYHN6j0ltE7A/S30RXhPVFe4LAPRfmG+xR2QBq8xSUpjO78cRgDLBjZQ== +viem@^0.3.28, viem@^0.3.41: + version "0.3.41" + resolved "https://registry.yarnpkg.com/viem/-/viem-0.3.41.tgz#ca89f17ff5d4ef3dcd8f73b2f01e4b288188327c" + integrity sha512-QC9nSyqrhVv4CRVS58CgVS3rilikG8EAVPlkP+R6u8FDx6kLVe0Bz6bYrxzrcmR/lASko6Pz6N7xA7jngGkqvw== dependencies: "@adraffy/ens-normalize" "1.9.0" "@noble/curves" "1.0.0" @@ -9283,10 +8514,64 @@ viem@^0.3.28, viem@^0.3.37: isomorphic-ws "5.0.0" ws "8.12.0" -wagmi@^1.0.5, wagmi@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-1.0.8.tgz#c51b001c9f0949a10d26bac1defe7e2e1b7d1b89" - integrity sha512-xcDTt9vyy6R9kP7Yk4G+qGDDcqVmULXisAIFf2G6tekk1u9YWcUuqOYQAG8H7AS0Kz1hPYJech3ge1UGuoF3fg== +vite-node@0.31.4: + version "0.31.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.31.4.tgz#0437f76c35fa83f0a868d3fb5896ca9e164291f5" + integrity sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + mlly "^1.2.0" + pathe "^1.1.0" + picocolors "^1.0.0" + vite "^3.0.0 || ^4.0.0" + +"vite@^3.0.0 || ^4.0.0": + version "4.3.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" + integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.23" + rollup "^3.21.0" + optionalDependencies: + fsevents "~2.3.2" + +vitest@^0.31.3: + version "0.31.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.31.4.tgz#5abe02562675262949c10e40811f348a80f6b2a6" + integrity sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ== + dependencies: + "@types/chai" "^4.3.5" + "@types/chai-subset" "^1.3.3" + "@types/node" "*" + "@vitest/expect" "0.31.4" + "@vitest/runner" "0.31.4" + "@vitest/snapshot" "0.31.4" + "@vitest/spy" "0.31.4" + "@vitest/utils" "0.31.4" + acorn "^8.8.2" + acorn-walk "^8.2.0" + cac "^6.7.14" + chai "^4.3.7" + concordance "^5.0.4" + debug "^4.3.4" + local-pkg "^0.4.3" + magic-string "^0.30.0" + pathe "^1.1.0" + picocolors "^1.0.0" + std-env "^3.3.2" + strip-literal "^1.0.1" + tinybench "^2.5.0" + tinypool "^0.5.0" + vite "^3.0.0 || ^4.0.0" + vite-node "0.31.4" + why-is-node-running "^2.2.2" + +wagmi@^1.0.5, wagmi@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-1.0.9.tgz#2483e448720d9ccd013ad0f2943ba7c4dfd775e6" + integrity sha512-LIExrD43Kyy8YIG02AQ4+heQc324h4lgTsQcpIDkLcOnwCV24uNSe/Ib1/F2k0N51uUsFoBdB5hjAaT6Ww7AtQ== dependencies: "@tanstack/query-sync-storage-persister" "^4.27.1" "@tanstack/react-query" "^4.28.0" @@ -9295,13 +8580,6 @@ wagmi@^1.0.5, wagmi@^1.0.8: abitype "0.8.2" use-sync-external-store "^1.2.0" -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -9347,6 +8625,11 @@ webpack-sources@^1.4.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -9386,9 +8669,9 @@ which-collection@^1.0.1: is-weakset "^2.0.1" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.9" @@ -9409,35 +8692,43 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wido@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/wido/-/wido-0.2.2.tgz#5c960bf1451379286703c249cbae24fc5a44458d" - integrity sha512-e8xHKmmlF2EtWdQFqOhgW1ndwEKSrbJkSnUlnayw/KW0JCALY3Z/B9uYC4wZveq+AOchTPBdAzOTF3swuLiSeQ== +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +wido@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/wido/-/wido-0.2.8.tgz#294fb4cf489b2b6d76ce9822f7366873a2eee146" + integrity sha512-jPjVdVXfGTXeR+DM7ZHF8UONeaScpQQZh+drhRSZQZEKO6rl3jZnJAZUGNQn/49mJ9JmU8gLFPSePyDssz64UQ== word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workbox-background-sync@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" - integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-broadcast-update@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" - integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-build@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" - integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== +workbox-build@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -9461,132 +8752,132 @@ workbox-build@6.5.4: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.4" - workbox-broadcast-update "6.5.4" - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-google-analytics "6.5.4" - workbox-navigation-preload "6.5.4" - workbox-precaching "6.5.4" - workbox-range-requests "6.5.4" - workbox-recipes "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - workbox-streams "6.5.4" - workbox-sw "6.5.4" - workbox-window "6.5.4" - -workbox-cacheable-response@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" - integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== - dependencies: - workbox-core "6.5.4" - -workbox-core@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" - integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== - -workbox-expiration@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" - integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-google-analytics@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" - integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== dependencies: - workbox-background-sync "6.5.4" - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-navigation-preload@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" - integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-precaching@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" - integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== +workbox-precaching@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-range-requests@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" - integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-recipes@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" - integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== dependencies: - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-precaching "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-routing@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" - integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== +workbox-routing@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-strategies@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" - integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== +workbox-strategies@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-streams@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" - integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" -workbox-sw@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" - integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== workbox-webpack-plugin@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" - integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.4" + workbox-build "6.6.1" -workbox-window@6.5.4, workbox-window@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" - integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== +workbox-window@6.6.1, workbox-window@^6.5.4: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.4" + workbox-core "6.6.1" wrap-ansi@^6.2.0: version "6.2.0" @@ -9597,28 +8888,11 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" @@ -9635,11 +8909,11 @@ ws@^7.3.1, ws@^7.4.0, ws@^7.4.5, ws@^7.5.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.5.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -xtend@^4.0.1, xtend@^4.0.2: +xtend@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -9649,11 +8923,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -9664,10 +8933,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== yargs-parser@^18.1.2: version "18.1.3" @@ -9677,11 +8946,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -9699,33 +8963,17 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zocker@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/zocker/-/zocker-1.3.0.tgz#b7c6eac6eda5bc1504c0f82461983bbe1c781b9f" - integrity sha512-RFZjFxpBn8jW09tz5xKVxGtpm1pEBlh2onWFEGMBajx9uP8Iu5oyDQh+lzDPFzNrlayAbEA9LmKqB8iWoVk/vw== - dependencies: - "@faker-js/faker" "^7.6.0" - randexp "^0.5.3" +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zod@^3.21.4: +zod@3.21.4, zod@^3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==