From 1f123ca44366847928624f678fcaf5790bfa744c Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Tue, 13 Jun 2023 19:40:37 -0400 Subject: [PATCH 01/15] Fix navigation chevron, add sticky trade drawer header --- .../MobileTrade/drawers/TradePanelDrawer.tsx | 2 +- .../PositionButtons/PositionButtons.tsx | 85 +++++++++++++------ sections/futures/Trade/TradePanel.tsx | 20 +++-- .../Header/MobileUserMenu/MobileMenuModal.tsx | 1 + .../AppLayout/Header/MobileUserMenu/menu.ts | 4 +- 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/sections/futures/MobileTrade/drawers/TradePanelDrawer.tsx b/sections/futures/MobileTrade/drawers/TradePanelDrawer.tsx index 723fe9ac4b..637e5a7a71 100644 --- a/sections/futures/MobileTrade/drawers/TradePanelDrawer.tsx +++ b/sections/futures/MobileTrade/drawers/TradePanelDrawer.tsx @@ -15,7 +15,7 @@ const TradePanelDrawer: FC = ({ open, closeDrawer }) => { - + diff --git a/sections/futures/PositionButtons/PositionButtons.tsx b/sections/futures/PositionButtons/PositionButtons.tsx index 8021aa18b7..02effd3354 100644 --- a/sections/futures/PositionButtons/PositionButtons.tsx +++ b/sections/futures/PositionButtons/PositionButtons.tsx @@ -1,37 +1,50 @@ import { memo, FC } from 'react'; import styled, { css } from 'styled-components'; +import CloseIcon from 'assets/svg/app/close.svg'; +import { FlexDivRow } from 'components/layout/flex'; import { PositionSide } from 'sdk/types/futures'; interface PositionButtonsProps { selected: PositionSide; onSelect(position: PositionSide): void; type?: 'button' | 'submit' | 'reset' | undefined; + mobile?: boolean; + closeDrawer?: () => void; } -const PositionButtons: FC = memo(({ selected, onSelect }) => { - return ( - - onSelect(PositionSide.LONG)} - > - Long - - onSelect(PositionSide.SHORT)} - > - Short - - - ); -}); +const PositionButtons: FC = memo( + ({ selected, onSelect, mobile, closeDrawer }) => { + return ( + + + onSelect(PositionSide.LONG)} + > + Long + + onSelect(PositionSide.SHORT)} + > + Short + + + {mobile && ( + + + + )} + + ); + } +); type PositionButtonProps = { $position: PositionSide; @@ -39,10 +52,22 @@ type PositionButtonProps = { $right?: boolean; }; +const PositionButtonsWrapper = styled(FlexDivRow)<{ $mobile?: boolean }>` + width: 100%; + margin-bottom: 16px; + + ${(props) => + props.$mobile && + css` + position: fixed; + `} +`; + const PositionButtonsContainer = styled.div` display: grid; grid-template-columns: 1fr 1fr; - margin-bottom: 16px; + flex: 1; + background: ${(props) => props.theme.colors.selectedTheme.background}; `; const PositionButton = styled.div` @@ -87,4 +112,16 @@ const PositionButton = styled.div` `} `; +const CloseButton = styled.button` + width: 50px; + border-top: ${(props) => props.theme.colors.selectedTheme.border}; + border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; + display: flex; + justify-content: center; + align-items: center; + background: ${(props) => props.theme.colors.selectedTheme.newTheme.tabs.position.background}; + border-left: ${(props) => props.theme.colors.selectedTheme.border}; + border-right: none; +`; + export default PositionButtons; diff --git a/sections/futures/Trade/TradePanel.tsx b/sections/futures/Trade/TradePanel.tsx index 770503c90d..36e255e63b 100644 --- a/sections/futures/Trade/TradePanel.tsx +++ b/sections/futures/Trade/TradePanel.tsx @@ -27,9 +27,10 @@ import OrderPriceInput from './TradePanelPriceInput'; type Props = { mobile?: boolean; + closeDrawer?: () => void; }; -const TradePanel: FC = memo(({ mobile }) => { +const TradePanel: FC = memo(({ mobile, closeDrawer }) => { const dispatch = useAppDispatch(); const leverageSide = useAppSelector(selectLeverageSide); @@ -58,14 +59,23 @@ const TradePanel: FC = memo(({ mobile }) => { return ( - + {!mobile && ( + <> + + + + )} - {!mobile && } {process.env.NEXT_PUBLIC_CLOSE_ONLY === 'true' ? ( ) : ( <> - + {pricesConnectionError && ( @@ -121,7 +131,7 @@ const TradePanelContainer = styled.div<{ $mobile?: boolean }>` `; const MainPanelContent = styled.div` - padding: 0 15px; + padding: 65px 15px 0; `; export default TradePanel; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx index 0a949034b3..e0e45f7767 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx @@ -86,6 +86,7 @@ export const MobileMenuModal: FC = ({ onDismiss }) => { currentTheme={currentTheme} isActive={router.asPath.includes(link)} onClick={onDismiss} + isLink > {t(i18nLabel)} diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts index bfc3b2a980..685c860f16 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts @@ -6,6 +6,7 @@ import type { ThemeName } from 'styles/theme'; export const MenuButton = styled.div<{ currentTheme: ThemeName; isActive: boolean; + isLink?: boolean; }>` outline: none; width: 100%; @@ -25,7 +26,8 @@ export const MenuButton = styled.div<{ ? props.theme.colors.common.primaryWhite : props.theme.colors.selectedTheme.black}; path { - fill: ${window.location.pathname === ROUTES.Home.Root || props.currentTheme === 'dark' + ${props.isLink ? 'fill' : 'stroke'}: ${window.location.pathname === ROUTES.Home.Root || + props.currentTheme === 'dark' ? props.theme.colors.common.primaryWhite : props.theme.colors.selectedTheme.black}; } From 821b8f66e1d6282f3391553c01d35dd28bc60593 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 03:09:28 -0400 Subject: [PATCH 02/15] Fix TradePanel padding and dropdown z-index --- sections/futures/Trade/MarketsDropdown.tsx | 4 ++-- sections/futures/Trade/TradePanel.tsx | 24 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/sections/futures/Trade/MarketsDropdown.tsx b/sections/futures/Trade/MarketsDropdown.tsx index 3591b13a6a..85ab62209f 100644 --- a/sections/futures/Trade/MarketsDropdown.tsx +++ b/sections/futures/Trade/MarketsDropdown.tsx @@ -39,12 +39,12 @@ import { FetchStatus } from 'state/types'; import media from 'styles/media'; import { getMarketName, getSynthDescription } from 'utils/futures'; +import MarketsDropdownSelector, { MARKET_SELECTOR_HEIGHT_MOBILE } from './MarketsDropdownSelector'; import { MARKETS_DETAILS_HEIGHT_DESKTOP, TRADE_PANEL_WIDTH_LG, TRADE_PANEL_WIDTH_MD, } from '../styles'; -import MarketsDropdownSelector, { MARKET_SELECTOR_HEIGHT_MOBILE } from './MarketsDropdownSelector'; type MarketsDropdownProps = { mobile?: boolean; @@ -369,7 +369,7 @@ const SearchBarContainer = styled.div` `; const SelectContainer = styled.div<{ mobile?: boolean; accountType?: string }>` - z-index: 100; + z-index: 40; height: ${MARKETS_DETAILS_HEIGHT_DESKTOP}px; position: relative; border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; diff --git a/sections/futures/Trade/TradePanel.tsx b/sections/futures/Trade/TradePanel.tsx index 36e255e63b..58ae371119 100644 --- a/sections/futures/Trade/TradePanel.tsx +++ b/sections/futures/Trade/TradePanel.tsx @@ -1,5 +1,5 @@ import { FC, memo, useCallback, useState, useEffect } from 'react'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; import Error from 'components/ErrorView'; import Spacer from 'components/Spacer'; @@ -11,11 +11,6 @@ import { selectFuturesType, selectLeverageSide, selectOrderType } from 'state/fu import { useAppDispatch, useAppSelector } from 'state/hooks'; import { selectPricesConnectionError } from 'state/prices/selectors'; -import TradePanelFeeInfo from '../FeeInfoBox/TradePanelFeeInfo'; -import LeverageInput from '../LeverageInput'; -import MarginInput from '../MarginInput'; -import OrderSizing from '../OrderSizing'; -import PositionButtons from '../PositionButtons'; import CloseOnlyPrompt from './CloseOnlyPrompt'; import ManagePosition from './ManagePosition'; import MarketsDropdown from './MarketsDropdown'; @@ -24,6 +19,11 @@ import OrderTypeSelector from './OrderTypeSelector'; import SLTPInputs from './SLTPInputs'; import TradeBalance from './TradeBalance'; import OrderPriceInput from './TradePanelPriceInput'; +import TradePanelFeeInfo from '../FeeInfoBox/TradePanelFeeInfo'; +import LeverageInput from '../LeverageInput'; +import MarginInput from '../MarginInput'; +import OrderSizing from '../OrderSizing'; +import PositionButtons from '../PositionButtons'; type Props = { mobile?: boolean; @@ -77,7 +77,7 @@ const TradePanel: FC = memo(({ mobile, closeDrawer }) => { closeDrawer={closeDrawer} /> - + {pricesConnectionError && ( )} @@ -130,8 +130,14 @@ const TradePanelContainer = styled.div<{ $mobile?: boolean }>` border-right: ${(props) => props.theme.colors.selectedTheme.border}; `; -const MainPanelContent = styled.div` - padding: 65px 15px 0; +const MainPanelContent = styled.div<{ $mobile?: boolean }>` + padding: 0 15px; + + ${(props) => + props.$mobile && + css` + padding: 65px 15px 0; + `} `; export default TradePanel; From 3220d78fe82ed51d315c040b1c860c20a7783bad Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 04:08:39 -0400 Subject: [PATCH 03/15] Make mobile modals low --- components/BaseModal/BaseModal.tsx | 17 +++++++---------- constants/ui.ts | 1 + 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/components/BaseModal/BaseModal.tsx b/components/BaseModal/BaseModal.tsx index 1b8f24db25..19465fbd70 100644 --- a/components/BaseModal/BaseModal.tsx +++ b/components/BaseModal/BaseModal.tsx @@ -65,9 +65,11 @@ export const BaseModal: FC = memo( const StyledDialogOverlay = styled(DialogOverlay)` z-index: ${zIndex.DIALOG_OVERLAY}; background: rgba(0, 0, 0, 0.7); - ${media.lessThan('sm')` + ${media.lessThan('md')` + z-index: ${zIndex.MOBILE_FOOTER}; overflow: scroll; - padding-bottom: 80px; + display: flex; + align-items: flex-end; `} `; @@ -78,7 +80,7 @@ const StyledDialogContent = styled(DialogContent)` ${media.lessThan('md')` &&& { - width: 80%; + /*width: 80%;*/ display: flex; justify-content: center; align-items: center; @@ -100,13 +102,8 @@ const StyledCard = styled(Card)` border: ${(props) => props.theme.colors.selectedTheme.border}; ${media.lessThan('md')` &&& { - width: 80%; - } - `} - ${media.lessThan('sm')` - &&& { - width: 90%; - margin-top: 30px; + width: 100%; + border-radius: 10px 10px 0 0; } `} `; diff --git a/constants/ui.ts b/constants/ui.ts index 5b88f25c5c..f03f63193a 100644 --- a/constants/ui.ts +++ b/constants/ui.ts @@ -10,5 +10,6 @@ export enum zIndex { BASE = 1, HEADER = 10, DIALOG_OVERLAY = 50, + MOBILE_FOOTER = 51, DRAWER = 65, } From 1c1cbac942b59d09c0de62136f19e7e4e660e192 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 11:03:07 -0400 Subject: [PATCH 04/15] Fix mobile scroll issue --- styles/common.tsx | 2 +- styles/main.css | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/styles/common.tsx b/styles/common.tsx index d804824304..58f6a2632c 100644 --- a/styles/common.tsx +++ b/styles/common.tsx @@ -95,7 +95,7 @@ export const FullScreenContainer = styled.div` export const MobileScreenContainer = styled.div` width: 100%; - height: 100vh; + height: 100%; overflow-y: scroll; padding-bottom: 80px; `; diff --git a/styles/main.css b/styles/main.css index d77e74a872..a748aaf4b6 100644 --- a/styles/main.css +++ b/styles/main.css @@ -80,7 +80,6 @@ body { text-rendering: optimizeSpeed; margin: 0; position: relative; - min-height: 100vh; font-size: 12px; -ms-overflow-style: none; From 7a938dcae8147658d299be4fefa62de289e1d799 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 15:47:50 -0400 Subject: [PATCH 05/15] Move things into SDK --- components/ErrorView/ErrorNotifier.tsx | 2 +- components/ErrorView/ErrorView.tsx | 2 +- queries/futures/useGetStats.ts | 6 +- queries/futures/useLeaderboard.ts | 2 +- queries/rates/types.ts | 58 ------ sdk/services/stats.ts | 169 +++++++++++++++++- sdk/types/stats.ts | 35 ++++ sdk/utils/date.ts | 2 +- sdk/utils/string.ts | 11 ++ .../hooks/useCombinedCandleSticksChartData.ts | 95 ---------- sections/futures/Transfers/Transfers.tsx | 2 +- sections/leaderboard/Competition.tsx | 2 +- .../MobileUserMenu/MobileWalletActions.tsx | 2 +- .../Layout/AppLayout/Header/WalletActions.tsx | 2 +- utils/formatters/string.ts | 38 ---- 15 files changed, 225 insertions(+), 203 deletions(-) create mode 100644 sdk/types/stats.ts create mode 100644 sdk/utils/string.ts delete mode 100644 sections/exchange/TradeCard/Charts/hooks/useCombinedCandleSticksChartData.ts delete mode 100644 utils/formatters/string.ts diff --git a/components/ErrorView/ErrorNotifier.tsx b/components/ErrorView/ErrorNotifier.tsx index 431aabdd98..040340d1db 100644 --- a/components/ErrorView/ErrorNotifier.tsx +++ b/components/ErrorView/ErrorNotifier.tsx @@ -3,7 +3,7 @@ import { toast, ToastContainer } from 'react-toastify'; import styled, { useTheme } from 'styled-components'; import ErrorIcon from 'assets/svg/app/error.svg'; -import { truncateString } from 'utils/formatters/string'; +import { truncateString } from 'sdk/utils/string'; function ToastContent({ message, errorDetails }: { message: string; errorDetails?: string }) { const [expanded, setExpanded] = useState(false); diff --git a/components/ErrorView/ErrorView.tsx b/components/ErrorView/ErrorView.tsx index d295342f6d..4cf059ddf1 100644 --- a/components/ErrorView/ErrorView.tsx +++ b/components/ErrorView/ErrorView.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components'; import Button from 'components/Button'; import Spacer from 'components/Spacer'; import { formatRevert, isUserDeniedError } from 'utils/formatters/error'; -import { truncateString } from 'utils/formatters/string'; +import { truncateString } from 'sdk/utils/string'; import { formatError } from './ErrorNotifier'; diff --git a/queries/futures/useGetStats.ts b/queries/futures/useGetStats.ts index b82f8bf14b..cf827f9c8a 100644 --- a/queries/futures/useGetStats.ts +++ b/queries/futures/useGetStats.ts @@ -7,12 +7,12 @@ import useIsL2 from 'hooks/useIsL2'; import { FUTURES_ENDPOINT_OP_MAINNET } from 'sdk/constants/futures'; import { NetworkId } from 'sdk/types/common'; import { getFuturesEndpoint } from 'sdk/utils/futures'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; import logError from 'utils/logError'; import { getFuturesStats } from '../../sdk/utils/subgraph'; -import { AccountStat, FuturesStat } from './types'; +import { AccountStat } from './types'; const useGetStats = (homepage?: boolean, options?: UseQueryOptions) => { const { network } = Connector.useContainer(); @@ -42,7 +42,7 @@ const useGetStats = (homepage?: boolean, options?: UseQueryOptions) => { } ); - const stats = response.map((stat: FuturesStat, i: number) => ({ + const stats = response.map((stat, i) => ({ ...stat, trader: stat.account, traderShort: truncateAddress(stat.account), diff --git a/queries/futures/useLeaderboard.ts b/queries/futures/useLeaderboard.ts index 12d45f904a..a7b6f7129a 100644 --- a/queries/futures/useLeaderboard.ts +++ b/queries/futures/useLeaderboard.ts @@ -7,7 +7,7 @@ import Connector from 'containers/Connector'; import { NetworkId } from 'sdk/types/common'; import { getFuturesEndpoint } from 'sdk/utils/futures'; import { weiFromWei } from 'sdk/utils/number'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; import logError from 'utils/logError'; import { AccountStat, FuturesStat } from './types'; diff --git a/queries/rates/types.ts b/queries/rates/types.ts index 41a6ac88ca..2c7f0b11ce 100644 --- a/queries/rates/types.ts +++ b/queries/rates/types.ts @@ -1,45 +1,5 @@ import Wei from '@synthetixio/wei'; -import { CurrencyKey } from 'constants/currency'; -import { FuturesMarketAsset } from 'sdk/types/futures'; - -export type SynthExchange = { - block: number; - feesInUSD: number; - from: string; - fromAmount: number; - fromAmountInUSD: number; - fromCurrencyKey: CurrencyKey; - gasPrice: number; - timestamp: number; - toAddress: string; - toAmount: number; - toAmountInUSD: number; - toCurrencyKey: CurrencyKey; - id: string; - account: string; - network: string; - hash: string; -}; - -export type SynthExchanges = SynthExchange[]; - -export type RateUpdate = { - timestamp: number; - rate: number; - block?: number; - synth?: CurrencyKey; -}; - -export type RateUpdates = RateUpdate[]; - -export type HistoricalRatesUpdates = { - rates: RateUpdates; - low: number; - high: number; - change: number; -}; - export type Candle = { id?: string; synth?: string; @@ -51,26 +11,8 @@ export type Candle = { timestamp: number; }; -export type Candles = Candle[]; - -export type LatestRate = { - synth: string; - rate: Wei; -}; - -export type LatestRates = Partial>; - -export type Price = { - synth: string; - price: number; -}; - -export type Prices = Price[]; - export type Rates = Record; -export type PriceResponse = Record; - export type PythResponse = { c: number[]; h: number[]; diff --git a/sdk/services/stats.ts b/sdk/services/stats.ts index 2994a6e6d2..62642d4391 100644 --- a/sdk/services/stats.ts +++ b/sdk/services/stats.ts @@ -1,5 +1,41 @@ +import { wei } from '@synthetixio/wei'; +import request, { gql } from 'graphql-request'; import KwentaSDK from 'sdk'; +import { REQUIRES_L2 } from 'sdk/common/errors'; +import { FUTURES_ENDPOINT_OP_MAINNET } from 'sdk/constants/futures'; +import { ETH_UNIT } from 'sdk/constants/transactions'; +import { AccountStat, FuturesStat } from 'sdk/types/stats'; +import { weiFromWei } from 'sdk/utils/number'; +import { truncateAddress } from 'sdk/utils/string'; +import { getFuturesStats } from 'sdk/utils/subgraph'; + +const mapStat = (stat: FuturesStat, i: number) => ({ + ...stat, + trader: stat.account, + traderShort: truncateAddress(stat.account), + pnl: weiFromWei(stat.pnlWithFeesPaid), + totalVolume: weiFromWei(stat.totalVolume), + totalTrades: wei(stat.totalTrades).toNumber(), + liquidations: wei(stat.liquidations).toNumber(), + rank: i + 1, + rankText: (i + 1).toString(), +}); + +type LeaderboardPart = 'top' | 'bottom' | 'wallet' | 'search' | 'all'; + +type LeaderboardResult = { + [part in LeaderboardPart]: AccountStat[]; +}; + +export const DEFAULT_LEADERBOARD_DATA = { + top: [], + bottom: [], + wallet: [], + search: [], + all: [], +}; + export default class StatsService { private sdk: KwentaSDK; @@ -11,5 +47,136 @@ export default class StatsService { public async getFuturesTradersStats() {} - public async getFuturesCumulativeStats() {} + public async getFuturesStats() { + try { + const response = await getFuturesStats( + this.sdk.futures.futuresGqlEndpoint, + { + first: 10, + orderBy: 'pnlWithFeesPaid', + orderDirection: 'desc', + }, + { + account: true, + pnl: true, + pnlWithFeesPaid: true, + liquidations: true, + totalTrades: true, + totalVolume: true, + } + ); + + const stats = response.map((stat: FuturesStat, i: number) => ({ + ...stat, + trader: stat.account, + traderShort: truncateAddress(stat.account), + pnl: stat.pnlWithFeesPaid.div(ETH_UNIT), + totalVolume: stat.totalVolume.div(ETH_UNIT), + totalTrades: stat.totalTrades.toNumber(), + liquidations: stat.liquidations.toNumber(), + rank: i + 1, + rankText: (i + 1).toString(), + })); + + return stats as AccountStat[]; + } catch (e) { + this.sdk.context.logError(e); + return []; + } + } + + public async getLeaderboard(searchTerm: string) { + try { + const query = gql` + fragment StatsBody on FuturesStat { + account + pnl + pnlWithFeesPaid + liquidations + totalTrades + totalVolume + } + + query leaderboardStats($account: String!, $searchTerm: String!) { + top: futuresStats(orderBy: pnlWithFeesPaid, orderDirection: desc, first: 100) { + ...StatsBody + } + bottom: futuresStats(orderBy: pnlWithFeesPaid, orderDirection: asc, first: 100) { + ...StatsBody + } + wallet: futuresStats(where: { account: $account }) { + ...StatsBody + } + search: futuresStats(where: { account_contains: $searchTerm }) { + ...StatsBody + } + } + `; + + const response: Record = await request( + this.sdk.futures.futuresGqlEndpoint, + query, + { account: this.sdk.context.walletAddress, searchTerm } + ); + + const stats: LeaderboardResult = { + top: response.top.map(mapStat), + bottom: response.bottom.map(mapStat), + wallet: response.wallet.map(mapStat), + search: response.search.map(mapStat), + all: [], + }; + + stats.all = [...stats.top, ...stats.bottom, ...stats.wallet, ...stats.search]; + + return stats; + } catch (e) { + this.sdk.context.logError(e); + return DEFAULT_LEADERBOARD_DATA; + } + } + + public async getFuturesCumulativeStats(homepage: boolean) { + if (!this.sdk.context.isL2 && !homepage) { + throw new Error(REQUIRES_L2); + } + + const futuresEndpoint = homepage + ? FUTURES_ENDPOINT_OP_MAINNET + : this.sdk.futures.futuresGqlEndpoint; + + try { + const response = await request( + futuresEndpoint, + gql` + query FuturesCumulativeStats { + futuresCumulativeStat(id: "0") { + totalTrades + totalTraders + totalVolume + totalLiquidations + averageTradeSize + } + } + ` + ); + + return response + ? { + totalVolume: wei(response.futuresCumulativeStat.totalVolume, 18, true).toString(), + averageTradeSize: wei( + response.futuresCumulativeStat.averageTradeSize, + 18, + true + ).toString(), + totalTraders: response.futuresCumulativeStat.totalTraders, + totalTrades: response.futuresCumulativeStat.totalTrades, + totalLiquidations: response.futuresCumulativeStat.totalLiquidations, + } + : null; + } catch (e) { + this.sdk.context.logError(e); + return null; + } + } } diff --git a/sdk/types/stats.ts b/sdk/types/stats.ts new file mode 100644 index 0000000000..cbb971df55 --- /dev/null +++ b/sdk/types/stats.ts @@ -0,0 +1,35 @@ +import Wei from '@synthetixio/wei'; + +export type FuturesStat = { + account: string; + pnlWithFeesPaid: Wei; + liquidations: Wei; + totalTrades: Wei; + totalVolume: Wei; + pnl?: Wei; +}; + +export type AccountStat = { + rank: number; + account: string; + trader: string; + traderShort: string; + traderEns?: string | null; + totalTrades: number; + totalVolume: Wei; + liquidations: number; + pnl: Wei; +}; + +export type FuturesCumulativeStats = { + totalTrades: string; + totalTraders: string; + totalVolume: string; + totalLiquidations: string; + averageTradeSize: string; +}; + +export enum FuturesAccountTypes { + ISOLATED_MARGIN = 'isolated_margin', + CROSS_MARGIN = 'cross_margin', +} diff --git a/sdk/utils/date.ts b/sdk/utils/date.ts index ec0321d634..a1a636bb6a 100644 --- a/sdk/utils/date.ts +++ b/sdk/utils/date.ts @@ -3,7 +3,7 @@ import formatDate from 'date-fns/format'; import getISOWeeksInYear from 'date-fns/getISOWeeksInYear'; import subHours from 'date-fns/subHours'; -import { strPadLeft } from '../../utils/formatters/string'; +import { strPadLeft } from '../../sdk/utils/string'; export const formatTxTimestamp = (timestamp: number | Date) => formatDate(timestamp, 'MMM d, yy | HH:mm'); diff --git a/sdk/utils/string.ts b/sdk/utils/string.ts new file mode 100644 index 0000000000..8b242366bd --- /dev/null +++ b/sdk/utils/string.ts @@ -0,0 +1,11 @@ +export const truncateAddress = (address: string, first = 5, last = 5) => + `${address.slice(0, first)}...${address.slice(-last, address.length)}`; + +export const truncateString = (text: string, max = 256) => { + if (text?.length > max) return text.substring(0, max) + ' ...'; + return text; +}; + +export const strPadLeft = (string: string | number, pad: string, length: number) => { + return (new Array(length + 1).join(pad) + string).slice(-length); +}; diff --git a/sections/exchange/TradeCard/Charts/hooks/useCombinedCandleSticksChartData.ts b/sections/exchange/TradeCard/Charts/hooks/useCombinedCandleSticksChartData.ts deleted file mode 100644 index fd833a6bef..0000000000 --- a/sections/exchange/TradeCard/Charts/hooks/useCombinedCandleSticksChartData.ts +++ /dev/null @@ -1,95 +0,0 @@ -import Wei, { wei } from '@synthetixio/wei'; -import orderBy from 'lodash/orderBy'; - -import { Candle } from 'queries/rates/types'; -import { ZERO_WEI } from 'sdk/constants/number'; - -export type TempCandle = { - id?: string; - synth?: string; - open: Wei; - high: Wei; - low: Wei; - close: Wei; - timestamp: Wei; - isBase?: boolean; -}; - -export const combineDataToPair = ( - baseData: Candle[], - quoteData: Candle[], - baseCurrencyIsSUSD: boolean, - quoteCurrencyIsSUSD: boolean -) => { - if (baseCurrencyIsSUSD) return quoteData.map(toTempCandle).map(fromTempCandle); // Double map to make sure output is still in the same format - if (quoteCurrencyIsSUSD) return baseData.map(toTempCandle).map(fromTempCandle); - - if (!(baseData.length && quoteData.length)) return []; - - const baseCandles = baseData.map((candle: Candle) => ({ - isBase: true, - ...toTempCandle(candle), - })); - const quoteCandles = quoteData.map(toTempCandle); - - let allCandles: TempCandle[] = []; - allCandles = allCandles.concat(baseCandles); - allCandles = allCandles.concat(quoteCandles); - allCandles = orderBy(allCandles, 'timestamp'); - - let prevBaseCandle: TempCandle = baseCandles[0]; - let prevQuoteCandle: TempCandle = quoteCandles[0]; - - return allCandles.reduce((candles, candle) => { - let open = ZERO_WEI; - let high = ZERO_WEI; - let low = ZERO_WEI; - let close = ZERO_WEI; - if (candle.isBase) { - open = candle.open.div(prevQuoteCandle.open); - high = candle.high.div(prevQuoteCandle.high); - low = candle.low.div(prevQuoteCandle.low); - close = candle.close.div(prevQuoteCandle.close); - prevBaseCandle = candle; - } else { - open = prevBaseCandle.open.div(candle.open); - high = prevBaseCandle.high.div(candle.high); - low = prevBaseCandle.low.div(candle.low); - close = prevBaseCandle.close.div(candle.close); - prevQuoteCandle = candle; - } - return candles.concat( - fromTempCandle({ - timestamp: candle.timestamp, - open, - high, - low, - close, - } as TempCandle) - ); - }, [] as Candle[]); -}; - -const toTempCandle = (n: Candle): TempCandle => { - return { - id: n.id, - synth: n.synth, - open: wei(n.open), - high: wei(n.high), - low: wei(n.low), - close: wei(n.close), - timestamp: wei(n.timestamp), - }; -}; - -const fromTempCandle = (n: TempCandle): Candle => { - return { - id: n.id, - synth: n.synth, - open: n.open.toNumber(), - high: n.high.toNumber(), - low: n.low.toNumber(), - close: n.close.toNumber(), - timestamp: n.timestamp.toNumber(), - }; -}; diff --git a/sections/futures/Transfers/Transfers.tsx b/sections/futures/Transfers/Transfers.tsx index b7f72682c2..262219e28b 100644 --- a/sections/futures/Transfers/Transfers.tsx +++ b/sections/futures/Transfers/Transfers.tsx @@ -19,7 +19,7 @@ import { useAppSelector } from 'state/hooks'; import { FetchStatus } from 'state/types'; import { ExternalLink } from 'styles/common'; import { timePresentation } from 'utils/formatters/date'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; const Transfers: FC = () => { const { t } = useTranslation(); diff --git a/sections/leaderboard/Competition.tsx b/sections/leaderboard/Competition.tsx index b1232e79e4..5d18beb993 100644 --- a/sections/leaderboard/Competition.tsx +++ b/sections/leaderboard/Competition.tsx @@ -15,7 +15,7 @@ import { AccountStat } from 'queries/futures/types'; import { formatPercent } from 'sdk/utils/number'; import { StyledTrader } from 'sections/leaderboard/trader'; import { getMedal, getCompetitionDataLocation } from 'utils/competition'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; type CompetitionProps = { round: CompetitionRound; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileWalletActions.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileWalletActions.tsx index 658832c62b..a19f4c6e6b 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileWalletActions.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileWalletActions.tsx @@ -5,7 +5,7 @@ import { useEnsAvatar, useEnsName } from 'wagmi'; import Button from 'components/Button'; import Connector from 'containers/Connector'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; import ConnectionDot from '../ConnectionDot'; import NetworksSwitcher from '../NetworksSwitcher'; diff --git a/sections/shared/Layout/AppLayout/Header/WalletActions.tsx b/sections/shared/Layout/AppLayout/Header/WalletActions.tsx index bc2986aa6e..29db25b46b 100644 --- a/sections/shared/Layout/AppLayout/Header/WalletActions.tsx +++ b/sections/shared/Layout/AppLayout/Header/WalletActions.tsx @@ -5,7 +5,7 @@ import { useEnsAvatar, useEnsName } from 'wagmi'; import Button from 'components/Button'; import Connector from 'containers/Connector'; -import { truncateAddress } from 'utils/formatters/string'; +import { truncateAddress } from 'sdk/utils/string'; import ConnectionDot from './ConnectionDot'; diff --git a/utils/formatters/string.ts b/utils/formatters/string.ts deleted file mode 100644 index b01f322c73..0000000000 --- a/utils/formatters/string.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CurrencyKey } from 'constants/currency'; - -export const truncateAddress = (address: string, first = 5, last = 5) => - `${address.slice(0, first)}...${address.slice(-last, address.length)}`; - -export const truncateString = (text: string, max = 256) => { - if (text?.length > max) return text.substring(0, max) + ' ...'; - return text; -}; - -export const formatCurrencyPair = (baseCurrencyKey: CurrencyKey, quoteCurrencyKey: CurrencyKey) => - `${baseCurrencyKey} / ${quoteCurrencyKey}`; - -export const strPadLeft = (string: string | number, pad: string, length: number) => { - return (new Array(length + 1).join(pad) + string).slice(-length); -}; - -export const hexToAscii = (str: string): string => { - const hex = str.toString(); - let out = ''; - for (let n = 2; n < hex.length; n += 2) { - const nextPair = hex.substr(n, 2); - if (nextPair !== '00') { - out += String.fromCharCode(parseInt(nextPair, 16)); - } - } - return out; -}; - -export const hexToAsciiV2 = (S: string) => { - // https://gist.github.com/gluk64/fdea559472d957f1138ed93bcbc6f78a#file-reason-js - const hex = S.substr(147).toString(); - let str = ''; - for (var n = 0; n < hex.length; n += 2) { - str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); - } - return str; -}; From 1879351769a1aa0d3f2aa92902836e43eb20d294 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 16:21:33 -0400 Subject: [PATCH 06/15] Fix submenu --- .../Header/MobileUserMenu/MobileSubMenu.tsx | 21 +++++++------------ .../Header/MobileUserMenu/MobileUserMenu.tsx | 2 +- .../AppLayout/Header/MobileUserMenu/menu.ts | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx index a1a235c13d..5b8c667266 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx @@ -7,7 +7,7 @@ import styled, { css } from 'styled-components'; import ChevronDown from 'assets/svg/app/chevron-down.svg'; import ChevronUp from 'assets/svg/app/chevron-up.svg'; import Badge from 'components/Badge'; -import ROUTES from 'constants/routes'; +import { GridDiv } from 'components/layout/grid'; import { useAppSelector } from 'state/hooks'; import { selectCurrentTheme } from 'state/preferences/selectors'; import { ThemeName } from 'styles/theme'; @@ -51,7 +51,6 @@ const MobileSubMenu: React.FC = memo( {links ? links.map(({ i18nLabel, link: subLink, badge, Icon }) => ( - ·
@@ -108,14 +107,15 @@ const StyledBadge = styled(Badge)` margin-left: 8px; `; -const SubMenuContainer = styled.div` +const SubMenuContainer = styled(GridDiv)` + grid-template-columns: 1fr 1fr; + grid-gap: 10px; box-sizing: border-box; + margin-bottom: 20px; `; const SubMenuItemContainer = styled.div` - display: flex; - align-items: center; - margin-bottom: 20px; + border-bottom: 2px solid ${(props) => props.theme.colors.selectedTheme.newTheme.border.color}; `; const StyledLink = styled(Link)` @@ -133,16 +133,11 @@ const SubMenuExternalLink = styled.a` const SubMenuItem = styled.div<{ currentTheme: ThemeName; active?: boolean; selected?: boolean }>` font-size: 19px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.newTheme.text.secondary}; box-sizing: border-box; - padding: 15px; - background-color: ${(props) => - window.location.pathname === ROUTES.Home.Root || props.currentTheme === 'dark' - ? 'rgba(255, 255, 255, 0.05)' - : 'rgb(232, 232, 232)'}; - border-radius: 8px; width: 100%; text-transform: capitalize; + padding-bottom: 10px; div { display: flex; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx index 1a3d7288c4..9294b521aa 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx @@ -79,7 +79,7 @@ const MobileFooterContainer = styled.div` ${FixedFooterMixin}; display: flex; align-items: center; - border-top: 1px solid #2b2a2a; + border-top: ${(props) => props.theme.colors.selectedTheme.newTheme.border.style}; padding: 15px 20px; background-color: ${(props) => props.theme.colors.selectedTheme.background}; z-index: 51; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts index 685c860f16..9286f44910 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts @@ -12,7 +12,7 @@ export const MenuButton = styled.div<{ width: 100%; font-size: 19px; font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.newTheme.text.secondary}; text-transform: capitalize; margin-bottom: 30px; display: flex; From 7f868ffde870bb054b51e0d262e5acc42662ff8a Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Wed, 14 Jun 2023 17:13:26 -0400 Subject: [PATCH 07/15] Add new theme switcher --- .../SegmentedControl/SegmentedControl.tsx | 30 +++++-- sections/dashboard/Links/Links.tsx | 1 - .../Header/MobileUserMenu/MobileMenuModal.tsx | 83 ++++++++----------- .../Header/MobileUserMenu/MobileUserMenu.tsx | 2 +- styles/theme/colors/dark.ts | 4 + styles/theme/colors/light.ts | 4 + 6 files changed, 70 insertions(+), 54 deletions(-) diff --git a/components/SegmentedControl/SegmentedControl.tsx b/components/SegmentedControl/SegmentedControl.tsx index ee9a342d94..1bd7423377 100644 --- a/components/SegmentedControl/SegmentedControl.tsx +++ b/components/SegmentedControl/SegmentedControl.tsx @@ -1,10 +1,10 @@ import React, { FC, memo } from 'react'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; export type StyleType = 'tab' | 'check' | 'pill-button' | 'pill-button-large'; interface SegmentedControlProps { - values: string[]; + values: React.ReactNode[]; selectedIndex?: number; style?: React.CSSProperties; className?: string; @@ -12,18 +12,20 @@ interface SegmentedControlProps { suffix?: string; isLarge?: boolean | undefined; onChange(index: number): void; + icon?: boolean; } const SegmentedControl: FC = memo( - ({ values, selectedIndex, suffix, onChange, styleType = 'tab', ...props }) => { + ({ values, selectedIndex, suffix, onChange, styleType = 'tab', icon, ...props }) => { return ( {values.map((value, index) => ( onChange(index)} + $icon={icon} > {styleType === 'check' && } {value} @@ -57,7 +59,11 @@ const SegmentedControlContainer = styled.div<{ $length: number; styleType: Style border-radius: 8px; `; -const SegmentedControlOption = styled.button<{ isSelected: boolean; styleType: StyleType }>` +const SegmentedControlOption = styled.button<{ + isSelected: boolean; + styleType: StyleType; + $icon?: boolean; +}>` font-size: ${(props) => props.styleType === 'pill-button' || props.styleType === 'pill-button-large' ? '12px' : '13px'}; font-family: ${(props) => @@ -108,6 +114,20 @@ const SegmentedControlOption = styled.button<{ isSelected: boolean; styleType: S props.isSelected && (props.styleType === 'pill-button' || props.styleType === 'pill-button-large') && props.theme.colors.common.darkYellow}; + + ${(props) => + props.$icon && + css` + display: flex; + justify-content: center; + align-items: center; + + svg { + fill: ${props.theme.colors.selectedTheme.newTheme.button.tab[ + props.isSelected ? 'active' : 'inactive' + ]}; + } + `} transition: all 0.1s ease-in-out; &:hover { color: ${(props) => props.theme.colors.selectedTheme.icon.hover}; diff --git a/sections/dashboard/Links/Links.tsx b/sections/dashboard/Links/Links.tsx index 736cae9939..69e1e23203 100644 --- a/sections/dashboard/Links/Links.tsx +++ b/sections/dashboard/Links/Links.tsx @@ -42,7 +42,6 @@ const LinkContainer = styled.div<{ $isMobile?: boolean }>` css` margin-top: 0; margin-left: 0; - margin-bottom: 50px; a { outline: none; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx index 5caf0e7163..330864f30c 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx @@ -1,6 +1,6 @@ import Link from 'next/link'; import { useRouter } from 'next/router'; -import { FC, useCallback, useState } from 'react'; +import { FC, useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; @@ -10,14 +10,14 @@ import MoonIcon from 'assets/svg/app/moon.svg'; import SunIcon from 'assets/svg/app/sun.svg'; import KwentaYellowIcon from 'assets/svg/brand/logo-yellow.svg'; import FullScreenModal from 'components/FullScreenModal'; -import { FlexDivRowCentered } from 'components/layout/flex'; +import { FlexDivRow, FlexDivRowCentered } from 'components/layout/flex'; +import SegmentedControl from 'components/SegmentedControl'; import ROUTES from 'constants/routes'; import Links from 'sections/dashboard/Links'; import Logo from 'sections/shared/Layout/Logo'; import { useAppDispatch, useAppSelector } from 'state/hooks'; import { setTheme } from 'state/preferences/reducer'; import { selectCurrentTheme } from 'state/preferences/selectors'; -import colors from 'styles/theme/colors'; import { HOMEPAGE_MENU_LINKS, MOBILE_NAV_LINKS } from '../constants'; @@ -49,9 +49,14 @@ export const MobileMenuModal: FC = ({ onDismiss }) => { onDismiss(); }, [router, onDismiss]); - const toggleTheme = useCallback(() => { - dispatch(setTheme(currentTheme === 'light' ? 'dark' : 'light')); - }, [dispatch, currentTheme]); + const toggleTheme = useCallback( + (index: number) => { + dispatch(setTheme(index === 0 ? 'light' : 'dark')); + }, + [dispatch] + ); + + const selectedThemeIndex = useMemo(() => (currentTheme === 'light' ? 0 : 1), [currentTheme]); return ( @@ -60,7 +65,17 @@ export const MobileMenuModal: FC = ({ onDismiss }) => {
- + + + + , ]} + onChange={toggleTheme} + selectedIndex={selectedThemeIndex} + icon + /> + + {menuLinks.map(({ i18nLabel, link, links }) => (
{links?.length ? ( @@ -103,46 +118,6 @@ export const MobileMenuModal: FC = ({ onDismiss }) => { )}
))} - {!(window.location.pathname === ROUTES.Home.Root) && ( -
- - ), - onClick: toggleTheme, - selected: currentTheme === 'dark', - }, - { - label: t('mobile-menu.theme.options.light'), - icon: ( - - ), - onClick: toggleTheme, - selected: currentTheme === 'light', - }, - ]} - /> -
- )}
@@ -176,4 +151,18 @@ const LogoContainer = styled.div` margin-bottom: 50px; `; +const MetaRow = styled(FlexDivRow)` + justify-content: space-between; + align-items: center; + margin-bottom: 50px; +`; + +const ControlContainer = styled.div` + width: 88px; + + > div { + gap: 6px; + } +`; + export default MobileMenuModal; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx index 9294b521aa..7e34f54e7a 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx @@ -93,7 +93,7 @@ const MobileFooterSeparator = styled.div` margin: 0 20px; height: 32px; width: 1px; - background-color: #2b2a2a; + background-color: ${(props) => props.theme.colors.selectedTheme.newTheme.border.color}; `; const MobileFooterRight = styled.div` diff --git a/styles/theme/colors/dark.ts b/styles/theme/colors/dark.ts index aeef31bb64..dbe7684e8c 100644 --- a/styles/theme/colors/dark.ts +++ b/styles/theme/colors/dark.ts @@ -27,6 +27,10 @@ const newTheme = { background: common.palette.neutral.n800, }, }, + tab: { + active: common.palette.neutral.n0, + inactive: common.palette.neutral.n500, + }, position: { long: { active: { diff --git a/styles/theme/colors/light.ts b/styles/theme/colors/light.ts index 56bae3f568..4ba9d55cd5 100644 --- a/styles/theme/colors/light.ts +++ b/styles/theme/colors/light.ts @@ -27,6 +27,10 @@ const newTheme = { background: common.palette.neutral.n30, }, }, + tab: { + active: common.palette.neutral.n1000, + inactive: common.palette.neutral.n50, + }, position: { long: { color: common.palette.green.g900, From 108112baf09f6b8c4e9ce792468090a3b984d5f9 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Thu, 15 Jun 2023 03:31:12 -0400 Subject: [PATCH 08/15] Minor SDK changes --- queries/staking/utils.ts | 14 -------- sdk/constants/staking.ts | 1 + sdk/index.ts | 3 ++ sdk/services/staking.ts | 71 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 sdk/constants/staking.ts create mode 100644 sdk/services/staking.ts diff --git a/queries/staking/utils.ts b/queries/staking/utils.ts index f051ebde22..563c8f3cb5 100644 --- a/queries/staking/utils.ts +++ b/queries/staking/utils.ts @@ -11,18 +11,6 @@ export type TradingRewardProps = { end?: number; }; -export type EpochDataProps = { - merkleRoot: string; - tokenTotal: string; - claims: { - [address: string]: { - index: number; - amount: string; - proof: string[]; - }; - }; -}; - export type FuturesFeeForAccountProps = { timestamp: number; account: string; @@ -37,8 +25,6 @@ export type FuturesFeeProps = { feesKwenta: BigNumber; }; -export type ClaimParams = [number, string, string, string[], number]; - export const EPOCH_START: Record = { 420: 1665878400, 10: 1668556800, diff --git a/sdk/constants/staking.ts b/sdk/constants/staking.ts new file mode 100644 index 0000000000..b9aacbd747 --- /dev/null +++ b/sdk/constants/staking.ts @@ -0,0 +1 @@ +export const DEFAULT_NUMBER_OF_FUTURES_FEE: number = 9999; diff --git a/sdk/index.ts b/sdk/index.ts index 4777067b25..c71ef226ab 100644 --- a/sdk/index.ts +++ b/sdk/index.ts @@ -5,6 +5,7 @@ import ExchangeService from './services/exchange'; import FuturesService from './services/futures'; import KwentaTokenService from './services/kwentaToken'; import PricesService from './services/prices'; +import StakingService from './services/staking'; import SynthsService from './services/synths'; import SystemService from './services/system'; import TransactionsService from './services/transactions'; @@ -18,6 +19,7 @@ export default class KwentaSDK { public transactions: TransactionsService; public kwentaToken: KwentaTokenService; public prices: PricesService; + public staking: StakingService; public system: SystemService; constructor(context: IContext) { @@ -28,6 +30,7 @@ export default class KwentaSDK { this.synths = new SynthsService(this); this.transactions = new TransactionsService(this); this.kwentaToken = new KwentaTokenService(this); + this.staking = new StakingService(this); this.system = new SystemService(this); } diff --git a/sdk/services/staking.ts b/sdk/services/staking.ts new file mode 100644 index 0000000000..6ad3279369 --- /dev/null +++ b/sdk/services/staking.ts @@ -0,0 +1,71 @@ +import KwentaSDK from 'sdk'; + +import { REQUIRES_L2 } from 'sdk/common/errors'; +import { + AGGREGATE_ASSET_KEY, + FUTURES_ENDPOINT_OP_MAINNET, + KWENTA_TRACKING_CODE, +} from 'sdk/constants/futures'; +import { SECONDS_PER_DAY } from 'sdk/constants/period'; +import { DEFAULT_NUMBER_OF_FUTURES_FEE } from 'sdk/constants/staking'; +import { getFuturesAggregateStats, getFuturesTrades } from 'sdk/utils/subgraph'; + +export default class StakingService { + private sdk: KwentaSDK; + + constructor(sdk: KwentaSDK) { + this.sdk = sdk; + } + + public async getFuturesFee(start: number, end: number) { + if (!this.sdk.context.isL2) { + throw new Error(REQUIRES_L2); + } + + const response = await getFuturesAggregateStats( + FUTURES_ENDPOINT_OP_MAINNET, + { + first: DEFAULT_NUMBER_OF_FUTURES_FEE, + where: { + asset: AGGREGATE_ASSET_KEY, + period: SECONDS_PER_DAY, + timestamp_gte: start, + timestamp_lt: end, + }, + orderDirection: 'desc', + orderBy: 'timestamp', + }, + { timestamp: true, feesKwenta: true } + ); + + return response; + } + + public async getFuturesFeeForAccount(account: string, start: number, end: number) { + if (!account) return null; + + const response = await getFuturesTrades( + FUTURES_ENDPOINT_OP_MAINNET, + { + first: DEFAULT_NUMBER_OF_FUTURES_FEE, + where: { + account: account, + timestamp_gt: start, + timestamp_lt: end, + trackingCode: KWENTA_TRACKING_CODE, + }, + orderDirection: 'desc', + orderBy: 'timestamp', + }, + { + timestamp: true, + account: true, + abstractAccount: true, + accountType: true, + feesPaid: true, + keeperFeesPaid: true, + } + ); + return response; + } +} From 18bf21f631f8099f6d71db2587efd21985c987a0 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Thu, 15 Jun 2023 12:16:56 -0400 Subject: [PATCH 09/15] Address PR comments --- package-lock.json | 464 ++++++++++++++---------------------- sdk/constants/stats.ts | 7 + sdk/index.ts | 3 - sdk/services/kwentaToken.ts | 59 +++++ sdk/services/staking.ts | 71 ------ sdk/services/stats.ts | 23 +- sdk/utils/stats.ts | 18 ++ 7 files changed, 271 insertions(+), 374 deletions(-) create mode 100644 sdk/constants/stats.ts delete mode 100644 sdk/services/staking.ts create mode 100644 sdk/utils/stats.ts diff --git a/package-lock.json b/package-lock.json index 24560fa5b8..7ac1dc9c0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -152,7 +152,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -165,7 +164,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -197,7 +195,6 @@ "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -400,7 +397,6 @@ "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", @@ -473,7 +469,6 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", - "dev": true, "dependencies": { "@babel/types": "^7.19.4" }, @@ -547,7 +542,6 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", - "dev": true, "dependencies": { "@babel/template": "^7.18.10", "@babel/traverse": "^7.19.4", @@ -2875,7 +2869,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -2895,7 +2888,6 @@ "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2910,7 +2902,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, "engines": { "node": ">= 4" } @@ -3771,7 +3762,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -3797,8 +3787,7 @@ "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -21775,7 +21764,7 @@ "version": "17.0.17", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "^17" } @@ -21784,7 +21773,7 @@ "version": "17.0.50", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.50.tgz", "integrity": "sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -21795,7 +21784,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true + "devOptional": true }, "node_modules/@types/react-native": { "version": "0.70.4", @@ -21898,7 +21887,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "node_modules/@types/secp256k1": { "version": "4.0.3", @@ -23853,7 +23842,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -23875,7 +23863,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -23993,7 +23980,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -24036,7 +24022,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } @@ -24232,7 +24217,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -24531,7 +24515,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "engines": { "node": ">=8" } @@ -31871,7 +31854,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -32285,7 +32267,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, + "devOptional": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -32294,7 +32276,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "devOptional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -32350,7 +32332,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "dependencies": { "ansi-colors": "^4.1.1" }, @@ -32617,7 +32598,6 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -33451,7 +33431,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -33464,7 +33443,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -33491,7 +33469,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, "engines": { "node": ">=10" } @@ -33500,7 +33477,6 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -33509,7 +33485,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -33524,7 +33499,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -33540,7 +33514,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -33551,14 +33524,12 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -33573,7 +33544,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, "engines": { "node": ">=4" } @@ -33582,7 +33552,6 @@ "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -33597,7 +33566,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -33606,7 +33574,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, "engines": { "node": ">= 4" } @@ -33615,7 +33582,6 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -33632,7 +33598,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -33647,7 +33612,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -33659,7 +33623,6 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -33673,7 +33636,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, "engines": { "node": ">=4" } @@ -33694,7 +33656,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -33706,7 +33667,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -35466,8 +35426,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.2.0", @@ -35504,8 +35463,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -35629,7 +35587,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -36133,7 +36090,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -36145,8 +36101,7 @@ "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/flush-write-stream": { "version": "1.1.1", @@ -36563,8 +36518,7 @@ "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -36598,7 +36552,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -38288,7 +38241,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -43320,7 +43272,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -43541,8 +43492,7 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify": { "version": "0.0.1", @@ -43556,8 +43506,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -43576,7 +43525,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -44040,7 +43988,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -44647,8 +44594,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -44675,8 +44621,7 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -46131,8 +46076,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/natural-compare-lite": { "version": "1.4.0", @@ -48527,7 +48471,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -48665,7 +48608,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -50325,7 +50267,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, "engines": { "node": ">=8" }, @@ -50804,7 +50745,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -52949,8 +52889,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/squeak": { "version": "1.3.0", @@ -53649,7 +53588,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -54445,7 +54383,6 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -54494,7 +54431,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -54510,7 +54446,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -54525,7 +54460,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -54536,14 +54470,12 @@ "node_modules/table/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -54551,14 +54483,12 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -55066,8 +54996,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/throttle-debounce": { "version": "2.3.0", @@ -55631,7 +55560,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -55651,7 +55579,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -55761,7 +55688,6 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -56435,7 +56361,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -56444,7 +56369,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "engines": { "node": ">=6" } @@ -56698,8 +56622,7 @@ "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "node_modules/v8-to-istanbul": { "version": "9.0.1", @@ -59732,7 +59655,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -59742,7 +59664,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -59767,7 +59688,6 @@ "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -59915,7 +59835,6 @@ "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", @@ -59970,7 +59889,6 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", - "dev": true, "requires": { "@babel/types": "^7.19.4" } @@ -60023,7 +59941,6 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", - "dev": true, "requires": { "@babel/template": "^7.18.10", "@babel/traverse": "^7.19.4", @@ -61609,7 +61526,8 @@ "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==" + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "requires": {} }, "@emotion/utils": { "version": "1.2.0", @@ -61698,7 +61616,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -61715,7 +61632,6 @@ "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -61723,8 +61639,7 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" } } }, @@ -62281,7 +62196,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -62297,8 +62211,7 @@ "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -63744,7 +63657,8 @@ "@material-ui/types": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} }, "@material-ui/utils": { "version": "4.11.3", @@ -63841,7 +63755,8 @@ "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "dev": true + "dev": true, + "requires": {} }, "@mdx-js/util": { "version": "1.6.22", @@ -64476,7 +64391,8 @@ "ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} } } }, @@ -68715,7 +68631,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", - "dev": true + "dev": true, + "requires": {} }, "y18n": { "version": "4.0.3", @@ -69598,7 +69515,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "is-extendable": { "version": "0.1.1", @@ -69700,7 +69618,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -71210,7 +71129,8 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true + "dev": true, + "requires": {} }, "y18n": { "version": "4.0.3", @@ -72777,7 +72697,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "is-extendable": { "version": "0.1.1", @@ -72873,7 +72794,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -73768,49 +73690,57 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz", "integrity": "sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz", "integrity": "sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz", "integrity": "sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz", "integrity": "sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz", "integrity": "sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz", "integrity": "sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz", "integrity": "sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz", "integrity": "sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-preset": { "version": "6.4.0", @@ -74186,7 +74116,8 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.2.1", @@ -74244,7 +74175,8 @@ "@tanstack/query-persist-client-core": { "version": "4.15.1", "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-4.15.1.tgz", - "integrity": "sha512-ldoGHNJ4Du83CT1CvJQqaJtQXEz4CdGcDmexVoyRG2q8DV9PAfYi+zls462ZbIWxlni93pkEgG1/q4mZVk2nqQ==" + "integrity": "sha512-ldoGHNJ4Du83CT1CvJQqaJtQXEz4CdGcDmexVoyRG2q8DV9PAfYi+zls462ZbIWxlni93pkEgG1/q4mZVk2nqQ==", + "requires": {} }, "@tanstack/query-sync-storage-persister": { "version": "4.15.1", @@ -76185,7 +76117,7 @@ "version": "17.0.17", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", - "dev": true, + "devOptional": true, "requires": { "@types/react": "^17" }, @@ -76194,7 +76126,7 @@ "version": "17.0.50", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.50.tgz", "integrity": "sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==", - "dev": true, + "devOptional": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -76205,7 +76137,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true + "devOptional": true } } }, @@ -76304,7 +76236,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "devOptional": true }, "@types/secp256k1": { "version": "4.0.3", @@ -76993,7 +76925,8 @@ "@vanilla-extract/sprinkles": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.5.0.tgz", - "integrity": "sha512-W58f2Rzz5lLmk0jbhgStVlZl5wEiPB1Ur3fRvUaBM+MrifZ3qskmFq/CiH//fEYeG5Dh9vF1qRviMMH46cX9Nw==" + "integrity": "sha512-W58f2Rzz5lLmk0jbhgStVlZl5wEiPB1Ur3fRvUaBM+MrifZ3qskmFq/CiH//fEYeG5Dh9vF1qRviMMH46cX9Nw==", + "requires": {} }, "@wagmi/chains": { "version": "0.1.7", @@ -77015,7 +76948,8 @@ "abitype": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.1.8.tgz", - "integrity": "sha512-2pde0KepTzdfu19ZrzYTYVIWo69+6UbBCY4B1RDiwWgo2XZtFSJhF6C+XThuRXbbZ823J0Rw1Y5cP0NXYVcCdQ==" + "integrity": "sha512-2pde0KepTzdfu19ZrzYTYVIWo69+6UbBCY4B1RDiwWgo2XZtFSJhF6C+XThuRXbbZ823J0Rw1Y5cP0NXYVcCdQ==", + "requires": {} } } }, @@ -77393,7 +77327,8 @@ "ws": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "requires": {} } } }, @@ -77791,7 +77726,8 @@ "abitype": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.2.5.tgz", - "integrity": "sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA==" + "integrity": "sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA==", + "requires": {} }, "abortcontroller-polyfill": { "version": "1.7.5", @@ -77821,8 +77757,7 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-globals": { "version": "6.0.0", @@ -77838,7 +77773,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -77937,7 +77872,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -77949,13 +77883,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-align": { "version": "3.0.1", @@ -77969,8 +77905,7 @@ "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" }, "ansi-escapes": { "version": "4.3.2", @@ -78107,7 +78042,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -78337,8 +78271,7 @@ "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { "version": "3.2.4", @@ -79856,7 +79789,8 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", - "dev": true + "dev": true, + "requires": {} }, "babylon": { "version": "6.18.0", @@ -83660,7 +83594,8 @@ "date-fns-tz": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.7.tgz", - "integrity": "sha512-1t1b8zyJo+UI8aR+g3iqr5fkUHWpd58VBx8J/ZSQ+w7YrGlw80Ag4sA86qkfCXRBLmMc4I2US+aPMd4uKvwj5g==" + "integrity": "sha512-1t1b8zyJo+UI8aR+g3iqr5fkUHWpd58VBx8J/ZSQ+w7YrGlw80Ag4sA86qkfCXRBLmMc4I2US+aPMd4uKvwj5g==", + "requires": {} }, "dayjs": { "version": "1.10.7", @@ -84245,7 +84180,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "requires": { "esutils": "^2.0.2" } @@ -84594,7 +84528,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, + "devOptional": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -84603,7 +84537,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "devOptional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -84654,7 +84588,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "requires": { "ansi-colors": "^4.1.1" } @@ -84869,7 +84802,6 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -84917,7 +84849,6 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -84926,7 +84857,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -84935,7 +84865,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -84945,7 +84874,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -84953,14 +84881,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" }, @@ -84968,8 +84894,7 @@ "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" } } }, @@ -84977,7 +84902,6 @@ "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -84985,20 +84909,17 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -85012,7 +84933,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -85021,7 +84941,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -85161,7 +85080,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true + "dev": true, + "requires": {} }, "eslint-config-react-app": { "version": "6.0.0", @@ -85176,7 +85096,8 @@ "version": "16.0.3", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.7", @@ -85254,7 +85175,8 @@ "version": "0.7.2", "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz", "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-cypress": { "version": "2.12.1", @@ -85446,13 +85368,15 @@ "eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "requires": {} }, "eslint-plugin-standard": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.7.2", @@ -85520,7 +85444,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -85529,8 +85452,7 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" } } }, @@ -85546,14 +85468,12 @@ "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -85563,8 +85483,7 @@ "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" } } }, @@ -85577,7 +85496,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, "requires": { "estraverse": "^5.1.0" } @@ -85586,7 +85504,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" } @@ -87162,8 +87079,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -87197,8 +87113,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -87314,7 +87229,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -87728,7 +87642,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -87737,8 +87650,7 @@ "flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "flush-write-stream": { "version": "1.1.1", @@ -88031,8 +87943,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "functions-have-names": { "version": "1.2.3", @@ -88059,8 +87970,7 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-assigned-identifiers": { "version": "1.2.0", @@ -89328,8 +89238,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "indent-string": { "version": "4.0.0", @@ -90298,7 +90207,8 @@ "ws": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==" + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "requires": {} } } }, @@ -90315,7 +90225,8 @@ "isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "requires": {} }, "isstream": { "version": "0.1.2", @@ -91726,7 +91637,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-preview": { "version": "0.3.1", @@ -91755,37 +91667,43 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "dev": true + "dev": true, + "requires": {} }, "@svgr/babel-preset": { "version": "6.5.1", @@ -91903,7 +91821,8 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -92693,7 +92612,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/jest-transformer-svg/-/jest-transformer-svg-2.0.0.tgz", "integrity": "sha512-+f6er7UZTiHTeel9nma1i0NTAU8AjbEvhK2RYUoMxTNihwo98z2rrrDBIbppZI6ACDzeul3bhRmI9M6d25J/Nw==", - "dev": true + "dev": true, + "requires": {} }, "jest-util": { "version": "26.6.2", @@ -93060,7 +92980,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -93158,7 +93077,8 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -93224,8 +93144,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "0.0.1", @@ -93239,8 +93158,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "json-stringify-safe": { "version": "5.0.1", @@ -93258,8 +93176,7 @@ "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -93661,7 +93578,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -94106,8 +94022,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.once": { "version": "4.1.1", @@ -94134,8 +94049,7 @@ "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "lodash.uniq": { "version": "4.5.0", @@ -95290,8 +95204,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "natural-compare-lite": { "version": "1.4.0", @@ -95373,7 +95286,8 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.9.3.tgz", "integrity": "sha512-jl8eFe71LpMVGeBMpoxILkGfEgGY7IfLy8XPyv05/o61p5oQRNpoMmk46VMxRIpt0fI8XcvznBZKpDK6vbYQcQ==", - "dev": true + "dev": true, + "requires": {} }, "next-tick": { "version": "1.1.0", @@ -97113,8 +97027,7 @@ "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "1.0.4", @@ -97211,8 +97124,7 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise-inflight": { "version": "1.0.1", @@ -97490,7 +97402,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -97810,7 +97723,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true + "dev": true, + "requires": {} }, "react-dom": { "version": "18.2.0", @@ -98106,7 +98020,8 @@ "react-table": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.7.0.tgz", - "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==" + "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==", + "requires": {} }, "react-test-renderer": { "version": "17.0.1", @@ -98366,12 +98281,14 @@ "redux-persist": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", - "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==" + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "requires": {} }, "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "requires": {} }, "regenerate": { "version": "1.4.2", @@ -98447,8 +98364,7 @@ "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { "version": "5.2.1", @@ -98825,8 +98741,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -98993,7 +98908,8 @@ "ws": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==" + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "requires": {} } } }, @@ -99956,7 +99872,8 @@ "slick-carousel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", - "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==" + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "requires": {} }, "snake-case": { "version": "2.1.0", @@ -100557,8 +100474,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "squeak": { "version": "1.3.0", @@ -101104,8 +101020,7 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "strip-outer": { "version": "1.0.1", @@ -101195,7 +101110,8 @@ "styled-media-query": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/styled-media-query/-/styled-media-query-2.1.2.tgz", - "integrity": "sha512-ds24iBxOrfIhdHP+e23y6kj1gbosgWu+tgAuxvMrYmnp6Sju/LjuY8lfkiVnn6P7mcdhtwpC2Z43o+apT9UdJg==" + "integrity": "sha512-ds24iBxOrfIhdHP+e23y6kj1gbosgWu+tgAuxvMrYmnp6Sju/LjuY8lfkiVnn6P7mcdhtwpC2Z43o+apT9UdJg==", + "requires": {} }, "stylis": { "version": "4.0.13", @@ -101531,7 +101447,8 @@ "swr": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", - "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==" + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==", + "requires": {} }, "symbol-tree": { "version": "3.2.4", @@ -101746,7 +101663,6 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, "requires": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -101759,7 +101675,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -101771,7 +101686,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -101780,7 +101694,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -101788,26 +101701,22 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -102219,8 +102128,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "throttle-debounce": { "version": "2.3.0", @@ -102577,7 +102485,8 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true + "dev": true, + "requires": {} }, "ts-log": { "version": "2.2.5", @@ -102672,7 +102581,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -102685,8 +102593,7 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, "type-is": { "version": "1.6.18", @@ -102767,8 +102674,7 @@ "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" }, "typical": { "version": "4.0.0", @@ -103264,7 +103170,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -103272,8 +103177,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, @@ -103384,7 +103288,8 @@ "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} }, "utf-8-validate": { "version": "5.0.9", @@ -103458,8 +103363,7 @@ "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8-to-istanbul": { "version": "9.0.1", @@ -105313,7 +105217,8 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "commander": { "version": "2.20.3", @@ -105743,7 +105648,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} }, "x-default-browser": { "version": "0.4.0", diff --git a/sdk/constants/stats.ts b/sdk/constants/stats.ts new file mode 100644 index 0000000000..4a4820c784 --- /dev/null +++ b/sdk/constants/stats.ts @@ -0,0 +1,7 @@ +export const DEFAULT_LEADERBOARD_DATA = { + top: [], + bottom: [], + wallet: [], + search: [], + all: [], +}; diff --git a/sdk/index.ts b/sdk/index.ts index c71ef226ab..4777067b25 100644 --- a/sdk/index.ts +++ b/sdk/index.ts @@ -5,7 +5,6 @@ import ExchangeService from './services/exchange'; import FuturesService from './services/futures'; import KwentaTokenService from './services/kwentaToken'; import PricesService from './services/prices'; -import StakingService from './services/staking'; import SynthsService from './services/synths'; import SystemService from './services/system'; import TransactionsService from './services/transactions'; @@ -19,7 +18,6 @@ export default class KwentaSDK { public transactions: TransactionsService; public kwentaToken: KwentaTokenService; public prices: PricesService; - public staking: StakingService; public system: SystemService; constructor(context: IContext) { @@ -30,7 +28,6 @@ export default class KwentaSDK { this.synths = new SynthsService(this); this.transactions = new TransactionsService(this); this.kwentaToken = new KwentaTokenService(this); - this.staking = new StakingService(this); this.system = new SystemService(this); } diff --git a/sdk/services/kwentaToken.ts b/sdk/services/kwentaToken.ts index 3c74eebf4b..7d89b8a13f 100644 --- a/sdk/services/kwentaToken.ts +++ b/sdk/services/kwentaToken.ts @@ -10,10 +10,17 @@ import { TRADING_REWARDS_CUTOFF_EPOCH, WEEK, } from 'queries/staking/utils'; +import { + AGGREGATE_ASSET_KEY, + FUTURES_ENDPOINT_OP_MAINNET, + KWENTA_TRACKING_CODE, +} from 'sdk/constants/futures'; import { ZERO_WEI } from 'sdk/constants/number'; +import { SECONDS_PER_DAY } from 'sdk/constants/period'; import { ContractName } from 'sdk/contracts'; import { formatTruncatedDuration } from 'sdk/utils/date'; import { weiFromWei } from 'sdk/utils/number'; +import { getFuturesAggregateStats, getFuturesTrades } from 'sdk/utils/subgraph'; import * as sdkErrors from '../common/errors'; import { ETH_COINGECKO_ADDRESS, KWENTA_ADDRESS, OP_ADDRESS } from '../constants/exchange'; @@ -614,6 +621,58 @@ export default class KwentaTokenService { ); } + public async getFuturesFee(start: number, end: number) { + if (!this.sdk.context.isL2) { + throw new Error(sdkErrors.REQUIRES_L2); + } + + const response = await getFuturesAggregateStats( + FUTURES_ENDPOINT_OP_MAINNET, + { + first: DEFAULT_NUMBER_OF_FUTURES_FEE, + where: { + asset: AGGREGATE_ASSET_KEY, + period: SECONDS_PER_DAY, + timestamp_gte: start, + timestamp_lt: end, + }, + orderDirection: 'desc', + orderBy: 'timestamp', + }, + { timestamp: true, feesKwenta: true } + ); + + return response; + } + + public async getFuturesFeeForAccount(account: string, start: number, end: number) { + if (!account) return null; + + const response = await getFuturesTrades( + FUTURES_ENDPOINT_OP_MAINNET, + { + first: DEFAULT_NUMBER_OF_FUTURES_FEE, + where: { + account: account, + timestamp_gt: start, + timestamp_lt: end, + trackingCode: KWENTA_TRACKING_CODE, + }, + orderDirection: 'desc', + orderBy: 'timestamp', + }, + { + timestamp: true, + account: true, + abstractAccount: true, + accountType: true, + feesPaid: true, + keeperFeesPaid: true, + } + ); + return response; + } + private performStakeAction( action: 'stake' | 'unstake', amount: string | BigNumber, diff --git a/sdk/services/staking.ts b/sdk/services/staking.ts deleted file mode 100644 index 6ad3279369..0000000000 --- a/sdk/services/staking.ts +++ /dev/null @@ -1,71 +0,0 @@ -import KwentaSDK from 'sdk'; - -import { REQUIRES_L2 } from 'sdk/common/errors'; -import { - AGGREGATE_ASSET_KEY, - FUTURES_ENDPOINT_OP_MAINNET, - KWENTA_TRACKING_CODE, -} from 'sdk/constants/futures'; -import { SECONDS_PER_DAY } from 'sdk/constants/period'; -import { DEFAULT_NUMBER_OF_FUTURES_FEE } from 'sdk/constants/staking'; -import { getFuturesAggregateStats, getFuturesTrades } from 'sdk/utils/subgraph'; - -export default class StakingService { - private sdk: KwentaSDK; - - constructor(sdk: KwentaSDK) { - this.sdk = sdk; - } - - public async getFuturesFee(start: number, end: number) { - if (!this.sdk.context.isL2) { - throw new Error(REQUIRES_L2); - } - - const response = await getFuturesAggregateStats( - FUTURES_ENDPOINT_OP_MAINNET, - { - first: DEFAULT_NUMBER_OF_FUTURES_FEE, - where: { - asset: AGGREGATE_ASSET_KEY, - period: SECONDS_PER_DAY, - timestamp_gte: start, - timestamp_lt: end, - }, - orderDirection: 'desc', - orderBy: 'timestamp', - }, - { timestamp: true, feesKwenta: true } - ); - - return response; - } - - public async getFuturesFeeForAccount(account: string, start: number, end: number) { - if (!account) return null; - - const response = await getFuturesTrades( - FUTURES_ENDPOINT_OP_MAINNET, - { - first: DEFAULT_NUMBER_OF_FUTURES_FEE, - where: { - account: account, - timestamp_gt: start, - timestamp_lt: end, - trackingCode: KWENTA_TRACKING_CODE, - }, - orderDirection: 'desc', - orderBy: 'timestamp', - }, - { - timestamp: true, - account: true, - abstractAccount: true, - accountType: true, - feesPaid: true, - keeperFeesPaid: true, - } - ); - return response; - } -} diff --git a/sdk/services/stats.ts b/sdk/services/stats.ts index 62642d4391..11017e13fa 100644 --- a/sdk/services/stats.ts +++ b/sdk/services/stats.ts @@ -4,38 +4,19 @@ import KwentaSDK from 'sdk'; import { REQUIRES_L2 } from 'sdk/common/errors'; import { FUTURES_ENDPOINT_OP_MAINNET } from 'sdk/constants/futures'; +import { DEFAULT_LEADERBOARD_DATA } from 'sdk/constants/stats'; import { ETH_UNIT } from 'sdk/constants/transactions'; import { AccountStat, FuturesStat } from 'sdk/types/stats'; -import { weiFromWei } from 'sdk/utils/number'; +import { mapStat } from 'sdk/utils/stats'; import { truncateAddress } from 'sdk/utils/string'; import { getFuturesStats } from 'sdk/utils/subgraph'; -const mapStat = (stat: FuturesStat, i: number) => ({ - ...stat, - trader: stat.account, - traderShort: truncateAddress(stat.account), - pnl: weiFromWei(stat.pnlWithFeesPaid), - totalVolume: weiFromWei(stat.totalVolume), - totalTrades: wei(stat.totalTrades).toNumber(), - liquidations: wei(stat.liquidations).toNumber(), - rank: i + 1, - rankText: (i + 1).toString(), -}); - type LeaderboardPart = 'top' | 'bottom' | 'wallet' | 'search' | 'all'; type LeaderboardResult = { [part in LeaderboardPart]: AccountStat[]; }; -export const DEFAULT_LEADERBOARD_DATA = { - top: [], - bottom: [], - wallet: [], - search: [], - all: [], -}; - export default class StatsService { private sdk: KwentaSDK; diff --git a/sdk/utils/stats.ts b/sdk/utils/stats.ts new file mode 100644 index 0000000000..9f90df81e3 --- /dev/null +++ b/sdk/utils/stats.ts @@ -0,0 +1,18 @@ +import { wei } from '@synthetixio/wei'; + +import { FuturesStat } from 'sdk/types/stats'; + +import { weiFromWei } from './number'; +import { truncateAddress } from './string'; + +export const mapStat = (stat: FuturesStat, i: number) => ({ + ...stat, + trader: stat.account, + traderShort: truncateAddress(stat.account), + pnl: weiFromWei(stat.pnlWithFeesPaid), + totalVolume: weiFromWei(stat.totalVolume), + totalTrades: wei(stat.totalTrades).toNumber(), + liquidations: wei(stat.liquidations).toNumber(), + rank: i + 1, + rankText: (i + 1).toString(), +}); From c15a0bf0225dbcc27ef06f774b6514a51691bd44 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Thu, 15 Jun 2023 12:27:32 -0400 Subject: [PATCH 10/15] Add market dropdown to z-index enum --- constants/ui.ts | 1 + sections/futures/Trade/MarketsDropdown.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/constants/ui.ts b/constants/ui.ts index f03f63193a..2a1ed05df0 100644 --- a/constants/ui.ts +++ b/constants/ui.ts @@ -12,4 +12,5 @@ export enum zIndex { DIALOG_OVERLAY = 50, MOBILE_FOOTER = 51, DRAWER = 65, + MARKET_DROPDOWN = 400, } diff --git a/sections/futures/Trade/MarketsDropdown.tsx b/sections/futures/Trade/MarketsDropdown.tsx index 5acfc0688b..379308ffb8 100644 --- a/sections/futures/Trade/MarketsDropdown.tsx +++ b/sections/futures/Trade/MarketsDropdown.tsx @@ -17,6 +17,7 @@ import { Body } from 'components/Text'; import NumericValue from 'components/Text/NumericValue'; import { BANNER_HEIGHT_DESKTOP, BANNER_HEIGHT_MOBILE } from 'constants/announcement'; import ROUTES from 'constants/routes'; +import { zIndex } from 'constants/ui'; import useClickOutside from 'hooks/useClickOutside'; import useLocalStorage from 'hooks/useLocalStorage'; import { ZERO_WEI } from 'sdk/constants/number'; @@ -370,7 +371,7 @@ const SearchBarContainer = styled.div` `; const SelectContainer = styled.div<{ mobile?: boolean; accountType?: string }>` - z-index: 40; + z-index: ${zIndex.MARKET_DROPDOWN}; height: ${MARKETS_DETAILS_HEIGHT_DESKTOP}px; position: relative; border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; From d6773c1886b5c92bc7a3c92b65ad28a025c72e40 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Thu, 15 Jun 2023 17:35:31 -0400 Subject: [PATCH 11/15] Fix everything --- constants/ui.ts | 2 +- .../Header/MobileUserMenu/MobileMenuModal.tsx | 10 +- .../MobileUserMenu/MobileSettingsModal.tsx | 167 ------------------ .../Header/MobileUserMenu/MobileSubMenu.tsx | 105 +++++------ .../Header/MobileUserMenu/MobileUserMenu.tsx | 1 + .../AppLayout/Header/MobileUserMenu/menu.ts | 2 +- 6 files changed, 47 insertions(+), 240 deletions(-) delete mode 100644 sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSettingsModal.tsx diff --git a/constants/ui.ts b/constants/ui.ts index 2a1ed05df0..0fd0cc7c38 100644 --- a/constants/ui.ts +++ b/constants/ui.ts @@ -12,5 +12,5 @@ export enum zIndex { DIALOG_OVERLAY = 50, MOBILE_FOOTER = 51, DRAWER = 65, - MARKET_DROPDOWN = 400, + MARKET_DROPDOWN = 40, } diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx index 330864f30c..ac3b4d60f1 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx @@ -1,6 +1,6 @@ import Link from 'next/link'; import { useRouter } from 'next/router'; -import { FC, useCallback, useMemo, useState } from 'react'; +import { FC, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; @@ -38,12 +38,6 @@ export const MobileMenuModal: FC = ({ onDismiss }) => { const currentTheme = useAppSelector(selectCurrentTheme); - const [expanded, setExpanded] = useState(); - - const handleToggle = (link: string) => () => { - setExpanded((l) => (l === link ? undefined : link)); - }; - const showStatsPage = useCallback(() => { router.push(ROUTES.Stats.Home); onDismiss(); @@ -81,11 +75,9 @@ export const MobileMenuModal: FC = ({ onDismiss }) => { {links?.length ? ( ) : link === ROUTES.Stats.Home ? ( void; -}; - -type SettingCategories = 'wallet' | 'network' | 'language' | 'currency' | 'theme'; - -export const MobileSettingsModal: FC = ({ onDismiss }) => { - const { t } = useTranslation(); - const dispatch = useAppDispatch(); - const language = useAppSelector(selectLanguage); - - const languages = t('languages', { returnObjects: true }) as Record; - - const languageOptions = useMemo( - () => - Object.entries(languages).map(([langCode, langLabel]) => ({ - value: langCode, - label: langLabel, - })), - [languages] - ); - - const { openAccountModal } = useAccountModal(); - const { openChainModal } = useChainModal(); - const { disconnect } = useDisconnect(); - - const [expanded, setExpanded] = useState(); - const currentTheme = useAppSelector(selectCurrentTheme); - - const handleToggle = (category: SettingCategories) => () => { - setExpanded((c) => (category === c ? undefined : category)); - }; - - return ( - - - - - - -
- {!(window.location.pathname === ROUTES.Home.Root) && ( - <> -
- - ), - onClick: openAccountModal, - }, - { - label: t('mobile-menu.disconnect'), - icon: , - onClick: disconnect, - }, - ]} - /> -
- -
- , - onClick: openChainModal, - }, - { - label: `${t('mobile-menu.bridge')} ↗`, - icon: , - externalLink: EXTERNAL_LINKS.Trading.OptimismTokenBridge, - }, - ]} - /> -
- - )} - -
- ({ - label: option.label, - icon:
{languageIcon[option.value as Language]}
, - selected: languages[language] === option.value, - onClick: () => dispatch(setLanguage(option.value as Language)), - }))} - /> -
-
-
-
- ); -}; - -const StyledFullScreenModal = styled(FullScreenModal)` - top: 0; - - [data-reach-dialog-content] { - margin: 0; - width: 100%; - height: 100%; - - & > div { - height: 100%; - } - } -`; - -const Container = styled.div<{ hasBorder?: boolean }>` - padding: 24px 32px 100px; - height: 100%; - display: flex; - flex-direction: column; - justify-content: space-between; - - ${(props) => - props.hasBorder && - css` - border-top: 1px solid ${(props) => props.theme.colors.common.secondaryGray}; - `} -`; - -const LogoContainer = styled.div` - margin-bottom: 50px; -`; - -export default MobileSettingsModal; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx index 5b8c667266..99f953cb72 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSubMenu.tsx @@ -4,8 +4,6 @@ import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import styled, { css } from 'styled-components'; -import ChevronDown from 'assets/svg/app/chevron-down.svg'; -import ChevronUp from 'assets/svg/app/chevron-up.svg'; import Badge from 'components/Badge'; import { GridDiv } from 'components/layout/grid'; import { useAppSelector } from 'state/hooks'; @@ -27,78 +25,67 @@ type MobileSubMenuOption = { type MobileSubMenuProps = { i18nLabel: string; defaultOpen?: boolean; - active: boolean; options?: MobileSubMenuOption[]; links?: SubMenuLink[]; onDismiss(): void; - onToggle(): void; }; const MobileSubMenu: React.FC = memo( - ({ i18nLabel, active, options, links, onDismiss, onToggle }) => { + ({ i18nLabel, options, links, onDismiss }) => { const { t } = useTranslation(); const { asPath } = useRouter(); const currentTheme = useAppSelector(selectCurrentTheme); return ( <> - - {t(i18nLabel)} - {active ? : } - - {active && ( - - {links - ? links.map(({ i18nLabel, link: subLink, badge, Icon }) => ( - - - -
- {t(i18nLabel)}{' '} - {badge?.map(({ i18nLabel, color }) => ( - {t(i18nLabel)} - ))} - {Icon && } -
+ {t(i18nLabel)} + + {links + ? links.map(({ i18nLabel, link: subLink, badge, Icon }) => ( + + + +
+ {t(i18nLabel)}{' '} + {badge?.map(({ i18nLabel, color }) => ( + {t(i18nLabel)} + ))} + {Icon && } +
+
+
+
+ )) + : options?.map(({ label, icon, onClick, selected, externalLink }) => ( + + {icon ?? '·'} + {externalLink ? ( + + + {label} -
-
- )) - : options?.map(({ label, icon, onClick, selected, externalLink }) => ( - - {icon ?? '·'} - {externalLink ? ( - - - {label} - - - ) : ( - - - {label} - - - )} - - ))} -
- )} + + ) : ( + + + {label} + + + )} + + ))} + ); } ); const SubMenuButton = styled(MenuButton)` - ${(props) => - props.isActive && - css` - margin-bottom: 20px; - `} + margin-bottom: 20px; `; const StyledBadge = styled(Badge)` @@ -132,7 +119,7 @@ const SubMenuExternalLink = styled.a` `; const SubMenuItem = styled.div<{ currentTheme: ThemeName; active?: boolean; selected?: boolean }>` - font-size: 19px; + font-size: 16px; color: ${(props) => props.theme.colors.selectedTheme.newTheme.text.secondary}; box-sizing: border-box; width: 100%; @@ -150,12 +137,6 @@ const SubMenuItem = styled.div<{ currentTheme: ThemeName; active?: boolean; sele width: 22px; } - ${(props) => - props.active && - css` - color: ${(props) => props.theme.colors.selectedTheme.button.active}; - `} - ${(props) => props.selected && css` diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx index 7e34f54e7a..24643281c7 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx @@ -83,6 +83,7 @@ const MobileFooterContainer = styled.div` padding: 15px 20px; background-color: ${(props) => props.theme.colors.selectedTheme.background}; z-index: 51; + min-height: 71px; `; const MobileFooterIconContainer = styled.div` diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts index 9286f44910..07ef8e66d4 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/menu.ts @@ -5,7 +5,7 @@ import type { ThemeName } from 'styles/theme'; export const MenuButton = styled.div<{ currentTheme: ThemeName; - isActive: boolean; + isActive?: boolean; isLink?: boolean; }>` outline: none; From 39af6b3ca3b8858a78eec79d15b892242aa39d9b Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Thu, 15 Jun 2023 23:50:16 -0400 Subject: [PATCH 12/15] Make drawer work on all tabs --- sections/futures/MobileTrade/MobileTrade.tsx | 16 ++++++++++++++-- .../MobileTrade/UserTabs/PositionsTab.tsx | 11 ----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/sections/futures/MobileTrade/MobileTrade.tsx b/sections/futures/MobileTrade/MobileTrade.tsx index a8ba0b7af5..04d7532840 100644 --- a/sections/futures/MobileTrade/MobileTrade.tsx +++ b/sections/futures/MobileTrade/MobileTrade.tsx @@ -1,11 +1,12 @@ -import React from 'react'; +import { useCallback } from 'react'; import styled from 'styled-components'; import Connector from 'containers/Connector'; import useIsL2 from 'hooks/useIsL2'; import useWindowSize from 'hooks/useWindowSize'; import { selectShowBanner } from 'state/app/selectors'; -import { useAppSelector } from 'state/hooks'; +import { setTradePanelDrawerOpen } from 'state/futures/reducer'; +import { useAppDispatch, useAppSelector } from 'state/hooks'; import MarketDetails from '../MarketDetails/MarketDetails'; import FuturesUnsupportedNetwork from '../Trade/FuturesUnsupported'; @@ -13,6 +14,7 @@ import MarketsDropdown from '../Trade/MarketsDropdown'; import { MARKET_SELECTOR_HEIGHT_MOBILE } from '../Trade/MarketsDropdownSelector'; import TradeBalance from '../Trade/TradeBalance'; +import TradePanelDrawer from './drawers/TradePanelDrawer'; import OverviewTabs from './OverviewTabs'; import UserTabs from './UserTabs'; @@ -21,6 +23,13 @@ const MobileTrade: React.FC = () => { const { walletAddress } = Connector.useContainer(); const { deviceType } = useWindowSize(); const showBanner = useAppSelector(selectShowBanner); + const tradeDrawerPanelOpen = useAppSelector(({ futures }) => futures.tradePanelDrawerOpen); + const dispatch = useAppDispatch(); + + const handleCloseDrawer = useCallback(() => { + dispatch(setTradePanelDrawerOpen(false)); + }, [dispatch]); + return ( <> @@ -36,6 +45,9 @@ const MobileTrade: React.FC = () => { ) : ( )} + {tradeDrawerPanelOpen && ( + + )} ); }; diff --git a/sections/futures/MobileTrade/UserTabs/PositionsTab.tsx b/sections/futures/MobileTrade/UserTabs/PositionsTab.tsx index b3582953d7..56d28cef12 100644 --- a/sections/futures/MobileTrade/UserTabs/PositionsTab.tsx +++ b/sections/futures/MobileTrade/UserTabs/PositionsTab.tsx @@ -20,7 +20,6 @@ import PositionType from 'sections/futures/PositionType'; import ShareModal from 'sections/futures/ShareModal'; import EditPositionButton from 'sections/futures/UserInfo/EditPositionButton'; import { setShowPositionModal } from 'state/app/reducer'; -import { setTradePanelDrawerOpen } from 'state/futures/reducer'; import { selectCrossMarginPositions, selectFuturesType, @@ -34,8 +33,6 @@ import { SharePositionParams } from 'state/futures/types'; import { useAppDispatch, useAppSelector } from 'state/hooks'; import media from 'styles/media'; -import TradePanelDrawer from '../drawers/TradePanelDrawer'; - const PositionsTab = () => { const { t } = useTranslation(); const dispatch = useAppDispatch(); @@ -50,7 +47,6 @@ const PositionsTab = () => { const futuresMarkets = useAppSelector(selectMarkets); const markPrices = useAppSelector(selectMarkPrices); const accountType = useAppSelector(selectFuturesType); - const tradeDrawerPanelOpen = useAppSelector(({ futures }) => futures.tradePanelDrawerOpen); const [showShareModal, setShowShareModal] = useState(false); const [sharePosition, setSharePosition] = useState(null); @@ -90,10 +86,6 @@ const PositionsTab = () => { currentMarket, ]); - const handleCloseDrawer = useCallback(() => { - dispatch(setTradePanelDrawerOpen(false)); - }, [dispatch]); - const handleOpenPositionCloseModal = useCallback( (marketKey: FuturesMarketKey) => () => { dispatch( @@ -259,9 +251,6 @@ const PositionsTab = () => { )) )} - {tradeDrawerPanelOpen && ( - - )} {showShareModal && ( )} From 8af6f6fa4c48ba25e990ae9de1d805969d6288fe Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Fri, 16 Jun 2023 00:41:09 -0400 Subject: [PATCH 13/15] Fix switch --- .../Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx index ac3b4d60f1..bb55455ce8 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx @@ -150,7 +150,7 @@ const MetaRow = styled(FlexDivRow)` `; const ControlContainer = styled.div` - width: 88px; + width: 100px; > div { gap: 6px; From 03e3b843f9d00b4e36f512240de396aa4b80c5ad Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Fri, 16 Jun 2023 00:51:46 -0400 Subject: [PATCH 14/15] Fix drawer --- sections/futures/MobileTrade/drawers/BaseDrawer.tsx | 3 +++ sections/futures/PositionButtons/PositionButtons.tsx | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sections/futures/MobileTrade/drawers/BaseDrawer.tsx b/sections/futures/MobileTrade/drawers/BaseDrawer.tsx index daf8f2d16f..4148e6095f 100644 --- a/sections/futures/MobileTrade/drawers/BaseDrawer.tsx +++ b/sections/futures/MobileTrade/drawers/BaseDrawer.tsx @@ -63,6 +63,8 @@ const StyledModal = styled(FullScreenModal)` `; const Background = styled.div` + display: flex; + align-items: flex-end; background-color: rgba(0, 0, 0, 0.5); height: 100%; width: 100%; @@ -72,6 +74,7 @@ const Foreground = styled.div` background: ${(props) => props.theme.colors.selectedTheme.background}; padding: 15px; border-radius: 8px 8px 0 0; + width: 100%; `; const Row = styled.div` diff --git a/sections/futures/PositionButtons/PositionButtons.tsx b/sections/futures/PositionButtons/PositionButtons.tsx index 02effd3354..6ed27ed95d 100644 --- a/sections/futures/PositionButtons/PositionButtons.tsx +++ b/sections/futures/PositionButtons/PositionButtons.tsx @@ -114,14 +114,11 @@ const PositionButton = styled.div` const CloseButton = styled.button` width: 50px; - border-top: ${(props) => props.theme.colors.selectedTheme.border}; - border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; + border: ${(props) => props.theme.colors.selectedTheme.border}; display: flex; justify-content: center; align-items: center; background: ${(props) => props.theme.colors.selectedTheme.newTheme.tabs.position.background}; - border-left: ${(props) => props.theme.colors.selectedTheme.border}; - border-right: none; `; export default PositionButtons; From 0b22a38144b189172b7afb1438f0e52e8ed38c23 Mon Sep 17 00:00:00 2001 From: Oluwakorede Fashokun Date: Fri, 16 Jun 2023 10:53:24 -0400 Subject: [PATCH 15/15] Fix issues with borders and padding --- sections/futures/PositionButtons/PositionButtons.tsx | 3 +++ .../Header/MobileUserMenu/MobileMenuModal.tsx | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/sections/futures/PositionButtons/PositionButtons.tsx b/sections/futures/PositionButtons/PositionButtons.tsx index 6ed27ed95d..80ea6c173f 100644 --- a/sections/futures/PositionButtons/PositionButtons.tsx +++ b/sections/futures/PositionButtons/PositionButtons.tsx @@ -55,6 +55,7 @@ type PositionButtonProps = { const PositionButtonsWrapper = styled(FlexDivRow)<{ $mobile?: boolean }>` width: 100%; margin-bottom: 16px; + height: 50px; ${(props) => props.$mobile && @@ -114,11 +115,13 @@ const PositionButton = styled.div` const CloseButton = styled.button` width: 50px; + height: 100%; border: ${(props) => props.theme.colors.selectedTheme.border}; display: flex; justify-content: center; align-items: center; background: ${(props) => props.theme.colors.selectedTheme.newTheme.tabs.position.background}; + box-sizing: border-box; `; export default PositionButtons; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx index bb55455ce8..9c823a53c2 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileMenuModal.tsx @@ -150,10 +150,16 @@ const MetaRow = styled(FlexDivRow)` `; const ControlContainer = styled.div` - width: 100px; + width: 75px; > div { - gap: 6px; + padding: 3px; + gap: 3px; + } + + button { + max-width: 35px; + padding: 0; } `;