diff --git a/apps/balancer-tools/package.json b/apps/balancer-tools/package.json index 93232f8e0..14c0f21f3 100644 --- a/apps/balancer-tools/package.json +++ b/apps/balancer-tools/package.json @@ -45,6 +45,7 @@ "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", "copy-to-clipboard": "^3.3.3", + "downshift": "^8.1.0", "graphql-request": "5.1.0", "inputmask": "^5.0.8", "lodash": "^4.17.21", diff --git a/apps/balancer-tools/src/app/apr/(components)/MultiSelectDropdown.tsx b/apps/balancer-tools/src/app/apr/(components)/MultiSelectDropdown.tsx new file mode 100644 index 000000000..e560d0c6e --- /dev/null +++ b/apps/balancer-tools/src/app/apr/(components)/MultiSelectDropdown.tsx @@ -0,0 +1,151 @@ +"use client"; + +import { Cross1Icon, MagnifyingGlassIcon } from "@radix-ui/react-icons"; +import Downshift, { ControllerStateAndHelpers } from "downshift"; +import React, { useCallback, useState } from "react"; + +import { Badge } from "#/components/Badge"; +import { BaseInput } from "#/components/Input"; + +export const MultiSelectDropdown = ({ + items, + placeholderText, + onSelectionItemsChange, + initialSelectedItems, + ...rest +}: { + items: string[]; + placeholderText: string; + onSelectionItemsChange: (items: string[]) => void; + initialSelectedItems: string[]; +}) => { + const [selectedItems, setSelectedItems] = + useState(initialSelectedItems); + + function handleOnKeyDown(event: React.KeyboardEvent) { + const inputElement = event.target as HTMLInputElement; + if (!inputElement.value.length) { + if (event.key === "Backspace") { + const copySelectedItems = [...selectedItems]; + copySelectedItems.pop(); + setSelectedItems(copySelectedItems); + onSelectionItemsChange(copySelectedItems); + } + } + } + + const changeHandler = useCallback(() => { + return ( + selectedItem: string | null, + downshift: ControllerStateAndHelpers, + ) => { + if (!selectedItem) return; + const i = selectedItems.findIndex((item) => item === selectedItem); + if (i === -1) setSelectedItems([...selectedItems, selectedItem]); + onSelectionItemsChange([...selectedItems, selectedItem]); + downshift.clearSelection(); + }; + }, [selectedItems]); + + const removeSelectedItemByIndex = useCallback( + (i: number) => { + const temp = [...selectedItems]; + temp.splice(i, 1); + setSelectedItems(temp); + onSelectionItemsChange(temp); + }, + [selectedItems], + ); + + const getFilteredItems = useCallback( + (inputValue: string | null) => { + return items.filter( + (item) => + !selectedItems.find((selected) => selected === item) && + item.includes(String(inputValue)), + ); + }, + [selectedItems], + ); + + return ( +
+ + {({ + getLabelProps, + getInputProps, + getItemProps, + highlightedIndex, + isOpen, + toggleMenu, + inputValue, + }) => { + return ( +
+
+
+ +
+ {selectedItems.map((value, idx) => { + return ( + +
removeSelectedItemByIndex(idx)} + > + {value} + + + +
+
+ ); + })} + + { + toggleMenu(); + }} + onKeyDown={handleOnKeyDown} + className="hover:shadow-[0] focus:shadow-[0] shadow-none flex-1" + /> +
+
+
+ + {isOpen && ( +
+ {getFilteredItems(inputValue).length > 0 ? ( + getFilteredItems(inputValue).map((item, idx) => { + return ( +
+ {item} +
+ ); + }) + ) : ( +
+ Sorry, no token was found with the symbol +
+ )} +
+ )} +
+
+ ); + }} +
+
+ ); +}; diff --git a/apps/balancer-tools/src/app/apr/(utils)/calculatePoolStats.ts b/apps/balancer-tools/src/app/apr/(utils)/calculatePoolStats.ts index 4e491ed16..5bbfe2fcd 100644 --- a/apps/balancer-tools/src/app/apr/(utils)/calculatePoolStats.ts +++ b/apps/balancer-tools/src/app/apr/(utils)/calculatePoolStats.ts @@ -5,7 +5,7 @@ import * as balEmissions from "#/lib/balancer/emissions"; import { Pool } from "#/lib/balancer/gauges"; import { pools } from "#/lib/gql/server"; -import { PoolStatsData } from "../api/route"; +import { PoolStatsData, PoolTokens } from "../api/route"; import { getBALPriceByRound } from "./getBALPriceByRound"; import { getPoolRelativeWeight } from "./getRelativeWeight"; import { Round } from "./rounds"; @@ -16,7 +16,7 @@ export enum PoolTypeEnum { WEIGHTED = "Weighted", GYROE = "GyroE", STABLE = "Stable", - MetaStable = "MetaStable", + META_STABLE = "MetaStable", UNKNOWN = "FX", } @@ -113,6 +113,8 @@ export async function calculatePoolStats({ votingShare, symbol, network, + tokens: pool.tokens as PoolTokens[], + type: pool.poolType as keyof typeof PoolTypeEnum, }; } diff --git a/apps/balancer-tools/src/app/apr/(utils)/getFilteredApiUrl.ts b/apps/balancer-tools/src/app/apr/(utils)/getFilteredApiUrl.ts new file mode 100644 index 000000000..7265c4c9e --- /dev/null +++ b/apps/balancer-tools/src/app/apr/(utils)/getFilteredApiUrl.ts @@ -0,0 +1,42 @@ +import { BASE_URL } from "../api/route"; +import { SearchParams } from "../round/[roundId]/page"; + +export const INITIAL_MIN_TVL = 1000; +export const INITIAL_LIMIT = 10; + +const convert = (key: string, value: string) => { + if (["sort", "order"].includes(key)) return value || undefined; + if (["minTVL", "maxTVL", "minAPR", "maxAPR", "limit"].includes(key)) + return Number(value) || undefined; + if (["tokens", "type", "network"].includes(key)) + return value ? value.split(",") : undefined; + return value; +}; +function getFilterDataFromParams(searchParams: SearchParams) { + const result = Object.fromEntries( + Object.entries(searchParams).map(([key, value]) => [ + key, + convert(key, value), + ]), + ); + + // Include minTVL and limit if they are not already present in searchParams + if (!("minTVL" in result)) { + result.minTVL = INITIAL_MIN_TVL; + } + if (!("limit" in result)) { + result.limit = INITIAL_LIMIT; + } + + return result; +} +export default function getFilteredRoundApiUrl( + searchParams: SearchParams, + roundId: string, +) { + const filteredData = getFilterDataFromParams(searchParams); + const params = Object.entries(filteredData) + .map(([key, value]) => (value !== undefined ? `${key}=${value}` : "")) + .join("&"); + return `${BASE_URL}/apr/api/?roundId=${roundId}&${params}`; +} diff --git a/apps/balancer-tools/src/app/apr/api/route.ts b/apps/balancer-tools/src/app/apr/api/route.ts index bb0fc0fed..bc8753bfc 100644 --- a/apps/balancer-tools/src/app/apr/api/route.ts +++ b/apps/balancer-tools/src/app/apr/api/route.ts @@ -4,7 +4,10 @@ import { NextRequest, NextResponse } from "next/server"; import { Pool, POOLS_WITH_LIVE_GAUGES } from "#/lib/balancer/gauges"; import { fetcher } from "#/utils/fetcher"; -import { calculatePoolStats } from "../(utils)/calculatePoolStats"; +import { + calculatePoolStats, + PoolTypeEnum, +} from "../(utils)/calculatePoolStats"; import { Round } from "../(utils)/rounds"; export const BASE_URL = @@ -39,6 +42,8 @@ export interface PoolStatsData extends PoolStats { network: string; poolId: string; roundId: number; + tokens: PoolTokens[]; + type: keyof typeof PoolTypeEnum; } export interface PoolStatsResults { @@ -275,7 +280,8 @@ function filterPoolStats( const maxVotingShare = parseFloat( searchParams.get("maxVotingShare") ?? "Infinity", ); - const tokenSymbol = searchParams.get("symbol"); + const tokenSymbol = searchParams.get("tokens"); + const poolTypes = searchParams.get("types"); const minTvl = parseFloat(searchParams.get("minTvl") ?? "0"); const maxTvl = parseFloat(searchParams.get("maxTvl") ?? "Infinity"); @@ -295,7 +301,16 @@ function filterPoolStats( ); } if (tokenSymbol) { - filteredData = filteredData.filter((pool) => pool.symbol === tokenSymbol); + const decodedSymbols = tokenSymbol.split(",").map(decodeURIComponent); + filteredData = filteredData.filter((pool) => + pool.tokens.some((token) => decodedSymbols.includes(token.symbol)), + ); + } + if (poolTypes) { + const decodedSymbols = poolTypes.split(",").map(decodeURIComponent); + filteredData = filteredData.filter((pool) => + decodedSymbols.includes(pool.type), + ); } if (minTvl || maxTvl) { filteredData = filteredData.filter( diff --git a/apps/balancer-tools/src/app/apr/round/(components)/PoolListTable.tsx b/apps/balancer-tools/src/app/apr/round/(components)/PoolListTable.tsx index c4391d00a..e433fff6b 100644 --- a/apps/balancer-tools/src/app/apr/round/(components)/PoolListTable.tsx +++ b/apps/balancer-tools/src/app/apr/round/(components)/PoolListTable.tsx @@ -9,73 +9,71 @@ import { TriangleUpIcon, } from "@radix-ui/react-icons"; import Image from "next/image"; -import { useState } from "react"; +import Link from "next/link"; +import { + ReadonlyURLSearchParams, + usePathname, + useSearchParams, +} from "next/navigation"; +import { useCallback, useEffect, useState } from "react"; import { Button } from "#/components"; import { Badge } from "#/components/Badge"; import { Spinner } from "#/components/Spinner"; import Table from "#/components/Table"; import { Tooltip } from "#/components/Tooltip"; -import { Pool } from "#/lib/balancer/gauges"; import { fetcher } from "#/utils/fetcher"; import { formatNumber } from "#/utils/formatNumber"; import { PoolTypeEnum } from "../../(utils)/calculatePoolStats"; import { formatAPR, formatTVL } from "../../(utils)/formatPoolStats"; -import { BASE_URL, PoolStatsData, PoolStatsResults } from "../../api/route"; +import { PoolStatsData, PoolStatsResults, PoolTokens } from "../../api/route"; +import { TokenFilterInput } from "./TokenFilterInput"; export function PoolListTable({ roundId, initialData, }: { roundId: string; - initialData: PoolStatsResults; + initialData: PoolStatsData[]; }) { - const [tableData, setTableData] = useState(initialData.perRound); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const [tableData, setTableData] = useState(initialData); const [isLoadingMore, setIsLoadingMore] = useState(false); - const [sortField, setSortField] = useState("apr"); - const [order, setOrder] = useState<"asc" | "desc">("desc"); - - const handleSorting = (sortField: keyof PoolStatsData, sortOrder: string) => { - if (sortField) { - setTableData((prevTableData) => { - const sortedArray = prevTableData.slice().sort((a, b) => { - const aValue = a[sortField] as number | string; - const bValue = b[sortField] as number | string; - - // Handle NaN values - if (typeof aValue === "number" && isNaN(aValue)) return 1; - if (typeof bValue === "number" && isNaN(bValue)) return -1; - - if (aValue < bValue) { - return sortOrder === "asc" ? -1 : 1; - } else if (aValue > bValue) { - return sortOrder === "asc" ? 1 : -1; - } - return 0; - }); - - return sortedArray; - }); - } - }; + const [hasMorePools, setHasMorePools] = useState(true); - const handleSortingChange = (accessor: keyof PoolStatsData) => { - const sortOrder = - accessor === sortField && order === "desc" ? "asc" : "desc"; - setSortField(accessor); - setOrder(sortOrder); - handleSorting(accessor, sortOrder); - }; + useEffect(() => { + setTableData(initialData); + }, [initialData]); + + const createQueryString = useCallback( + (accessor: string) => { + const params = new URLSearchParams(searchParams); + const sortOrder = + accessor === params.get("sort") && params.get("order") === "desc" + ? "asc" + : "desc"; + params.set("order", sortOrder); + params.set("sort", accessor); + return params.toString(); + }, + [searchParams], + ); const loadMorePools = async () => { setIsLoadingMore(true); const aditionalPoolsData = await fetcher( - `${BASE_URL}/apr/api/?roundId=${roundId}&sort=${sortField}&order=${order}&limit=10&offset=${ + `${ + process.env.NEXT_PUBLIC_SITE_URL + }/apr/api/?roundId=${roundId}&sort=${searchParams.get( + "sort", + )}&order=${searchParams.get("order")}&limit=10&offset=${ Object.keys(tableData).length }&minTvl=1000`, ); setTableData((prevTableData) => { + if (aditionalPoolsData.perRound.length === 0) setHasMorePools(false); return prevTableData.concat(aditionalPoolsData.perRound); }); setIsLoadingMore(false); @@ -83,84 +81,109 @@ export function PoolListTable({ return (
+
+ +
Network - Composition + Composition Type - handleSortingChange("tvl")} - > -
- +
+ - - - TVL - {sortField == "tvl" ? OrderIcon(order) : OrderIcon("neutral")} + + + + TVL + {OrderIcon(searchParams, "tvl")} +
- handleSortingChange("votingShare")} - > -
- Voting % - {sortField == "votingShare" - ? OrderIcon(order) - : OrderIcon("neutral")} + +
+ + Voting % + {OrderIcon(searchParams, "votingShare")} +
- handleSortingChange("apr")} - > -
- +
+ - - - APR - {sortField == "apr" ? OrderIcon(order) : OrderIcon("neutral")} + + + + APR + {OrderIcon(searchParams, "apr")} +
- {tableData.map((pool) => ( - - ))} - - - + + + + ) : ( + + - {isLoadingMore ? ( - - ) : ( - <> - Load More - - )} - - - + No pools found + + + )}
@@ -172,6 +195,8 @@ function TableRow({ poolId, roundId, network, + tokens, + poolType, tvl, votingShare, apr, @@ -179,6 +204,8 @@ function TableRow({ poolId: string; roundId: string; network: string; + tokens: PoolTokens[]; + poolType: keyof typeof PoolTypeEnum; tvl: number; votingShare: number; apr: number; @@ -186,10 +213,6 @@ function TableRow({ const poolRedirectURL = `/apr/pool/${networkFor( network, )}/${poolId}/round/${roundId}`; - const pool = new Pool(poolId); - const tokens = pool.tokens; - const poolType = pool.poolType as keyof typeof PoolTypeEnum; - return ( @@ -238,12 +261,15 @@ function TableRow({ ); } -function OrderIcon(order: "asc" | "desc" | "neutral") { - if (order === "asc") { +function OrderIcon( + searchParams: ReadonlyURLSearchParams, + fieldName: keyof PoolStatsData, +) { + if (searchParams.get("sort") !== fieldName) return ; + + if (searchParams.get("order") === "asc") { return ; - } else if (order === "desc") { + } else if (searchParams.get("order") === "desc") { return ; - } else { - return ; } } diff --git a/apps/balancer-tools/src/app/apr/round/(components)/PoolTableWrapper.tsx b/apps/balancer-tools/src/app/apr/round/(components)/PoolTableWrapper.tsx index a1d97b2ac..121c0b9f3 100644 --- a/apps/balancer-tools/src/app/apr/round/(components)/PoolTableWrapper.tsx +++ b/apps/balancer-tools/src/app/apr/round/(components)/PoolTableWrapper.tsx @@ -1,15 +1,15 @@ import { fetcher } from "#/utils/fetcher"; -import { BASE_URL, PoolStatsResults } from "../../api/route"; +import { PoolStatsResults } from "../../api/route"; import { PoolListTable } from "./PoolListTable"; export default async function PoolTableWrapper({ roundId, + filteredApiUrl, }: { roundId: string; + filteredApiUrl: string; }) { - const initialData = await fetcher( - `${BASE_URL}/apr/api/?roundId=${roundId}&sort=apr&limit=10&order=desc&minTvl=1000`, - ); - return ; + const initialData = await fetcher(filteredApiUrl); + return ; } diff --git a/apps/balancer-tools/src/app/apr/round/(components)/TokenFilterInput.tsx b/apps/balancer-tools/src/app/apr/round/(components)/TokenFilterInput.tsx new file mode 100644 index 000000000..79cd874ad --- /dev/null +++ b/apps/balancer-tools/src/app/apr/round/(components)/TokenFilterInput.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useRouter, useSearchParams } from "next/navigation"; + +import { POOLS_WITH_LIVE_GAUGES } from "#/lib/balancer/gauges"; + +import { MultiSelectDropdown } from "../../(components)/MultiSelectDropdown"; + +const AVALIABLE_TOKENS = [ + ...new Set( + POOLS_WITH_LIVE_GAUGES.flatMap((pool) => + pool.tokens.map((token) => token.symbol), + ), + ), +]; + +export function TokenFilterInput() { + const router = useRouter(); + const searchParams = useSearchParams(); + + const handleTokenSelect = (selectedItems: string[]) => { + const current = new URLSearchParams(Array.from(searchParams.entries())); + + if (!selectedItems.length) { + current.delete("tokens"); + } else { + current.set("tokens", selectedItems.join(",")); + } + + const search = current.toString(); + const query = search ? `?${search}` : ""; + router.push(window.location.pathname + query, { scroll: false }); + }; + + return ( + <> + + + ); +} diff --git a/apps/balancer-tools/src/app/apr/round/(components)/TopPoolsChart.tsx b/apps/balancer-tools/src/app/apr/round/(components)/TopPoolsChart.tsx index 6c58ae4b1..d955fe2ab 100644 --- a/apps/balancer-tools/src/app/apr/round/(components)/TopPoolsChart.tsx +++ b/apps/balancer-tools/src/app/apr/round/(components)/TopPoolsChart.tsx @@ -4,15 +4,19 @@ import { PlotType } from "plotly.js"; import Plot from "#/components/Plot"; import { fetcher } from "#/utils/fetcher"; -import { BASE_URL, PoolStatsResults } from "../../api/route"; +import { PoolStatsResults } from "../../api/route"; -export default async function TopPoolsChart({ roundId }: { roundId: string }) { +export default async function TopPoolsChart({ + roundId, + filteredApiUrl, +}: { + roundId: string; + filteredApiUrl: string; +}) { const shades = Object.values(greenDarkA).map((color) => color.toString()); const colors = [...shades.slice(4, 10).reverse(), ...shades.slice(4, 10)]; - const topAprApi = await fetcher( - `${BASE_URL}/apr/api/?roundId=${roundId}&sort=apr&limit=10&order=desc&minTvl=1000`, - ); + const topAprApi = await fetcher(filteredApiUrl); const chartData = { hovertemplate: "%{x:.2f}% APR", diff --git a/apps/balancer-tools/src/app/apr/round/[roundId]/page.tsx b/apps/balancer-tools/src/app/apr/round/[roundId]/page.tsx index 469aed213..bee5ace1d 100644 --- a/apps/balancer-tools/src/app/apr/round/[roundId]/page.tsx +++ b/apps/balancer-tools/src/app/apr/round/[roundId]/page.tsx @@ -2,16 +2,30 @@ import { Suspense } from "react"; import { Spinner } from "#/components/Spinner"; +import getFilteredRoundApiUrl from "../../(utils)/getFilteredApiUrl"; import Breadcrumb from "../(components)/Breadcrumb"; import PoolTableWrapper from "../(components)/PoolTableWrapper"; import RoundOverviewCards from "../(components)/RoundOverviewCards"; import TopPoolsChart from "../(components)/TopPoolsChart"; +export interface SearchParams { + minTVL?: string; + maxTVL?: string; + minAPR?: string; + maxAPR?: string; + tokens?: string; + type?: string; + network?: string; +} + export default function Page({ params: { roundId }, + searchParams, }: { params: { roundId: string }; + searchParams: SearchParams; }) { + const filteredApiUrl = getFilteredRoundApiUrl(searchParams, roundId); return (
@@ -19,10 +33,10 @@ export default function Page({ }> - + }> - +
); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c50cbc887..e27953948 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,6 +116,9 @@ importers: copy-to-clipboard: specifier: ^3.3.3 version: 3.3.3 + downshift: + specifier: ^8.1.0 + version: 8.1.0(react@18.2.0) graphql-request: specifier: 5.1.0 version: 5.1.0(graphql@16.6.0) @@ -130,7 +133,7 @@ importers: version: 4.6.2 next: specifier: ^13.4.13 - version: 13.4.13(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) + version: 13.4.13(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) p-throttle: specifier: ^5.1.0 version: 5.1.0 @@ -242,7 +245,7 @@ importers: version: 3.3.3 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.22.9)(esbuild@0.15.13)(jest@29.6.1)(typescript@5.1.6) + version: 29.1.1(@babel/core@7.21.4)(esbuild@0.15.13)(jest@29.6.1)(typescript@5.1.6) typescript: specifier: 5.1.6 version: 5.1.6 @@ -302,7 +305,7 @@ importers: version: 13.4.10 '@typescript-eslint/eslint-plugin': specifier: latest - version: 6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.45.0)(typescript@5.1.6) + version: 6.3.0(@typescript-eslint/parser@6.2.1)(eslint@8.45.0)(typescript@5.1.6) eslint: specifier: ^8.45.0 version: 8.45.0 @@ -528,13 +531,6 @@ packages: - encoding dev: true - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 - dev: true - /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -544,11 +540,11 @@ packages: /@babel/compat-data@7.21.4: resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} engines: {node: '>=6.9.0'} - dev: true /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/core@7.21.4: resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} @@ -565,13 +561,12 @@ packages: '@babel/traverse': 7.21.5 '@babel/types': 7.21.5 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/core@7.22.9: resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} @@ -594,6 +589,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true /@babel/generator@7.21.5: resolution: {integrity: sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==} @@ -603,7 +599,6 @@ packages: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - dev: true /@babel/generator@7.22.9: resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} @@ -613,6 +608,7 @@ packages: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -633,7 +629,6 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 - dev: true /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} @@ -647,6 +642,7 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 + dev: true /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} @@ -670,11 +666,11 @@ packages: /@babel/helper-environment-visitor@7.21.5: resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} @@ -682,7 +678,6 @@ packages: dependencies: '@babel/template': 7.20.7 '@babel/types': 7.21.5 - dev: true /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -690,19 +685,20 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.5 + dev: true /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.5 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-member-expression-to-functions@7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} @@ -716,13 +712,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.5 - dev: true /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-module-transforms@7.21.5: resolution: {integrity: sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==} @@ -738,7 +734,6 @@ packages: '@babel/types': 7.21.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} @@ -752,6 +747,7 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + dev: true /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} @@ -784,13 +780,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.5 - dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} @@ -804,22 +800,22 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.5 - dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-string-parser@7.21.5: resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} @@ -828,11 +824,11 @@ packages: /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} @@ -843,7 +839,6 @@ packages: '@babel/types': 7.21.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helpers@7.22.6: resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} @@ -854,6 +849,7 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} @@ -869,7 +865,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.21.5 - dev: true /@babel/parser@7.22.7: resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} @@ -877,6 +872,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.5 + dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -1293,7 +1289,6 @@ packages: '@babel/code-frame': 7.22.5 '@babel/parser': 7.21.8 '@babel/types': 7.21.5 - dev: true /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} @@ -1302,6 +1297,7 @@ packages: '@babel/code-frame': 7.22.5 '@babel/parser': 7.22.7 '@babel/types': 7.22.5 + dev: true /@babel/traverse@7.21.5: resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} @@ -1315,11 +1311,10 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.8 '@babel/types': 7.21.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/traverse@7.22.8: resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} @@ -1337,6 +1332,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/types@7.21.5: resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} @@ -1345,7 +1341,6 @@ packages: '@babel/helper-string-parser': 7.21.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} @@ -1354,6 +1349,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + dev: true /@balancer-labs/sor@4.1.1-beta.14(@ethersproject/abi@5.7.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.7.0)(@ethersproject/constants@5.7.0)(@ethersproject/contracts@5.7.0)(@ethersproject/providers@5.7.2): resolution: {integrity: sha512-Qz2AooKgJoqVvhLOrB8pxPDyu6B0leU9sO78GALQLeV6qkSCfo2rYUvoAA7SFnYsgSCV92ODs0hwNP6iPKuJ5w==} @@ -3148,7 +3144,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@types/debug': 4.1.8 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 semver: 7.5.4 superstruct: 1.0.3 transitivePeerDependencies: @@ -3514,7 +3510,7 @@ packages: chokidar: 3.5.3 destr: 1.2.2 execa: 5.1.1 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 fs-extra: 10.1.0 globby: 11.1.0 merge-stream: 2.0.0 @@ -4867,7 +4863,7 @@ packages: '@sentry/utils': 7.59.2 '@sentry/webpack-plugin': 1.20.0 chalk: 3.0.0 - next: 13.4.13(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0) + next: 13.4.13(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 rollup: 2.78.0 stacktrace-parser: 0.1.10 @@ -5158,7 +5154,7 @@ packages: resolution: {integrity: sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 '@babel/runtime': 7.21.0 '@types/aria-query': 5.0.1 aria-query: 5.1.3 @@ -5562,8 +5558,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==} + /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.2.1)(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -5575,10 +5571,10 @@ packages: dependencies: '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 6.2.1(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.2.1 - '@typescript-eslint/type-utils': 6.2.1(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.1(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.2.1 + '@typescript-eslint/scope-manager': 6.3.0 + '@typescript-eslint/type-utils': 6.3.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.3.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.3.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.45.0 graphemer: 1.4.0 @@ -5649,8 +5645,16 @@ packages: '@typescript-eslint/visitor-keys': 6.2.1 dev: true - /@typescript-eslint/type-utils@6.2.1(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==} + /@typescript-eslint/scope-manager@6.3.0: + resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/visitor-keys': 6.3.0 + dev: true + + /@typescript-eslint/type-utils@6.3.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -5659,8 +5663,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) - '@typescript-eslint/utils': 6.2.1(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) + '@typescript-eslint/utils': 6.3.0(eslint@8.45.0)(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) eslint: 8.45.0 ts-api-utils: 1.0.1(typescript@5.1.6) @@ -5679,6 +5683,11 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/types@6.3.0: + resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5721,8 +5730,29 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.2.1(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==} + /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): + resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/visitor-keys': 6.3.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.3.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -5730,9 +5760,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.2.1 - '@typescript-eslint/types': 6.2.1 - '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.3.0 + '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) eslint: 8.45.0 semver: 7.5.4 transitivePeerDependencies: @@ -5756,6 +5786,14 @@ packages: eslint-visitor-keys: 3.4.2 dev: true + /@typescript-eslint/visitor-keys@6.3.0: + resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.3.0 + eslint-visitor-keys: 3.4.2 + dev: true + /@vanilla-extract/css@1.9.1: resolution: {integrity: sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ==} dependencies: @@ -6422,7 +6460,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -6439,7 +6477,7 @@ packages: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -7686,6 +7724,10 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: false + /compute-scroll-into-view@2.0.4: + resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} + dev: false + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -8097,6 +8139,17 @@ packages: dependencies: ms: 2.1.3 + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -8108,6 +8161,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -8371,6 +8425,19 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + /downshift@8.1.0(react@18.2.0): + resolution: {integrity: sha512-e9EBBLZvB2G73qT272x3hExttGCH1q1usbjirm+1aMcFXuzSWhgBdbnAHPlFI2rEq61cU/kDrEIMrY+ozMhvmg==} + peerDependencies: + react: '>=16.12.0' + dependencies: + '@babel/runtime': 7.21.0 + compute-scroll-into-view: 2.0.4 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 17.0.2 + tslib: 2.5.0 + dev: false + /draw-svg-path@1.0.0: resolution: {integrity: sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==} dependencies: @@ -9837,6 +9904,16 @@ packages: dtype: 2.0.0 dev: false + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -10767,7 +10844,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -10807,7 +10884,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -11008,7 +11085,7 @@ packages: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -11589,7 +11666,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -13214,7 +13291,7 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: false - /next@13.4.13(@babel/core@7.22.9)(react-dom@18.2.0)(react@18.2.0): + /next@13.4.13(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-A3YVbVDNeXLhWsZ8Nf6IkxmNlmTNz0yVg186NJ97tGZqPDdPzTrHotJ+A1cuJm2XfuWPrKOUZILl5iBQkIf8Jw==} engines: {node: '>=16.8.0'} hasBin: true @@ -13236,7 +13313,7 @@ packages: postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.22.9)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.21.4)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -14559,7 +14636,6 @@ packages: /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -15651,7 +15727,7 @@ packages: resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==} dev: false - /styled-jsx@5.1.1(@babel/core@7.22.9)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.21.4)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -15664,7 +15740,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.22.9 + '@babel/core': 7.21.4 client-only: 0.0.1 react: 18.2.0 dev: false @@ -15736,6 +15812,7 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} @@ -16172,6 +16249,41 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true + /ts-jest@29.1.1(@babel/core@7.21.4)(esbuild@0.15.13)(jest@29.6.1)(typescript@5.1.6): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.4 + bs-logger: 0.2.6 + esbuild: 0.15.13 + fast-json-stable-stringify: 2.1.0 + jest: 29.6.1(@types/node@18.15.11) + jest-util: 29.6.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.1.6 + yargs-parser: 21.1.1 + dev: true + /ts-jest@29.1.1(@babel/core@7.22.9)(esbuild@0.15.13)(jest@29.6.1)(typescript@5.1.6): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}