From a2a71969fd1e7da369f4b059002aebfb8664ce08 Mon Sep 17 00:00:00 2001 From: Major <90963895+Majorfi@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:41:36 +0200 Subject: [PATCH] Feat/wagmi vaults (#208) * feat: wagmi in vaults * lint: all \t to spaces for const, let and functions (#209) * fix: lint * fix: lint * Feat/wagmi veyfi (#210) * feat: migrate to wagmi * Update pages/vaults/factory.tsx * Feat/wagmi yBribe (#211) * feat: migrate to wagmi * Feat/wagmi ybal (#214) * feat: init yBal * fix: lint * Update apps/common/components/AppHeader.tsx Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> * fix: remove unused test prop * feat: refactor useCurrentApp * fix: reduce lines * fix: extract HeadLabel * fix: add more strict checks * fix: reduce complexity * fix: extract Row * fix: invalid code * fix: possible undef * feat: update lib and var names * feat: update options from/to * wip: yBal no yCRV * fix: remove veBal * feat: cleaning imports and options * feat: bal zap integration WIP * fix: onCatchError * test: yBal actions#zaap * test: simulateZapForMinOut * refactor: Expect zap to be called with BigNumber * feat: update lib and var names * feat: new contract version * wip: ugly * fix: Ethers mock * feat: Mock providers * fix: invalid BigNumber value * feat: update tests * feat: always test * fix: switch env to node for tests * fix: remove some logs * feat: wip yBal * feat: wip yBal * feat: ylock ui * feat: useFetch for fetching stybal vault (#202) Co-authored-by: Major <90963895+Majorfi@users.noreply.github.com> * fix: conflicts and yCRV clean * feat: smol refactor * feat: yBal pull * feat: yBal migration * fix: spacings * fix: slippage * fix: remove extra props for arrow down * fix: add sentry to handleSettle * fix: tabs * Update apps/ycrv/utils/actions.ts Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> * fix: set const * fix: set const * feat: update solvers (#217) * feat: update solvers * fix: dynamic imports * fix: some lint issues * fix: removing wdyu * fix: remove log * fix: enable * fix: endpoint to path * Feat/wagmi address (#219) * feat: remove all wagmiAddress * fix: linting * fix: typing issues * fix: remove useless assert and add namecheck * fix: remove duplicate import * Update apps/vaults/contexts/useStakingRewards.tsx Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> * Feat/wagmi-bribesfix (#220) * feat: remove v3 declaration * fix: transform strings to addresses * fix: bribe results * fix: revert ui changes. Later * fix: some bit of UI * fix: responsiveness * Update apps/common/schemas/curveSchemas.ts Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> * fix: transform toAddress easy mode * feat/Refactor tx handlers (#222) * feat: wagmi handleTX init * fix: remove some level of complexity * feat: migrate the common actions * feat: suggestion to make bigInt |undefined to be sure to check stuff * fix: remove stupid suggestion * feat: migrate actions * fix: Types * fix: Cannot set bigint to type undefined * Update apps/common/utils/toWagmiProvider.tsx * fix: remove useless toString() (#223) --------- Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --------- Co-authored-by: Chef Karelian <78794805+karelianpie@users.noreply.github.com> Co-authored-by: Karelian Pie --- .eslintignore | 3 +- .github/workflows/test.yml | 4 +- apps/common/components/AmountInput.tsx | 4 +- apps/common/components/AppHeader.tsx | 32 +- apps/common/components/Apps.tsx | 20 +- .../components/BalanceReminderPopover.tsx | 37 +- apps/common/components/HeroTimer.tsx | 2 +- apps/common/components/ImageWithFallback.tsx | 21 +- apps/common/components/ListHead.tsx | 17 +- apps/common/components/ListHero.tsx | 18 +- apps/common/components/Meta.tsx | 2 +- apps/common/components/SearchBar.tsx | 4 +- apps/common/components/SettingsOverwrite.tsx | 16 +- apps/common/components/Switch.tsx | 6 +- apps/common/components/TokenDropdown.tsx | 4 +- apps/common/components/TokenIcon.tsx | 2 +- apps/common/components/ValueAnimation.tsx | 8 +- apps/common/contexts/useCurve.tsx | 6 +- apps/common/contexts/useMenu.tsx | 10 +- apps/common/contexts/useWallet.tsx | 43 +- apps/common/hooks/useAllowances.tsx | 6 +- apps/common/hooks/useBalance.tsx | 2 +- apps/common/hooks/useBalances.tsx | 80 +- apps/common/hooks/useCurrentApp.tsx | 32 +- apps/common/hooks/useFetch.ts | 4 +- apps/common/hooks/useTimer.tsx | 22 +- apps/common/hooks/useTokenPrice.tsx | 2 +- apps/common/hooks/useWhyDidYouUpdate.tsx | 38 + apps/common/icons/ArrowDown.tsx | 2 +- apps/common/icons/IconArrow.tsx | 2 +- apps/common/icons/IconArrowRight.tsx | 2 +- apps/common/icons/IconChevron.tsx | 2 +- apps/common/icons/IconChevronPlain.tsx | 2 +- apps/common/icons/LogoYearn.tsx | 2 +- apps/common/icons/LogoYearnBlue.tsx | 2 +- apps/common/icons/MessageIcon.tsx | 2 +- apps/common/schemas/curveSchemas.ts | 20 +- apps/common/types/curves.tsx | 4 +- apps/common/types/types.tsx | 2 +- apps/common/utils/actions.tsx | 362 +- apps/common/utils/index.tsx | 20 +- apps/common/utils/toWagmiProvider.tsx | 66 +- apps/vaults/components/ImageWithOverlay.tsx | 2 +- apps/vaults/components/RewardsTab.tsx | 131 +- apps/vaults/components/SettingsPopover.tsx | 10 +- .../details/VaultActionsTabsWrapper.tsx | 12 +- .../components/details/VaultDetailsHeader.tsx | 12 +- .../details/actions/QuickActionsButtons.tsx | 34 +- .../details/actions/QuickActionsFrom.tsx | 31 +- .../details/actions/QuickActionsSwitch.tsx | 2 +- .../details/actions/QuickActionsTo.tsx | 9 +- .../details/tabs/VaultDetailsAbout.tsx | 13 +- .../details/tabs/VaultDetailsHistorical.tsx | 32 +- .../details/tabs/VaultDetailsStrategies.tsx | 37 +- .../details/tabs/VaultDetailsTabsWrapper.tsx | 31 +- .../details/tabs/findLatestApr.test.ts | 2 + .../graphs/GraphForStrategyReports.tsx | 16 +- .../graphs/GraphForVaultEarnings.tsx | 8 +- .../graphs/GraphForVaultPPSGrowth.tsx | 4 +- .../components/graphs/GraphForVaultTVL.tsx | 9 +- .../components/list/VaultListFactory.tsx | 44 +- .../components/list/VaultListOptions.tsx | 4 +- .../components/list/VaultsListEmpty.tsx | 20 +- .../list/VaultsListInternalMigrationRow.tsx | 2 +- .../components/list/VaultsListRetired.tsx | 2 +- apps/vaults/components/list/VaultsListRow.tsx | 6 +- apps/vaults/contexts/useActionFlow.tsx | 44 +- apps/vaults/contexts/useAppSettings.tsx | 14 +- apps/vaults/contexts/useSolver.tsx | 48 +- apps/vaults/contexts/useStakingRewards.tsx | 6 +- apps/vaults/contexts/useWalletForZaps.tsx | 14 +- apps/vaults/hooks/useAsync.ts | 6 +- apps/vaults/hooks/useFilteredVaults.ts | 2 +- apps/vaults/hooks/useFindVault.ts | 4 +- apps/vaults/hooks/usePortalsApi.ts | 92 +- apps/vaults/hooks/useSolverChainCoin.ts | 96 +- apps/vaults/hooks/useSolverCowswap.ts | 325 +- .../hooks/useSolverInternalMigration.ts | 101 +- apps/vaults/hooks/useSolverOptimismBooster.ts | 97 +- apps/vaults/hooks/useSolverPartnerContract.ts | 107 +- apps/vaults/hooks/useSolverPortals.ts | 174 +- apps/vaults/hooks/useSolverVanilla.ts | 96 +- apps/vaults/hooks/useSolverWido.ts | 175 +- apps/vaults/hooks/useSortVaults.ts | 34 +- .../hooks/useVaultEstimateOutFetcher.ts | 48 - apps/vaults/types/solvers.cowswap.ts | 22 - apps/vaults/types/solvers.ts | 4 - apps/vaults/utils/abi/vaultFactory.abi.ts | 2 +- apps/vaults/utils/abi/vaultMigrator.abi.ts | 2 +- apps/vaults/utils/actions.ts | 248 +- .../utils/actions/createVaultFromFactory.ts | 24 - apps/vaults/utils/getVaultEstimateOut.ts | 47 + apps/vaults/utils/index.ts | 12 + apps/vaults/utils/zapOptions.tsx | 5 +- apps/veyfi/Wrapper.tsx | 3 +- apps/veyfi/components/ClaimTab.tsx | 40 +- apps/veyfi/components/LockTab.tsx | 86 +- apps/veyfi/components/ManageLockTab.tsx | 80 +- apps/veyfi/contexts/useVotingEscrow.tsx | 157 +- apps/veyfi/hooks/useTransaction.ts | 70 - apps/veyfi/utils/actions.ts | 154 + apps/veyfi/utils/actions/votingEscrow.ts | 79 - apps/veyfi/utils/index.ts | 9 +- apps/veyfi/utils/validations.ts | 7 +- apps/ybal/Wrapper.tsx | 32 + .../ybal/components/CardTransactorWrapper.tsx | 253 + apps/ybal/components/CardZap.tsx | 229 + apps/ybal/components/Harvests.tsx | 75 + apps/ybal/components/HarvestsListHead.tsx | 37 + apps/ybal/components/HarvestsListRow.tsx | 80 + apps/ybal/components/header/YBalHeader.tsx | 21 + apps/ybal/constants/menu.ts | 4 + apps/ybal/constants/tokens.tsx | 104 + apps/ybal/contexts/useAllowanceHook.tsx | 48 + apps/ybal/contexts/useHoldingsHook.tsx | 109 + apps/ybal/contexts/useYBal.tsx | 85 + apps/ybal/utils/abi/styBal.abi.ts | 3 + apps/ybal/utils/abi/veBAL.abi.ts | 3 + apps/ybal/utils/abi/veBalPegHelper.abi.ts | 3 + apps/ybal/utils/abi/yBalBalancerPool.abi.ts | 3 + apps/ybal/utils/actions.test.ts | 162 + apps/ybal/utils/actions.ts | 113 + apps/ybal/utils/zapOptions.tsx | 124 + apps/ybribe/Wrapper.tsx | 5 +- .../components/bribe/GaugeBribeModal.tsx | 168 +- .../components/bribe/GaugeListEmpty.tsx | 12 +- apps/ybribe/components/bribe/GaugeListRow.tsx | 51 +- .../components/claim/GaugeListEmpty.tsx | 22 +- apps/ybribe/components/claim/GaugeListRow.tsx | 241 +- .../components/rewardFeed/RewardFeedTable.tsx | 2 - .../rewardFeed/RewardFeedTableHead.tsx | 2 +- .../rewardFeed/RewardFeedTableRow.tsx | 42 +- apps/ybribe/contexts/useBribes.tsx | 345 +- apps/ybribe/utils/abi/curveBribeV2.abi.tsx | 4 +- apps/ybribe/utils/abi/curveBribeV3.abi.tsx | 4 +- .../utils/abi/curveBribeV3Helper.abi.tsx | 4 +- apps/ybribe/utils/actions.ts | 66 + apps/ybribe/utils/actions/addReward.tsx | 21 - apps/ybribe/utils/actions/claimReward.tsx | 27 - apps/ybribe/utils/{index.tsx => index.ts} | 12 +- apps/ycrv/components/CardMigrateLegacy.tsx | 249 - .../ycrv/components/CardTransactorWrapper.tsx | 221 +- apps/ycrv/components/CardZap.tsx | 113 +- apps/ycrv/components/Harvests.tsx | 17 +- apps/ycrv/components/HarvestsListHead.tsx | 2 +- apps/ycrv/components/HarvestsListRow.tsx | 6 +- apps/ycrv/components/QuickActions.tsx | 8 +- apps/ycrv/constants/menu.ts | 1 - apps/ycrv/constants/tokens.tsx | 127 +- apps/ycrv/contexts/useAllowanceHook.tsx | 58 + apps/ycrv/contexts/useHoldingsHook.tsx | 88 + apps/ycrv/contexts/useYCRV.tsx | 194 +- ...rvYCrvLp.abi.tsx => curveCrvYCrvLp.abi.ts} | 0 .../abi/{styCRV.abi.tsx => styCRV.abi.ts} | 0 .../abi/{yveCRV.abi.tsx => yveCRV.abi.ts} | 0 apps/ycrv/utils/abi/zapCRV.abi.ts | 3 + apps/ycrv/utils/actions.ts | 57 +- apps/ycrv/utils/animations.tsx | 39 - apps/ycrv/utils/zapOptions.tsx | 143 - jest.config.js | 8 - next.config.js | 51 +- package.json | 87 +- pages/_app.tsx | 16 +- pages/api/getBatchBalances.test.ts | 2 + pages/api/getBatchBalances.tsx | 30 +- pages/index.tsx | 31 +- pages/vaults/[chainID]/[address].tsx | 6 +- pages/vaults/about.tsx | 4 +- pages/vaults/factory.tsx | 126 +- pages/vaults/index.tsx | 84 +- pages/vaults/migrate.unused.tsx | 24 - pages/veyfi/index.tsx | 10 +- pages/ybal/about.tsx | 182 + pages/ybal/index.tsx | 252 + pages/ybribe/about.tsx | 2 +- pages/ybribe/index.tsx | 87 +- pages/ybribe/offer-bribe.tsx | 69 +- pages/ycrv/about.tsx | 8 +- pages/ycrv/holdings.tsx | 304 -- pages/ycrv/index.tsx | 414 +- public/apps/ybal-manifest.json | 35 + tsconfig.json | 133 +- vitest.config.ts | 25 + yarn.lock | 4676 +++++++---------- 184 files changed, 7412 insertions(+), 7038 deletions(-) create mode 100644 apps/common/hooks/useWhyDidYouUpdate.tsx delete mode 100644 apps/vaults/hooks/useVaultEstimateOutFetcher.ts delete mode 100644 apps/vaults/types/solvers.cowswap.ts delete mode 100644 apps/vaults/utils/actions/createVaultFromFactory.ts create mode 100644 apps/vaults/utils/getVaultEstimateOut.ts delete mode 100644 apps/veyfi/hooks/useTransaction.ts create mode 100644 apps/veyfi/utils/actions.ts delete mode 100644 apps/veyfi/utils/actions/votingEscrow.ts create mode 100755 apps/ybal/Wrapper.tsx create mode 100755 apps/ybal/components/CardTransactorWrapper.tsx create mode 100755 apps/ybal/components/CardZap.tsx create mode 100644 apps/ybal/components/Harvests.tsx create mode 100644 apps/ybal/components/HarvestsListHead.tsx create mode 100755 apps/ybal/components/HarvestsListRow.tsx create mode 100644 apps/ybal/components/header/YBalHeader.tsx create mode 100644 apps/ybal/constants/menu.ts create mode 100755 apps/ybal/constants/tokens.tsx create mode 100644 apps/ybal/contexts/useAllowanceHook.tsx create mode 100644 apps/ybal/contexts/useHoldingsHook.tsx create mode 100755 apps/ybal/contexts/useYBal.tsx create mode 100644 apps/ybal/utils/abi/styBal.abi.ts create mode 100644 apps/ybal/utils/abi/veBAL.abi.ts create mode 100644 apps/ybal/utils/abi/veBalPegHelper.abi.ts create mode 100644 apps/ybal/utils/abi/yBalBalancerPool.abi.ts create mode 100644 apps/ybal/utils/actions.test.ts create mode 100644 apps/ybal/utils/actions.ts create mode 100755 apps/ybal/utils/zapOptions.tsx create mode 100644 apps/ybribe/utils/actions.ts delete mode 100755 apps/ybribe/utils/actions/addReward.tsx delete mode 100755 apps/ybribe/utils/actions/claimReward.tsx rename apps/ybribe/utils/{index.tsx => index.ts} (76%) delete mode 100755 apps/ycrv/components/CardMigrateLegacy.tsx create mode 100644 apps/ycrv/contexts/useAllowanceHook.tsx create mode 100644 apps/ycrv/contexts/useHoldingsHook.tsx rename apps/ycrv/utils/abi/{curveCrvYCrvLp.abi.tsx => curveCrvYCrvLp.abi.ts} (100%) rename apps/ycrv/utils/abi/{styCRV.abi.tsx => styCRV.abi.ts} (100%) rename apps/ycrv/utils/abi/{yveCRV.abi.tsx => yveCRV.abi.ts} (100%) create mode 100644 apps/ycrv/utils/abi/zapCRV.abi.ts delete mode 100755 apps/ycrv/utils/animations.tsx delete mode 100755 apps/ycrv/utils/zapOptions.tsx delete mode 100644 jest.config.js delete mode 100644 pages/vaults/migrate.unused.tsx create mode 100755 pages/ybal/about.tsx create mode 100755 pages/ybal/index.tsx delete mode 100755 pages/ycrv/holdings.tsx create mode 100755 public/apps/ybal-manifest.json create mode 100644 vitest.config.ts 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==