From 07cb796e820258417b0d5ae35ed38dd7f30426db Mon Sep 17 00:00:00 2001 From: Oche Date: Tue, 8 Jul 2025 16:26:22 +0100 Subject: [PATCH 01/48] Enhance SVG handling and UI components - Added support for SVG imports using @svgr/webpack in the webpack configuration. - Updated package.json to include @svgr/webpack dependency. - Refactored various components to use SVG icons directly instead of image imports. - Introduced new gradient styles in globals.css for better UI consistency. - Improved layout and styling in strategy-related components for a more cohesive design. - Fixed minor issues in transaction history and deposit components for better user experience. --- next.config.mjs | 5 + package.json | 1 + public/fulllogo.svg | 2 +- src/app/globals.css | 51 + .../[strategyId]/_components/DetailsTab.tsx | 141 +- .../[strategyId]/_components/FAQTab.tsx | 220 +-- .../[strategyId]/_components/ManageTab.tsx | 76 +- .../[strategyId]/_components/RiskTab.tsx | 218 +-- .../[strategyId]/_components/Strategy.tsx | 527 ++++--- .../[strategyId]/_components/StrategyInfo.tsx | 8 +- .../[strategyId]/_components/TokenDeposit.tsx | 11 +- .../_components/TransactionsTab.tsx | 123 +- src/app/template.tsx | 10 + src/assets/details.svg | 7 + src/assets/faq.svg | 6 + src/assets/manage.svg | 8 + src/assets/risk.svg | 5 + src/assets/tg.svg | 2 +- src/assets/transactions.svg | 6 + src/components/APYInfo.tsx | 2 +- src/components/AmountInput.tsx | 4 +- src/components/Deposit.tsx | 4 +- src/components/Footer.tsx | 19 +- src/components/HarvestTime.tsx | 19 +- src/components/Navbar.tsx | 34 +- src/components/YieldCard.tsx | 8 +- src/utils/MyNumber.ts | 2 +- yarn.lock | 1380 ++++++++++++++++- 28 files changed, 2231 insertions(+), 668 deletions(-) create mode 100644 src/assets/details.svg create mode 100644 src/assets/faq.svg create mode 100644 src/assets/manage.svg create mode 100644 src/assets/risk.svg create mode 100644 src/assets/transactions.svg diff --git a/next.config.mjs b/next.config.mjs index eb27bfc3..a925e19b 100755 --- a/next.config.mjs +++ b/next.config.mjs @@ -88,6 +88,11 @@ const nextConfig = { }, webpack(config, options) { if (options.isServer) config.devtool = 'source-map'; + config.module.rules.push({ + test: /\.svg$/, + issuer: /\.[jt]sx?$/, + use: ['@svgr/webpack'], + }); return config; }, async headers() { diff --git a/package.json b/package.json index b1bc4ece..6841ae91 100755 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@starknet-react/chains": "3.0.0", "@starknet-react/core": "3.0.1", "@strkfarm/sdk": "^1.0.51", + "@svgr/webpack": "^8.1.0", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/public/fulllogo.svg b/public/fulllogo.svg index 3507ad8b..e8e7e286 100644 --- a/public/fulllogo.svg +++ b/public/fulllogo.svg @@ -1,4 +1,4 @@ - + diff --git a/src/app/globals.css b/src/app/globals.css index 8a563360..e95f26a1 100755 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -160,6 +160,57 @@ body { ); } +.strategy-page-gradient { + background: linear-gradient( + 0deg, + rgba(33, 33, 33, 0.35), + rgba(33, 33, 33, 0.35) + ), + linear-gradient( + 288.17deg, + rgba(144, 105, 240, 0.2) -123.96%, + rgba(33, 33, 33, 0.2) 101.38% + ); +} + +.apy-gradient { + background: linear-gradient( + 0deg, + rgba(33, 33, 33, 0.35), + rgba(33, 33, 33, 0.35) + ), + linear-gradient( + 326.73deg, + rgba(144, 105, 240, 0.5) -541.23%, + rgba(33, 33, 33, 0.4) 92.85% + ); +} + +.holdings-gradient { + background: linear-gradient( + 0deg, + rgba(33, 33, 33, 0.35), + rgba(33, 33, 33, 0.35) + ), + linear-gradient( + 326.73deg, + rgba(144, 105, 240, 0.5) -541.23%, + rgba(33, 33, 33, 0.4) 92.85% + ); +} + +.faded-purple-gradient { + background: linear-gradient( + 0deg, + rgba(33, 33, 33, 0.35), + rgba(33, 33, 33, 0.35) + ), + linear-gradient( + 326.73deg, + rgba(144, 105, 240, 0.5) -541.23%, + rgba(33, 33, 33, 0.4) 92.85% + ); +} .connect-button-gradient { background: linear-gradient(93.94deg, #9069f0 3.22%, #4a14cd 101.67%); } diff --git a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx index 585ed04c..c06ca8da 100644 --- a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx +++ b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx @@ -1,9 +1,9 @@ -import { Box, Center, Spinner, Flex, Text, Image } from '@chakra-ui/react'; +import { Box, Center, Spinner, Flex, Text } from '@chakra-ui/react'; import { TrovesStrategyAPIResult } from '@/store/troves.atoms'; import FlowChart from './FlowChart'; -import depositAction from '@/assets/depositAction.svg'; -import withdrawAction from '@/assets/withdrawAction.svg'; -import loopAction from '@/assets/loopAction.svg'; +import DepositActionIcon from '@/assets/depositAction.svg'; +import WithdrawActionIcon from '@/assets/withdrawAction.svg'; +import LoopActionIcon from '@/assets/loopAction.svg'; import { useMemo } from 'react'; import { StrategyInfo } from '@/store/strategies.atoms'; @@ -30,71 +30,78 @@ export function DetailsTab(props: DetailsTabProps) { }, [strategyAPIResult.actions, strategy.metadata.investmentSteps]); return ( - - - {steps.length > 0 && ( - - <> - - Steps performed by the strategy - - {steps.map((action, index) => ( - - {action.toLowerCase().includes('stake') || - action.toLowerCase().includes('supply') ? ( - - ) : action.toLowerCase().includes('borrow') ? ( - - ) : ( - - )} - - {action} - - - ))} - {steps.length == 0 && ( -
- -
- )} - - - )} + + + + {steps.length > 0 && ( + + <> + + Steps performed by the strategy + + {steps.map((action, index) => ( + + {action.toLowerCase().includes('stake') || + action.toLowerCase().includes('supply') ? ( + + ) : action.toLowerCase().includes('borrow') ? ( + + ) : ( + + )} + + {action} + + + ))} + {steps.length == 0 && ( +
+ +
+ )} + +
+ )} - {strategyAPIResult.investmentFlows.length > 0 && ( - - 0 && ( + - Configuration - - - - )} + + Configuration + + +
+ )} + - + ); } diff --git a/src/app/strategy/[strategyId]/_components/FAQTab.tsx b/src/app/strategy/[strategyId]/_components/FAQTab.tsx index f252ef89..2df51ff1 100644 --- a/src/app/strategy/[strategyId]/_components/FAQTab.tsx +++ b/src/app/strategy/[strategyId]/_components/FAQTab.tsx @@ -22,118 +22,130 @@ export function FAQTab(props: FAQTabProps) { const { strategy } = props; return ( - - + - Get your questions answered - - - - {!strategy.metadata.faqs || - (strategy.metadata.faqs.length == 0 && ( - - No FAQs at the moment - - ))} - - {strategy.metadata.faqs && - strategy.metadata.faqs.length > 0 && - strategy.metadata.faqs.map((faq, index) => ( - - - - - {faq.question} - - - - - - {faq.answer} - - + + Get your questions answered + + + + {!strategy.metadata.faqs || + (strategy.metadata.faqs.length == 0 && ( + + No FAQs at the moment + ))} - - + + {strategy.metadata.faqs && + strategy.metadata.faqs.length > 0 && + strategy.metadata.faqs.map((faq, index) => ( + + + + + {faq.question} + + + + + + {faq.answer} + + + ))} + + - - - - For more queries reach out to us on Telegram - - - Our team will respond to you soon! - - + + + For more queries reach out to us on Telegram + + + Our team will respond to you soon! + + - - - + + + + + - + ); } diff --git a/src/app/strategy/[strategyId]/_components/ManageTab.tsx b/src/app/strategy/[strategyId]/_components/ManageTab.tsx index ff40fb83..f52a8a5c 100644 --- a/src/app/strategy/[strategyId]/_components/ManageTab.tsx +++ b/src/app/strategy/[strategyId]/_components/ManageTab.tsx @@ -14,23 +14,26 @@ export function ManageTab(props: ManageTabProps) { const { strategy, isMobile } = props; return ( - + - - How does it work? - - {/* + + How does it work? + + {/* Withdraw anytime by redeeming your NFT for USDC. */} - - {strategy.description} - + + {strategy.description} + - - {/* + + {/* Risks @@ -74,23 +77,24 @@ export function ManageTab(props: ManageTabProps) { ))} */} - + - - {!strategy || - (strategy.isSingleTokenDepositView && ( - - ))} - {strategy && !strategy.isSingleTokenDepositView && ( - - )} + + {!strategy || + (strategy.isSingleTokenDepositView && ( + + ))} + {strategy && !strategy.isSingleTokenDepositView && ( + + )} + - + ); } diff --git a/src/app/strategy/[strategyId]/_components/RiskTab.tsx b/src/app/strategy/[strategyId]/_components/RiskTab.tsx index 59e391c2..109474db 100644 --- a/src/app/strategy/[strategyId]/_components/RiskTab.tsx +++ b/src/app/strategy/[strategyId]/_components/RiskTab.tsx @@ -58,116 +58,124 @@ export function RiskTab(props: RiskTabProps) { }, [strategy.metadata.risk.riskFactor, strategy.metadata.risk.notARisks]); return ( - - {risks.length > 0 && ( + + + {risks.length > 0 && ( + + + Risk Assessment + + + {risks.map((risk, index) => ( + + + {risk.type}: {getRiskString(risk.value)} + + + ))} + + + )} - Risk Assessment + Risk details - - {risks.map((risk, index) => ( - - - {risk.type}: {getRiskString(risk.value)} - - - ))} - - - )} - - - Risk details - - - - {strategy.risks.map((r, index) => ( - - {r} - {index === 0 && ( - - {getRiskString(strategy.riskFactor)} - {' risk'} - - )} - - ))} - - - - + + {strategy.risks.map((r, index) => ( + + {r} + {index === 0 && ( + + {getRiskString(strategy.riskFactor)} + {' risk'} + + )} + + ))} + + + + + ); } diff --git a/src/app/strategy/[strategyId]/_components/Strategy.tsx b/src/app/strategy/[strategyId]/_components/Strategy.tsx index bd13ffc8..4cc376bd 100755 --- a/src/app/strategy/[strategyId]/_components/Strategy.tsx +++ b/src/app/strategy/[strategyId]/_components/Strategy.tsx @@ -51,6 +51,12 @@ import { RiskTab } from './RiskTab'; import { StrategyInfoComponent } from './StrategyInfo'; import { TransactionsTab } from './TransactionsTab'; +import ManageIcon from '@/assets/manage.svg'; +import RiskIcon from '@/assets/risk.svg'; +import DetailsIcon from '@/assets/details.svg'; +import FaqIcon from '@/assets/faq.svg'; +import TransactionsIcon from '@/assets/transactions.svg'; + function HoldingsText({ strategy, address, @@ -122,7 +128,12 @@ function HoldingsAndEarnings({ }) { return ( - + Your Holdings @@ -139,7 +150,12 @@ function HoldingsAndEarnings({ label={!strategy?.isRetired() && 'Life time earnings'} {...MYSTYLES.TOOLTIP.STANDARD} > - + { display={{ base: 'block' }} justifyContent={'center'} width={'100%'} - margin={'0 auto'} - padding={'10px'} - maxWidth={'1152px'} + padding={0} > - - - - - - - + - {strategy && ( - - - {!strategy?.isRetired() && strategyCached && ( - - - - )} - - )} - - {strategy && ( - - - - - )} - - - {!isMobile && ( - - - { - mixpanel.track('Manage clicked'); + + + + + + {strategy && ( + + + {!strategy?.isRetired() && strategyCached && ( + + + + )} + + )} + + {strategy && ( + + + + + )} + + + {!isMobile && ( + + - FAQs - - { - mixpanel.track('Transactions clicked'); + { + mixpanel.track('Manage clicked'); + }} + > + + Manage + + { + mixpanel.track('Details clicked'); + }} + > + + Details + + { + mixpanel.track('Risk clicked'); + }} + > + + Risks + + { + mixpanel.track('FAQs clicked'); + }} + > + + FAQs + + { + mixpanel.track('Transactions clicked'); + }} + > + + Transactions + + + + + + {strategy && } + + + {strategyCached && strategy && ( + + )} + + + {strategy && } + + + + {strategy && } + + + + {strategy && ( + + )} + + + + )} + + {/* MOBILE VIEW */} + {isMobile && ( + + { + if (Array.isArray(expandedIndex)) { + setAccordionIndex(expandedIndex[0] ?? 0); + } else { + setAccordionIndex(expandedIndex); + } }} + allowToggle + width="100%" + display="flex" + flexDirection="column" + gap="10px" + borderRadius={'lg'} > - Transactions - - - - - - {strategy && } - - - {strategyCached && strategy && ( - - )} - - - {strategy && } - - - - {strategy && } - - - - {strategy && ( - - )} - - - - )} - - {/* MOBILE VIEW */} - {isMobile && ( - - { - if (Array.isArray(expandedIndex)) { - setAccordionIndex(expandedIndex[0] ?? 0); - } else { - setAccordionIndex(expandedIndex); - } - }} - allowToggle - width="100%" - display="flex" - flexDirection="column" - gap="10px" - borderRadius={'lg'} - > - {strategy && - [ - { - label: 'Manage', - content: , - }, - { - label: 'Details', - content: strategyCached && ( - - ), - }, - { - label: 'Risks', - content: , - }, - { - label: 'FAQs', - content: , - }, - { - label: 'Transactions', - content: ( - - ), - }, - ].map((item, index) => ( - - , + }, + { + label: 'Details', + content: strategyCached && ( + + ), + }, + { + label: 'Risks', + content: , + }, + { + label: 'FAQs', + content: , + }, + { + label: 'Transactions', + content: ( + + ), + }, + ].map((item, index) => ( + - - {item.label} - - - - - {item.content} - - - ))} - - - )} + + {item.label} + + + + + {item.content} + + + ))} + + + )} + ); diff --git a/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx index bdf5f3de..d2ff3e63 100644 --- a/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx +++ b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx @@ -3,12 +3,11 @@ import { AvatarGroup, Box, Flex, - Image, Link, Text, Tooltip, } from '@chakra-ui/react'; -import shield from '@/assets/shield.svg'; +import ShieldIcon from '@/assets/shield.svg'; import { StrategyInfo } from '@/store/strategies.atoms'; export function StrategyInfoComponent(props: { strategy: StrategyInfo }) { @@ -56,11 +55,12 @@ export function StrategyInfoComponent(props: { strategy: StrategyInfo }) { borderRadius={'20px'} > - + {/* badge + /> */} diff --git a/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx b/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx index 4f7af8e6..40bba48d 100644 --- a/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx +++ b/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx @@ -22,6 +22,7 @@ export function TokenDeposit(props: TokenDepositProps) { const { strategy } = props; return ( { // mixpanel.track('All pools clicked') @@ -46,11 +47,11 @@ export function TokenDeposit(props: TokenDepositProps) { { // mixpanel.track('Strategies opened') @@ -64,6 +65,7 @@ export function TokenDeposit(props: TokenDepositProps) { width={'100%'} padding={'20px 16px'} borderBottomLeftRadius={'8px'} + borderBottomRightRadius={'8px'} > {tabIndex == 0 && ( <> @@ -99,6 +101,7 @@ export function TokenDeposit(props: TokenDepositProps) { {tabIndex == 1 && ( diff --git a/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx index e73ff21f..afd0c5d9 100644 --- a/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx +++ b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx @@ -52,12 +52,12 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { sx={{ overflow: 'hidden', 'border-collapse': 'separate', - 'border-spacing': '0px 3px', + 'border-spacing': '0px 5px', }} > # @@ -100,6 +101,7 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { fontWeight={'600'} textTransform={'capitalize'} borderTopRightRadius={'lg'} + borderBottomRightRadius={'lg'} > Time @@ -111,8 +113,17 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { const decimals = token?.decimals; return ( - - + + {index + 1}. @@ -171,7 +182,12 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { - + {timeAgo(new Date(tx.timestamp * 1000))} @@ -266,59 +282,68 @@ export function TransactionsTab(props: TransactionsTabProps) { const { strategy, txHistory, isMobile } = props; return ( - - - - Transaction history - - {!strategy.settings.isTransactionHistDisabled && ( - - There may be delays in fetching data. If your transaction isn't - found, try again later. + + + + + Transaction history - )} - - {address ? ( - strategy.settings.isTransactionHistDisabled ? ( + {!strategy.settings.isTransactionHistDisabled && ( + + There may be delays in fetching data. If your transaction + isn't found, try again later. + + )} + + {address ? ( + strategy.settings.isTransactionHistDisabled ? ( + + Transaction history is not available for this strategy yet. If + enabled in future, will include the entire history. + + ) : txHistory.findManyInvestment_flows.length !== 0 ? ( + isMobile ? ( + + ) : ( + + ) + ) : ( + + No transactions found + + ) + ) : ( - Transaction history is not available for this strategy yet. If - enabled in future, will include the entire history. + Connect your wallet to view transaction history - ) : txHistory.findManyInvestment_flows.length !== 0 ? ( - isMobile ? ( - - ) : ( - - ) - ) : ( - - No transactions found - - ) - ) : ( - - Connect your wallet to view transaction history - - )} - + )} + + ); } diff --git a/src/app/template.tsx b/src/app/template.tsx index d604e6e9..5957d76d 100755 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -35,6 +35,7 @@ const theme = extendTheme({ highlight: '#303136', purple: '#9069F0', + purple_30p: '#CFACFA4D', purple_60p: '#6F5CA599', purple_hover: '#4C2CD7', purple_hover_2: '#C5A6FF', @@ -44,22 +45,30 @@ const theme = extendTheme({ header: '#1d1531', + table_header_bg: '#9069F033', + badge_blue: '#002F6A', badge_green: '#016131', mybg: 'black', // dark blue bg_2: '#111113', bg_3: '#090910', + bg_4: '#010101', mycard: '#19191b', mycard_light: '#212121', mycard_light_2x: '#303136', mycard_dark: '#121212', + input_light: '#37373780', + list_item_bg: '#37373766', + grey_text: '#B6B6B6', + grey_text_2: '#909090', text_primary: 'white', text_secondary: '#b2b3bd', text_secondary_2: '#D3D3D3', + text_black_70p: '#010101B2', yellow: '#EFDB72', yellow_2: '#FFA500', @@ -73,6 +82,7 @@ const theme = extendTheme({ light_green_30p: '#3EE5C24D', border_light: '#CFCFEA', + border_light_2: '#2D2D3D', border_light_3p: '#CFCFEA0D', border_light_30p: '#CFCFEA4D', diff --git a/src/assets/details.svg b/src/assets/details.svg new file mode 100644 index 00000000..a0c5566a --- /dev/null +++ b/src/assets/details.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/faq.svg b/src/assets/faq.svg new file mode 100644 index 00000000..200b5804 --- /dev/null +++ b/src/assets/faq.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/manage.svg b/src/assets/manage.svg new file mode 100644 index 00000000..bf2c850f --- /dev/null +++ b/src/assets/manage.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/risk.svg b/src/assets/risk.svg new file mode 100644 index 00000000..5a39f5ef --- /dev/null +++ b/src/assets/risk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/tg.svg b/src/assets/tg.svg index 01c6b5ff..4cb99463 100644 --- a/src/assets/tg.svg +++ b/src/assets/tg.svg @@ -1,4 +1,4 @@ - + diff --git a/src/assets/transactions.svg b/src/assets/transactions.svg new file mode 100644 index 00000000..d1225753 --- /dev/null +++ b/src/assets/transactions.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/APYInfo.tsx b/src/components/APYInfo.tsx index 67fcaf99..4d7abc02 100644 --- a/src/components/APYInfo.tsx +++ b/src/components/APYInfo.tsx @@ -75,10 +75,10 @@ export function APYInfo(props: { { const newAmount = diff --git a/src/components/Deposit.tsx b/src/components/Deposit.tsx index c48d1557..3bbec698 100755 --- a/src/components/Deposit.tsx +++ b/src/components/Deposit.tsx @@ -417,10 +417,8 @@ function InternalDeposit(props: DepositProps) { , label: 'Telegram', href: CONSTANTS.COMMUNITY_TG, gradient: 'mycard_light', }, { - icon: x.src, + icon: , label: 'Twitter', href: 'https://troves.fi/twitter', gradient: 'mycard_light', @@ -99,11 +98,7 @@ const Footer: React.FC = () => { align={{ base: 'center', md: 'flex-start' }} minW="220px" > - + { key={s.label} href={s.href} aria-label={s.label} - icon={} + icon={s.icon} target="_blank" rel="noopener noreferrer" borderRadius="full" diff --git a/src/components/HarvestTime.tsx b/src/components/HarvestTime.tsx index 6da1ee86..db8b3699 100644 --- a/src/components/HarvestTime.tsx +++ b/src/components/HarvestTime.tsx @@ -64,8 +64,8 @@ const HarvestTime: React.FC = ({ strategy, balData }) => { {!strategy.settings.hideHarvestInfo && ( @@ -176,15 +176,17 @@ const HarvestTime: React.FC = ({ strategy, balData }) => { fontSize={'12px'} fontWeight={'400'} lineHeight={'100%'} - bg={'mycard'} width={'100%'} borderRadius={'lg'} > Total rewards harvested:{' '} - {getDisplayCurrencyAmount( - harvestTime?.data?.totalStrkHarvestedByContract.STRKAmount || 0, - 2, - )}{' '} + + {getDisplayCurrencyAmount( + harvestTime?.data?.totalStrkHarvestedByContract.STRKAmount || + 0, + 2, + )}{' '} + STRK @@ -193,12 +195,13 @@ const HarvestTime: React.FC = ({ strategy, balData }) => { fontSize={'12px'} fontWeight={'400'} lineHeight={'100%'} - bg={'mycard'} width={'100%'} borderRadius={'lg'} > Total number of times harvested:{' '} - {harvestTime?.data?.totalHarvestsByContract || '-'} + + {harvestTime?.data?.totalHarvestsByContract || '-'} + )} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index fe507ffe..e2797a02 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,6 +1,5 @@ import { ChevronDownIcon, EmailIcon } from '@chakra-ui/icons'; import { - Avatar, Box, Button, Center, @@ -24,7 +23,7 @@ import { } from 'starknetkit'; import argentMobile from '@/assets/argentMobile.svg'; -import tg from '@/assets/tg.svg'; +import TgIcon from '@/assets/tg.svg'; import CONSTANTS from '@/constants'; import { useIsMobile } from '@/hooks/use-mobile'; import { getERC20Balance } from '@/store/balance.atoms'; @@ -39,7 +38,7 @@ import { standariseAddress, truncate, } from '@/utils'; -import fulllogo from '@public/fulllogo.svg'; +import FullLogoIcon from '@public/fulllogo.svg'; import { InjectedConnector, useAccount, @@ -299,11 +298,7 @@ export default function Navbar(props: NavbarProps) { > - + {/* Troves */} @@ -407,18 +402,7 @@ export default function Navbar(props: NavbarProps) { variant={'ghost'} borderColor={'color2'} display={{ base: 'block', md: 'none' }} - icon={ - - } + icon={} /> - } + leftIcon={} _hover={{ bg: 'purple_hover_2', color: 'black', diff --git a/src/components/YieldCard.tsx b/src/components/YieldCard.tsx index 478a9ae8..ef6be84f 100644 --- a/src/components/YieldCard.tsx +++ b/src/components/YieldCard.tsx @@ -1,4 +1,4 @@ -import shield from '@/assets/shield.svg'; +import ShieldIcon from '@/assets/shield.svg'; import { addressAtom } from '@/store/claims.atoms'; import { isPoolRetired, PoolInfo } from '@/store/pools'; import { getPoolInfoFromStrategy, sortAtom } from '@/store/protocols'; @@ -106,11 +106,7 @@ export function StrategyInfo(props: YieldCardProps) { bg={'badge_green'} padding={'3px 5px'} > - + diff --git a/src/utils/MyNumber.ts b/src/utils/MyNumber.ts index f31199aa..b5dfbbad 100755 --- a/src/utils/MyNumber.ts +++ b/src/utils/MyNumber.ts @@ -36,7 +36,7 @@ export default class MyNumber { } toEtherStr() { - return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals); + return ethers.formatUnits(this?.bigNumber.toFixed(), this.decimals); } toFixedStr(decimals: number) { diff --git a/yarn.lock b/yarn.lock index d79c400d..d4acdf58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,6 +20,14 @@ framer-motion "^6.3.11" lodash.union "^4.6.0" +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@apollo/client@^3.11.8": version "3.11.8" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.11.8.tgz#f6bacdc7e1b243807c1387113e1d445a53471a9c" @@ -53,6 +61,41 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + +"@babel/core@^7.21.3": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.25.6": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" @@ -63,6 +106,81 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== + dependencies: + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" + integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" + integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + debug "^4.4.1" + lodash.debounce "^4.0.8" + resolve "^1.22.10" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helper-module-imports@^7.16.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" @@ -71,16 +189,103 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-remap-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" + integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-wrap-function" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helper-string-parser@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helper-wrap-function@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz#b88285009c31427af318d4fe37651cd62a142409" + integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helpers@^7.27.6": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" + "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" @@ -98,6 +303,649 @@ dependencies: "@babel/types" "^7.25.6" +"@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" + integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" + integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" + integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" + integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz#bb1c25af34d75115ce229a1de7fa44bf8f955670" + integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-import-assertions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" + integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-attributes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" + integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-async-generator-functions@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" + integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/traverse" "^7.28.0" + +"@babel/plugin-transform-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" + integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + +"@babel/plugin-transform-block-scoped-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" + integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-block-scoping@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz#e7c50cbacc18034f210b93defa89638666099451" + integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" + integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-static-block@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz#7e920d5625b25bbccd3061aefbcc05805ed56ce4" + integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-classes@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz#12fa46cffc32a6e084011b650539e880add8a0f8" + integrity sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-globals" "^7.28.0" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.28.0" + +"@babel/plugin-transform-computed-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" + integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/template" "^7.27.1" + +"@babel/plugin-transform-destructuring@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" + integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.0" + +"@babel/plugin-transform-dotall-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" + integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-keys@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" + integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" + integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-dynamic-import@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" + integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-explicit-resource-management@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" + integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + +"@babel/plugin-transform-exponentiation-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz#fc497b12d8277e559747f5a3ed868dd8064f83e1" + integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-export-namespace-from@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" + integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-for-of@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" + integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-function-name@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" + integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== + dependencies: + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-json-strings@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" + integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" + integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-logical-assignment-operators@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz#890cb20e0270e0e5bebe3f025b434841c32d5baa" + integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-member-expression-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" + integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-amd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" + integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-systemjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz#00e05b61863070d0f3292a00126c16c0e024c4ed" + integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-modules-umd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" + integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" + integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-new-target@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" + integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" + integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-numeric-separator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" + integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-object-rest-spread@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz#d23021857ffd7cd809f54d624299b8086402ed8d" + integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/traverse" "^7.28.0" + +"@babel/plugin-transform-object-super@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" + integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + +"@babel/plugin-transform-optional-catch-binding@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" + integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" + integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-parameters@^7.27.7": + version "7.27.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" + integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-methods@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" + integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-property-in-object@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" + integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-property-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" + integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" + integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-display-name@^7.27.1": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" + integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.27.1" + +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regenerator@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz#f19ca3558f7121924fc4ba6cd2afe3a5cdac89b1" + integrity sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regexp-modifiers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" + integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-reserved-words@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" + integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-shorthand-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" + integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-spread@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" + integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-sticky-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" + integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-template-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" + integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typeof-symbol@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" + integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typescript@^7.27.1": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz#796cbd249ab56c18168b49e3e1d341b72af04a6b" + integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + +"@babel/plugin-transform-unicode-escapes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" + integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-property-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" + integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" + integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-sets-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" + integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/preset-env@^7.20.2": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.0.tgz#d23a6bc17b43227d11db77081a0779c706b5569c" + integrity sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg== + dependencies: + "@babel/compat-data" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.27.1" + "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-async-generator-functions" "^7.28.0" + "@babel/plugin-transform-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions" "^7.27.1" + "@babel/plugin-transform-block-scoping" "^7.28.0" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-class-static-block" "^7.27.1" + "@babel/plugin-transform-classes" "^7.28.0" + "@babel/plugin-transform-computed-properties" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-dotall-regex" "^7.27.1" + "@babel/plugin-transform-duplicate-keys" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-dynamic-import" "^7.27.1" + "@babel/plugin-transform-explicit-resource-management" "^7.28.0" + "@babel/plugin-transform-exponentiation-operator" "^7.27.1" + "@babel/plugin-transform-export-namespace-from" "^7.27.1" + "@babel/plugin-transform-for-of" "^7.27.1" + "@babel/plugin-transform-function-name" "^7.27.1" + "@babel/plugin-transform-json-strings" "^7.27.1" + "@babel/plugin-transform-literals" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" + "@babel/plugin-transform-member-expression-literals" "^7.27.1" + "@babel/plugin-transform-modules-amd" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.27.1" + "@babel/plugin-transform-modules-umd" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-new-target" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-numeric-separator" "^7.27.1" + "@babel/plugin-transform-object-rest-spread" "^7.28.0" + "@babel/plugin-transform-object-super" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/plugin-transform-private-methods" "^7.27.1" + "@babel/plugin-transform-private-property-in-object" "^7.27.1" + "@babel/plugin-transform-property-literals" "^7.27.1" + "@babel/plugin-transform-regenerator" "^7.28.0" + "@babel/plugin-transform-regexp-modifiers" "^7.27.1" + "@babel/plugin-transform-reserved-words" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-spread" "^7.27.1" + "@babel/plugin-transform-sticky-regex" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-typeof-symbol" "^7.27.1" + "@babel/plugin-transform-unicode-escapes" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + core-js-compat "^3.43.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.27.1.tgz#86ea0a5ca3984663f744be2fd26cb6747c3fd0ec" + integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + +"@babel/preset-typescript@^7.21.0": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" + integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" @@ -114,6 +962,15 @@ "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + "@babel/traverse@^7.24.7": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" @@ -127,6 +984,27 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + +"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.28.0", "@babel/types@^7.4.4": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.0.tgz#2fd0159a6dc7353933920c43136335a9b264d950" + integrity sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.6": version "7.25.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" @@ -1517,6 +2395,14 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -1541,6 +2427,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1549,6 +2440,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@module-federation/runtime@^0.1.2": version "0.1.21" resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.1.21.tgz#1d233b29dd136488f2ba682017b53f13e015788a" @@ -2175,6 +3074,112 @@ stacktrace-js "^2.0.2" winston "^3.13.0" +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + "@swc/helpers@0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" @@ -2209,6 +3214,11 @@ resolved "https://registry.yarnpkg.com/@trpc/server/-/server-10.45.2.tgz#5f2778c4810f93b5dc407146334f8da70a0b51fb" integrity sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@types/d3-color@*": version "3.1.3" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" @@ -3176,6 +4186,30 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" +babel-plugin-polyfill-corejs2@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz#8101b82b769c568835611542488d463395c2ef8f" + integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== + dependencies: + "@babel/compat-data" "^7.27.7" + "@babel/helper-define-polyfill-provider" "^0.6.5" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" + +babel-plugin-polyfill-regenerator@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz#32752e38ab6f6767b92650347bf26a31b16ae8c5" + integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3216,6 +4250,11 @@ bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -3263,6 +4302,16 @@ browserslist@^4.14.5: node-releases "^2.0.18" update-browserslist-db "^1.1.0" +browserslist@^4.24.0, browserslist@^4.25.1: + version "4.25.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -3317,11 +4366,21 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001137, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001663: version "1.0.30001664" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== +caniuse-lite@^1.0.30001726: + version "1.0.30001727" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -3518,6 +4577,11 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -3667,6 +4731,11 @@ convert-source-map@^1.5.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-es@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.2.2.tgz#18ceef9eb513cac1cb6c14bcbf8bdb2679b34821" @@ -3679,6 +4748,13 @@ copy-to-clipboard@3.3.3: dependencies: toggle-selection "^1.0.6" +core-js-compat@^3.43.0: + version "3.44.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" + integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== + dependencies: + browserslist "^4.25.1" + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3700,6 +4776,16 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -3726,11 +4812,50 @@ css-box-model@1.2.1: dependencies: tiny-invariant "^1.0.6" +css-select@^5.1.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" + integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + csstype@^3.0.2, csstype@^3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -3890,6 +5015,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -3924,6 +5056,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -4016,6 +5153,44 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -4055,6 +5230,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-to-chromium@^1.5.173: + version "1.5.180" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.180.tgz#3e4f6e7494d6371e014af176dfdfd43c8a4b56df" + integrity sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA== + electron-to-chromium@^1.5.28: version "1.5.30" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz#5b264b489cfe0c3dd71097c164d795444834e7c7" @@ -4133,6 +5313,11 @@ enhanced-resolve@^5.15.0: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1, error-ex@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4958,6 +6143,11 @@ generic-pool@3.9.0: resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -5383,6 +6573,14 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5543,6 +6741,13 @@ is-core-module@^2.13.0, is-core-module@^2.15.1: dependencies: hasown "^2.0.2" +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-data-view@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" @@ -5918,6 +7123,16 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -5960,6 +7175,11 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -6150,16 +7370,40 @@ lossless-json@^4.0.1: resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.2.tgz#f00c52815805d1421930a87e2670e27350958a3f" integrity sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA== +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + memoize-one@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" @@ -6372,6 +7616,14 @@ next@14.1.0: "@next/swc-win32-ia32-msvc" "14.1.0" "@next/swc-win32-x64-msvc" "14.1.0" +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-addon-api@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" @@ -6399,6 +7651,11 @@ node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + node-telegram-bot-api@^0.66.0: version "0.66.0" resolved "https://registry.yarnpkg.com/node-telegram-bot-api/-/node-telegram-bot-api-0.66.0.tgz#9ad27e357b30fd3a89a37365ed95a82a70ac9f94" @@ -6440,6 +7697,13 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -6671,7 +7935,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -6750,6 +8014,11 @@ picocolors@^1.0.0, picocolors@^1.1.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -7238,6 +8507,18 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: get-proto "^1.0.1" which-builtin-type "^1.2.1" +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -7265,6 +8546,30 @@ regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + rehackt@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" @@ -7306,6 +8611,15 @@ resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.10: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" @@ -7584,6 +8898,14 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + sonic-boom@^2.2.1: version "2.8.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" @@ -7591,7 +8913,7 @@ sonic-boom@^2.2.1: dependencies: atomic-sleep "^1.0.0" -source-map-js@^1.0.2, source-map-js@^1.2.1: +source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -8000,6 +9322,24 @@ svelte-forms@^2.3.1: dependencies: is-promise "^4.0.0" +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^3.0.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + swr@2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" @@ -8427,6 +9767,29 @@ unenv@^1.9.0: node-fetch-native "^1.6.4" pathe "^1.1.2" +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -8470,6 +9833,14 @@ update-browserslist-db@^1.1.0: escalade "^3.2.0" picocolors "^1.1.0" +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + uqr@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" @@ -8796,6 +10167,11 @@ yallist@4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" From 56935710760881c9e4e0fc528dad7371cb4d4665 Mon Sep 17 00:00:00 2001 From: Oche Date: Wed, 9 Jul 2025 12:04:39 +0100 Subject: [PATCH 02/48] Add APY History component and integrate into Strategy view - Introduced a new APYHistory component to display historical APY data using a responsive area chart. - Updated the Strategy component to include a new tab for APY History, allowing users to view APY trends. - Enhanced the TVL component with improved styling and layout consistency. - Added recharts library to package.json for chart rendering capabilities. --- package.json | 1 + .../[strategyId]/_components/APYHistory.tsx | 182 +++++++++++++++ .../[strategyId]/_components/Strategy.tsx | 35 ++- src/components/TVL.tsx | 28 ++- src/components/YieldCard.tsx | 5 +- yarn.lock | 215 +++++++++++++++++- 6 files changed, 446 insertions(+), 20 deletions(-) create mode 100644 src/app/strategy/[strategyId]/_components/APYHistory.tsx diff --git a/package.json b/package.json index 6841ae91..d855b724 100755 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "react-responsive-carousel": "3.2.23", "react-select": "5.8.0", "react-share": "5.1.0", + "recharts": "^3.1.0", "sharp": "0.33.4", "starknet": "6.11.0", "starknetkit": "2.4.0", diff --git a/src/app/strategy/[strategyId]/_components/APYHistory.tsx b/src/app/strategy/[strategyId]/_components/APYHistory.tsx new file mode 100644 index 00000000..14975569 --- /dev/null +++ b/src/app/strategy/[strategyId]/_components/APYHistory.tsx @@ -0,0 +1,182 @@ +import { Box, Flex, Text } from '@chakra-ui/react'; +import { + AreaChart, + Area, + XAxis, + YAxis, + CartesianGrid, + ResponsiveContainer, +} from 'recharts'; + +import { StrategyInfo } from '@/store/strategies.atoms'; + +interface ITransaction { + amount: string; + timestamp: number; + type: string; + txHash: string; + asset: string; + __typename: 'Investment_flows'; +} +interface TransactionsTabProps { + strategy: StrategyInfo; + // txHistoryResult: AtomWithQueryResult; + txHistory: { + findManyInvestment_flows: ITransaction[]; + }; + isMobile?: boolean; +} + +// Dummy APY history data for months and APY percentage +interface APYHistoryPoint { + month: string; + apy: number; +} + +const dummyAPYHistory: APYHistoryPoint[] = [ + { month: '2023-10', apy: 4.2 }, + { month: '2023-11', apy: 4.5 }, + { month: '2023-12', apy: 4.7 }, + { month: '2024-01', apy: 5.0 }, + { month: '2024-02', apy: 5.1 }, + { month: '2024-03', apy: 5.3 }, + { month: '2024-04', apy: 5.0 }, + { month: '2024-05', apy: 5.2 }, +]; + +function getMinMax(arr: T[], key: keyof T & string): [number, number] { + const values = arr.map((item) => item[key] as unknown as number); + const min = Math.min(...values); + const max = Math.max(...values); + if (min === max) { + return [min - 1, max + 1]; + } + return [min, max]; +} + +function generateTicks([min, max]: [number, number]): number[] { + const step = Math.max(0.1, (max - min) / 4); + return [min, min + step, min + 2 * step, min + 3 * step, max]; +} + +function formatYAxis(value: number): string { + return `${value.toFixed(1)}%`; +} + +const yAxisDomain: [number, number] = getMinMax(dummyAPYHistory, 'apy'); + +const renderAPYHistoryChart = () => { + return ( + + + + APY History + + + + + + + + + + + + + + { + // Format YYYY-MM to 'MMM YY' + const [year, month] = value.split('-'); + return new Date( + Number(year), + Number(month) - 1, + ).toLocaleString('default', { + month: 'short', + year: '2-digit', + }); + }} + type="category" + /> + + + + + + + + ); +}; + +function APYHistory() { + return <>{renderAPYHistoryChart()}; +} + +export function APYHistoryTab() { + return ( + + + + + + ); +} diff --git a/src/app/strategy/[strategyId]/_components/Strategy.tsx b/src/app/strategy/[strategyId]/_components/Strategy.tsx index 4cc376bd..53a80352 100755 --- a/src/app/strategy/[strategyId]/_components/Strategy.tsx +++ b/src/app/strategy/[strategyId]/_components/Strategy.tsx @@ -50,6 +50,7 @@ import { ManageTab } from './ManageTab'; import { RiskTab } from './RiskTab'; import { StrategyInfoComponent } from './StrategyInfo'; import { TransactionsTab } from './TransactionsTab'; +import { APYHistoryTab } from './APYHistory'; import ManageIcon from '@/assets/manage.svg'; import RiskIcon from '@/assets/risk.svg'; @@ -209,12 +210,15 @@ const Strategy = ({ params }: StrategyParams) => { setRoute('details'); break; case 2: - setRoute('risks'); + setRoute('apys'); break; case 3: - setRoute('faq'); + setRoute('risks'); break; case 4: + setRoute('faq'); + break; + case 5: setRoute('transactions'); break; default: @@ -238,15 +242,18 @@ const Strategy = ({ params }: StrategyParams) => { case 'details': setTabIndex(1); break; - case 'risks': + case 'apys': setTabIndex(2); break; - case 'faq': + case 'risks': setTabIndex(3); break; - case 'transactions': + case 'faq': setTabIndex(4); break; + case 'transactions': + setTabIndex(5); + break; default: setTabIndex(0); break; @@ -488,6 +495,21 @@ const Strategy = ({ params }: StrategyParams) => { /> Details + { + mixpanel.track('APY History clicked'); + }} + > + + APY History + { /> )} + + {strategyCached && strategy && } + {strategy && } diff --git a/src/components/TVL.tsx b/src/components/TVL.tsx index 5b0a9115..51e74572 100755 --- a/src/components/TVL.tsx +++ b/src/components/TVL.tsx @@ -44,12 +44,18 @@ const TVL: React.FC = () => { gap="2" width="100%" > - + @@ -71,12 +77,18 @@ const TVL: React.FC = () => { - + @@ -96,12 +108,16 @@ const TVL: React.FC = () => { - + diff --git a/src/components/YieldCard.tsx b/src/components/YieldCard.tsx index ef6be84f..29860545 100644 --- a/src/components/YieldCard.tsx +++ b/src/components/YieldCard.tsx @@ -568,12 +568,9 @@ export default function YieldCard(props: YieldCardProps) { return ( <> Date: Wed, 9 Jul 2025 17:37:03 +0100 Subject: [PATCH 03/48] Refactor Strategy component and enhance UI consistency - Updated padding in various tabs for improved layout. - Reorganized tab structure in the Strategy component to better reflect APY and risk information. - Introduced a new APYHistory icon and updated related tracking events. - Enhanced the StrategyInfo component layout for better alignment and spacing. - Added new SVG asset for APY History representation. - Adjusted footer margin for better visual separation. --- src/app/page.tsx | 2 - .../[strategyId]/_components/APYHistory.tsx | 2 +- .../[strategyId]/_components/DetailsTab.tsx | 2 +- .../[strategyId]/_components/FAQTab.tsx | 2 +- .../[strategyId]/_components/ManageTab.tsx | 2 +- .../[strategyId]/_components/Strategy.tsx | 44 +++++++------- .../[strategyId]/_components/StrategyInfo.tsx | 57 +++++++++---------- .../_components/TransactionsTab.tsx | 10 +++- src/assets/apy-history.svg | 6 ++ src/components/Footer.tsx | 2 +- src/components/Pools.tsx | 42 ++++++-------- 11 files changed, 85 insertions(+), 86 deletions(-) create mode 100644 src/assets/apy-history.svg diff --git a/src/app/page.tsx b/src/app/page.tsx index 5288fd4f..44b9d25b 100755 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -166,7 +166,6 @@ export default function Home() { bg="color_3" float={'left'} width={'100%'} - // borderWidth={'1px'} borderColor={'color_3'} borderRadius={'8px'} padding={'1rem 0'} @@ -177,7 +176,6 @@ export default function Home() { bg="color_3" width={'100%'} float={'left'} - // borderWidth={'1px'} borderColor={'color_3'} borderRadius={'8px'} padding={'1rem 0'} diff --git a/src/app/strategy/[strategyId]/_components/APYHistory.tsx b/src/app/strategy/[strategyId]/_components/APYHistory.tsx index 14975569..9a5730c0 100644 --- a/src/app/strategy/[strategyId]/_components/APYHistory.tsx +++ b/src/app/strategy/[strategyId]/_components/APYHistory.tsx @@ -173,7 +173,7 @@ export function APYHistoryTab() { flexDirection="column" gap="16px" width="100%" - padding={'16px'} + padding={'32px 0px'} > diff --git a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx index c06ca8da..88faa0bf 100644 --- a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx +++ b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx @@ -34,7 +34,7 @@ export function DetailsTab(props: DetailsTabProps) { diff --git a/src/app/strategy/[strategyId]/_components/FAQTab.tsx b/src/app/strategy/[strategyId]/_components/FAQTab.tsx index 2df51ff1..baab888f 100644 --- a/src/app/strategy/[strategyId]/_components/FAQTab.tsx +++ b/src/app/strategy/[strategyId]/_components/FAQTab.tsx @@ -27,7 +27,7 @@ export function FAQTab(props: FAQTabProps) { maxWidth={'1152px'} margin={'0 auto'} flexDirection={'column'} - padding={'24px 16px'} + padding={'32px 0px'} gap={'24px'} > diff --git a/src/app/strategy/[strategyId]/_components/Strategy.tsx b/src/app/strategy/[strategyId]/_components/Strategy.tsx index 53a80352..1c82a710 100755 --- a/src/app/strategy/[strategyId]/_components/Strategy.tsx +++ b/src/app/strategy/[strategyId]/_components/Strategy.tsx @@ -53,6 +53,7 @@ import { TransactionsTab } from './TransactionsTab'; import { APYHistoryTab } from './APYHistory'; import ManageIcon from '@/assets/manage.svg'; +import APYHistoryIcon from '@/assets/apy-history.svg'; import RiskIcon from '@/assets/risk.svg'; import DetailsIcon from '@/assets/details.svg'; import FaqIcon from '@/assets/faq.svg'; @@ -207,13 +208,13 @@ const Strategy = ({ params }: StrategyParams) => { setRoute('manage'); break; case 1: - setRoute('details'); + setRoute('apys'); break; case 2: - setRoute('apys'); + setRoute('risks'); break; case 3: - setRoute('risks'); + setRoute('details'); break; case 4: setRoute('faq'); @@ -239,13 +240,13 @@ const Strategy = ({ params }: StrategyParams) => { case 'manage': setTabIndex(0); break; - case 'details': + case 'apys': setTabIndex(1); break; - case 'apys': + case 'risks': setTabIndex(2); break; - case 'risks': + case 'details': setTabIndex(3); break; case 'faq': @@ -486,14 +487,14 @@ const Strategy = ({ params }: StrategyParams) => { color={'text_secondary'} _selected={{ color: 'purple', fontWeight: 'bold' }} onClick={() => { - mixpanel.track('Details clicked'); + mixpanel.track('APY History clicked'); }} > - - Details + APY History { color={'text_secondary'} _selected={{ color: 'purple', fontWeight: 'bold' }} onClick={() => { - mixpanel.track('APY History clicked'); + mixpanel.track('Risk clicked'); }} > - - APY History + Risks { color={'text_secondary'} _selected={{ color: 'purple', fontWeight: 'bold' }} onClick={() => { - mixpanel.track('Risk clicked'); + mixpanel.track('Details clicked'); }} > - - Risks + Details { {strategy && } + + {strategyCached && strategy && } + + + {strategy && } + {strategyCached && strategy && ( { /> )} - - {strategyCached && strategy && } - - - {strategy && } - - {strategy && } diff --git a/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx index d2ff3e63..2fde3d13 100644 --- a/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx +++ b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx @@ -35,36 +35,33 @@ export function StrategyInfoComponent(props: { strategy: StrategyInfo }) { /> )} - - {strategy ? strategy.name : 'Strategy Not found'} - - {strategy.metadata.auditUrl && ( - Audited. Click to view report.}> - - - - {/* badge */} - - - - )} + + + {strategy ? strategy.name : 'Strategy Not found'} + + {strategy.metadata.auditUrl && ( + Audited. Click to view report.}> + + + + + + + )} + ); } diff --git a/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx index afd0c5d9..e611d894 100644 --- a/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx +++ b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx @@ -68,6 +68,8 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { textTransform={'capitalize'} borderTopLeftRadius={'lg'} borderBottomLeftRadius={'lg'} + borderRightWidth={'1px'} + borderColor={'mybg'} > # @@ -76,6 +78,8 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { fontSize={'14px'} fontWeight={'600'} textTransform={'capitalize'} + borderRightWidth={'1px'} + borderColor={'mybg'} > Amount @@ -84,6 +88,8 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { fontSize={'14px'} fontWeight={'600'} textTransform={'capitalize'} + borderRightWidth={'1px'} + borderColor={'mybg'} > Transaction type @@ -92,6 +98,8 @@ function DesktopTransactionHistory(props: { transactions: ITransaction[] }) { fontSize={'14px'} fontWeight={'600'} textTransform={'capitalize'} + borderRightWidth={'1px'} + borderColor={'mybg'} > Transaction hash @@ -289,7 +297,7 @@ export function TransactionsTab(props: TransactionsTabProps) { flexDirection="column" gap="16px" width="100%" - padding={'16px'} + padding={'32px 0px'} > diff --git a/src/assets/apy-history.svg b/src/assets/apy-history.svg new file mode 100644 index 00000000..89d64351 --- /dev/null +++ b/src/assets/apy-history.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index df3952b4..5fe66c60 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -80,7 +80,7 @@ const Footer: React.FC = () => { const { isOpen, onOpen, onClose } = useDisclosure(); return ( - + - + Pool name - + - - - - + + - + Date: Thu, 10 Jul 2025 11:38:54 +0100 Subject: [PATCH 04/48] Update dependencies in package.json and yarn.lock - Upgraded starknetkit from version 2.4.0 to 2.12.1 to reflect Ready rebranding - Updated @starknet-io/get-starknet-core and @starknet-io/get-starknet to version 4.0.7 for compatibility. - Added new dependency @argent/x-ui at version 1.87.0. - Updated react and react-dom to version 18.3.1 for the latest features and fixes. --- package.json | 2 +- yarn.lock | 49 +++++++++++++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index d855b724..122af775 100755 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "recharts": "^3.1.0", "sharp": "0.33.4", "starknet": "6.11.0", - "starknetkit": "2.4.0", + "starknetkit": "^2.12.1", "swr": "2.2.5", "wonka": "6.3.4" }, diff --git a/yarn.lock b/yarn.lock index f5199c98..fbfb8dc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,6 +48,11 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" +"@argent/x-ui@^1.70.1": + version "1.87.0" + resolved "https://registry.yarnpkg.com/@argent/x-ui/-/x-ui-1.87.0.tgz#bbae58bf506b458e26f368c2d2288445f5bef40c" + integrity sha512-aqw0Z3+8oE2csI6qSEN2zZBcPyHvmy0WkDDdhqfwZf4KTL4zbrxRUQs0Z4/QucH6LqiCqHCrOt93sB2ecaeEBQ== + "@avnu/avnu-sdk@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@avnu/avnu-sdk/-/avnu-sdk-3.0.2.tgz#1751f951380160858bcb8a3fa30a5b4b086d3891" @@ -3034,23 +3039,28 @@ resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b" integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== -"@starknet-io/get-starknet-core@4.0.6", "@starknet-io/get-starknet-core@^4.0.2": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@starknet-io/get-starknet-core/-/get-starknet-core-4.0.6.tgz#92658419185e1289f9962ec3c95f28e56fb7090a" - integrity sha512-Ka7d1+ZnpVcQObph4eQyQ/pz5vkZVTdtoFMotTarLXi5S4DvDAlCwnTC/LX3gSJK4UXBSxn9MPP1S+VPw3W/9Q== +"@starknet-io/get-starknet-core@4.0.7", "@starknet-io/get-starknet-core@^4.0.6": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@starknet-io/get-starknet-core/-/get-starknet-core-4.0.7.tgz#d9122ffe66557d7d925d80303db0f607960bed40" + integrity sha512-ocwQTdDvGa+0CvjGygyaTuFkda2R82dofydts8uXr9p0Diy/bmYW1fkuqJfi1nC5M+YcvvuEpl6wFvwXM1og5w== dependencies: "@module-federation/runtime" "^0.1.2" "@starknet-io/types-js" "^0.7.7" async-mutex "^0.5.0" -"@starknet-io/get-starknet@^4.0.2": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@starknet-io/get-starknet/-/get-starknet-4.0.6.tgz#e6082610fa5094eaf4c3a44a52299f6a460f59fe" - integrity sha512-FhyYF90g1FQHRJudv1FOWtSRLSFoVAM4PTb14Pgy+5aeENubr5hekprqFhZWNk9c3msxK/Nxio+Xc+sgg9zvEg== +"@starknet-io/get-starknet@^4.0.6": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@starknet-io/get-starknet/-/get-starknet-4.0.7.tgz#e650bbd135cced29a02bf8463a9ac0dce459daac" + integrity sha512-env/ZN5EmDJ6vDtIgjOjsEvvzdKBDaWZ0aLe79IVJ7lq2icqKbX86yR1/CUf4AU31AFYZHWZ3daOaGFT4nHSUQ== dependencies: - "@starknet-io/get-starknet-core" "4.0.6" + "@starknet-io/get-starknet-core" "4.0.7" bowser "^2.11.0" +"@starknet-io/types-js@^0.7.10": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760" + integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w== + "@starknet-io/types-js@^0.7.7": version "0.7.7" resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8" @@ -8400,7 +8410,7 @@ react-clientside-effect@^1.2.6: dependencies: "@babel/runtime" "^7.12.13" -react-dom@18: +react-dom@18, react-dom@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -8542,7 +8552,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@18: +react@18, react@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -9222,14 +9232,15 @@ starknet@6.11.0: ts-mixer "^6.0.3" url-join "^4.0.1" -starknetkit@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/starknetkit/-/starknetkit-2.4.0.tgz#922dacd4686755bdabe2dc1825c990aa5bf0195a" - integrity sha512-k6an2qrr3OUS9QaUVmjfikEMYLppyLvy0V4DRX8MKYEIGZ0VBG5dNAj9uuBIWyjlNlJPY9RwmmHhOMNazbgBmg== +starknetkit@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/starknetkit/-/starknetkit-2.12.1.tgz#b329a42b429accd479053e7da844937dd12313c3" + integrity sha512-RoYotdU0dTDvkqgTy75fOezFfKfPofjCLzMrNE5MSUn/8Nc0rmtjIgWBP4bLOUg+TCCebp/EZHETq5VHU1aU8Q== dependencies: - "@starknet-io/get-starknet" "^4.0.2" - "@starknet-io/get-starknet-core" "^4.0.2" - "@starknet-io/types-js" "^0.7.7" + "@argent/x-ui" "^1.70.1" + "@starknet-io/get-starknet" "^4.0.6" + "@starknet-io/get-starknet-core" "^4.0.6" + "@starknet-io/types-js" "^0.7.10" "@trpc/client" "^10.38.1" "@trpc/server" "^10.38.1" "@walletconnect/sign-client" "^2.11.0" @@ -9238,6 +9249,8 @@ starknetkit@2.4.0: eventemitter3 "^5.0.1" events "^3.3.0" lodash-es "^4.17.21" + react "^18.2.0" + react-dom "^18.2.0" svelte-forms "^2.3.1" trpc-browser "^1.3.2" From ac122934656a09e4121b05b007b5cbdc6475c84a Mon Sep 17 00:00:00 2001 From: Oche Date: Thu, 10 Jul 2025 18:03:46 +0100 Subject: [PATCH 05/48] Enhance APYHistory component with time range selection and theme updates - Introduced a TimeRangeSelector component for selecting APY history display ranges (1d, 7d, 30d, all). - Updated APYHistory component to utilize the selected time range for data filtering. - Added new theme colors for improved UI consistency. - Refactored dummy APY history data generation for dynamic date handling. --- .../[strategyId]/_components/APYHistory.tsx | 106 ++++++++++-------- src/app/template.tsx | 4 + src/components/TimeRangeSelector.tsx | 46 ++++++++ 3 files changed, 112 insertions(+), 44 deletions(-) create mode 100644 src/components/TimeRangeSelector.tsx diff --git a/src/app/strategy/[strategyId]/_components/APYHistory.tsx b/src/app/strategy/[strategyId]/_components/APYHistory.tsx index 9a5730c0..a8013b72 100644 --- a/src/app/strategy/[strategyId]/_components/APYHistory.tsx +++ b/src/app/strategy/[strategyId]/_components/APYHistory.tsx @@ -7,42 +7,38 @@ import { CartesianGrid, ResponsiveContainer, } from 'recharts'; +import TimeRangeSelector from '@/components/TimeRangeSelector'; +import { useState, useMemo } from 'react'; -import { StrategyInfo } from '@/store/strategies.atoms'; +type TimeRange = '1d' | '7d' | '30d' | 'all'; -interface ITransaction { - amount: string; - timestamp: number; - type: string; - txHash: string; - asset: string; - __typename: 'Investment_flows'; -} -interface TransactionsTabProps { - strategy: StrategyInfo; - // txHistoryResult: AtomWithQueryResult; - txHistory: { - findManyInvestment_flows: ITransaction[]; - }; - isMobile?: boolean; -} - -// Dummy APY history data for months and APY percentage -interface APYHistoryPoint { +interface APYHistoryData { month: string; apy: number; } -const dummyAPYHistory: APYHistoryPoint[] = [ - { month: '2023-10', apy: 4.2 }, - { month: '2023-11', apy: 4.5 }, - { month: '2023-12', apy: 4.7 }, - { month: '2024-01', apy: 5.0 }, - { month: '2024-02', apy: 5.1 }, - { month: '2024-03', apy: 5.3 }, - { month: '2024-04', apy: 5.0 }, - { month: '2024-05', apy: 5.2 }, -]; +const dummyAPYHistory: APYHistoryData[] = (() => { + const days = 60; + const today = new Date(); + const data: APYHistoryData[] = []; + const baseAPY = 4.0; + for (let i = days - 1; i >= 0; i--) { + const date = new Date(today); + date.setDate(today.getDate() - i); + const dayStr = date.toISOString().slice(0, 10); + + const apy = + baseAPY + + Math.sin(i / 7) * 0.2 + + Math.random() * 0.1 + + (i > 30 ? 0.5 : 0); + data.push({ + month: dayStr, + apy: Number(apy.toFixed(2)), + }); + } + return data; +})(); function getMinMax(arr: T[], key: keyof T & string): [number, number] { const values = arr.map((item) => item[key] as unknown as number); @@ -63,9 +59,20 @@ function formatYAxis(value: number): string { return `${value.toFixed(1)}%`; } -const yAxisDomain: [number, number] = getMinMax(dummyAPYHistory, 'apy'); +const timeRangeToDays: Record = { + '1d': 10, + '7d': 7, + '30d': 30, + all: dummyAPYHistory.length, +}; + +const renderAPYHistoryChart = ( + selectedRange: TimeRange, + onRangeChange: (range: TimeRange) => void, + filteredData: APYHistoryData[], +) => { + const yAxisDomain: [number, number] = getMinMax(filteredData, 'apy'); -const renderAPYHistoryChart = () => { return ( { px={4} py={3} borderBottom="1px solid" - borderColor="gray.700" + borderColor="border_grey" + borderBottomWidth="1px" > APY History + @@ -120,23 +132,21 @@ const renderAPYHistoryChart = () => { { - // Format YYYY-MM to 'MMM YY' - const [year, month] = value.split('-'); - return new Date( - Number(year), - Number(month) - 1, - ).toLocaleString('default', { + const date = new Date(value); + return date.toLocaleString('default', { month: 'short', - year: '2-digit', + day: 'numeric', }); }} type="category" /> { }; function APYHistory() { - return <>{renderAPYHistoryChart()}; + const [selectedRange, setSelectedRange] = useState('all'); + const days = timeRangeToDays[selectedRange]; + const filteredData = useMemo( + () => dummyAPYHistory.slice(-days), + [selectedRange], + ); + return ( + <>{renderAPYHistoryChart(selectedRange, setSelectedRange, filteredData)} + ); } export function APYHistoryTab() { diff --git a/src/app/template.tsx b/src/app/template.tsx index 5957d76d..774399e2 100755 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -63,6 +63,9 @@ const theme = extendTheme({ input_light: '#37373780', list_item_bg: '#37373766', + text_grey: '#868898', + text_grey_60p: '#86889899', + text_grey_90p: '#868898E5', grey_text: '#B6B6B6', grey_text_2: '#909090', text_primary: 'white', @@ -92,6 +95,7 @@ const theme = extendTheme({ dark_bg: '#111119', purple_tint: '#CFCFEA', lavender_gray: '#B4B1BD', + border_grey: '#B3B3B326', text_subtle: '#a0a2b0', text_subtle_50p: '#a0a2b080', diff --git a/src/components/TimeRangeSelector.tsx b/src/components/TimeRangeSelector.tsx new file mode 100644 index 00000000..6466c3fd --- /dev/null +++ b/src/components/TimeRangeSelector.tsx @@ -0,0 +1,46 @@ +'use client'; + +import { Button, Flex } from '@chakra-ui/react'; + +type TimeRange = '1d' | '7d' | '30d' | 'all'; + +interface TimeRangeSelectorProps { + selectedRange: TimeRange; + onRangeChange: (range: TimeRange) => void; +} + +const timeRanges: TimeRange[] = ['1d', '7d', '30d', 'all']; + +export default function TimeRangeSelector({ + selectedRange, + onRangeChange, +}: TimeRangeSelectorProps) { + return ( + + {timeRanges.map((range, index) => ( + + ))} + + ); +} From ca115d954e6905537e9da40916c77e8804e8ff51 Mon Sep 17 00:00:00 2001 From: Oche Date: Fri, 11 Jul 2025 11:42:54 +0100 Subject: [PATCH 06/48] Refactor UI components for improved styling - Removed box shadow from the Home component for a cleaner look. - Changed text color from white to black in the Filters component for better readability against the purple background. --- src/app/page.tsx | 1 - src/components/Filters.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 44b9d25b..d2e89211 100755 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -159,7 +159,6 @@ export default function Home() { bg="purple" color="color1" borderRadius="1px" - boxShadow={'0px 0px 8px 0px var(--chakra-colors-purple)'} /> Date: Tue, 15 Jul 2025 22:13:51 +0530 Subject: [PATCH 07/48] add zklend batch 2 --- .../_components/zkLendRecoveryComp.tsx | 32 ++++++------------- src/app/recovery/page.tsx | 4 ++- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/app/recovery/_components/zkLendRecoveryComp.tsx b/src/app/recovery/_components/zkLendRecoveryComp.tsx index c2ce52b1..b7a3a11b 100644 --- a/src/app/recovery/_components/zkLendRecoveryComp.tsx +++ b/src/app/recovery/_components/zkLendRecoveryComp.tsx @@ -74,16 +74,16 @@ const AUTO_COMPOUNDING = { }, }; -const BATCH_ID = 1; - -export default function ZklendRecoveryComp() { +export default function ZklendRecoveryComp(props: { BATCH_ID: number }) { const _address = useAtomValue(addressAtom); const address = useMemo(() => { return _address || ''; }, [_address]); const ALL_STRATS: Record = { - ...AUTO_COMPOUNDING, + ...(props.BATCH_ID == 1 + ? AUTO_COMPOUNDING + : ({} as Record)), ...STRATEGY_ADDRESSES, }; @@ -112,7 +112,7 @@ export default function ZklendRecoveryComp() { ); const res: any = await contract.call('zklend_position', [ address, - uint256.bnToUint256(BATCH_ID), + uint256.bnToUint256(props.BATCH_ID), ]); const token = num.getHexString(res[0].toString()); const tokenInfo = TOKENS.find( @@ -143,7 +143,7 @@ export default function ZklendRecoveryComp() { }), { ...balances }, ); - console.log('revoery2', updatedBalances); + console.log('revoery2', updatedBalances, props); setBalances(updatedBalances); } catch (error) { setIsLoading(false); @@ -161,7 +161,7 @@ export default function ZklendRecoveryComp() { (acc, [key, value]) => { const tokenName: 'ETH' | 'USDC' | 'STRK' = value.token as any; if (!['ETH', 'USDC', 'STRK'].includes(tokenName)) { - console.error('Invalid token name:', tokenName); + console.error('Invalid token name:', tokenName, balances); throw new Error('Invalid token name'); } acc[tokenName] += Number(value.balance); @@ -193,7 +193,7 @@ export default function ZklendRecoveryComp() { const amount = balances[strategy_key].balance; if (amount && Number(amount) > 0) return contract.populate('withdraw_zklend', [ - uint256.bnToUint256(BATCH_ID), + uint256.bnToUint256(props.BATCH_ID), address, ]); return null; @@ -241,7 +241,7 @@ export default function ZklendRecoveryComp() { marginBottom={{ base: '20px', md: '0' }} > - Recovery from zkLend: + Recovery from zkLend: Batch {props.BATCH_ID} - 1. Check your eligible claims by connecting your wallet. Please note - that approximately 1-5% of your original funds are expected to be - available. Please let us know of any descrepresies before 28th March - on our{' '} - - Telegram - - . -
- 2. Any newly recovered funds from{' '} + 1. Any newly recovered funds from{' '}
- + +
+
); } From 92ba9034e849f37992aaba3072f1234ea706d897 Mon Sep 17 00:00:00 2001 From: Oche Date: Thu, 24 Jul 2025 07:47:13 +0100 Subject: [PATCH 08/48] Implement APY history retrieval and update pre-commit hook - Added a new route for fetching APY history based on strategy ID and duration. - Introduced APYHistory and APYHistoryBlockInfo interfaces to manage APY data structure. - Enhanced EkuboClStrategy with a method to retrieve APY history from block data. - Updated pre-commit hook to only add staged files after linting and formatting. --- .husky/pre-commit | 3 +- .../apyHistory/[strategyId]/route.ts | 39 +++++++++++++++++++ src/strategies/IStrategy.ts | 17 ++++++++ src/strategies/ekubo_cl_vault.ts | 13 +++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/app/api/strategies/apyHistory/[strategyId]/route.ts diff --git a/.husky/pre-commit b/.husky/pre-commit index 3ef8c522..f94cc390 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,2 @@ -yarn run lint:fix && yarn run format:fix && git add . \ No newline at end of file +STAGED_FILES=$(git diff --cached --name-only) +yarn run lint:fix && yarn run format:fix && git add $STAGED_FILES \ No newline at end of file diff --git a/src/app/api/strategies/apyHistory/[strategyId]/route.ts b/src/app/api/strategies/apyHistory/[strategyId]/route.ts new file mode 100644 index 00000000..a46c1cae --- /dev/null +++ b/src/app/api/strategies/apyHistory/[strategyId]/route.ts @@ -0,0 +1,39 @@ +import { NextRequest } from 'next/server'; +import { getStrategies } from '@/store/strategies.atoms'; + +export async function GET(req: NextRequest, context: any) { + const { params } = context; + const { searchParams } = new URL(req.url); + const strategyId = params.strategyId; + + const duration = parseInt(searchParams.get('duration') || '7', 10); + + const strategies = getStrategies(); + const strategy = strategies.find((s) => s.id === strategyId); + + if (!strategy) { + return new Response(JSON.stringify({ error: 'Strategy not found' }), { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }); + } + + const result = await fetch(`https://app.endur.fi/api/blocks/${duration}`); + const response = await result.json(); + + const blockInfo = response.blocks.map( + (block: { block: number; timestamp: number }) => { + return { block: block.block, timestamp: block.timestamp }; + }, + ); + + const apyHistory = { + strategy: strategy.name, + history: await strategy.getAPYHistory(blockInfo), + }; + + return new Response(JSON.stringify({ apyHistory }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); +} diff --git a/src/strategies/IStrategy.ts b/src/strategies/IStrategy.ts index 33b12dee..52bfcaed 100755 --- a/src/strategies/IStrategy.ts +++ b/src/strategies/IStrategy.ts @@ -123,6 +123,17 @@ export interface IStrategySettings { isTransactionHistDisabled?: boolean; } +export interface APYHistoryBlockInfo { + block: number; + timestamp: number; +} + +export interface APYHistory { + block: number; + timestamp: number; + apy: number; +} + export interface AmountInfo { amount: Web3Number; usdValue: number; @@ -214,6 +225,12 @@ export class IStrategyProps { throw new Error('getTVL: Not implemented'); }; + getAPYHistory = async ( + blocks: APYHistoryBlockInfo[], + ): Promise => { + return []; + }; + isLive() { return isLive(this.liveStatus); } diff --git a/src/strategies/ekubo_cl_vault.ts b/src/strategies/ekubo_cl_vault.ts index 04322224..6bb32297 100644 --- a/src/strategies/ekubo_cl_vault.ts +++ b/src/strategies/ekubo_cl_vault.ts @@ -1,6 +1,8 @@ import CONSTANTS from '@/constants'; import { AmountsInfo, + APYHistory, + APYHistoryBlockInfo, DepositActionInputs, IStrategy, IStrategyActionHook, @@ -284,6 +286,17 @@ export class EkuboClStrategy extends IStrategy { this.status = StrategyStatus.SOLVED; } + getAPYHistory = async (blocks: APYHistoryBlockInfo[]) => { + const apyHistory: APYHistory[] = []; + + for (const block of blocks) { + const apy = await this.clVault.netAPY(block.block, 16000); + apyHistory.push({ ...block, apy }); + } + + return apyHistory; + }; + getEkuboStratBalanceAtom = (underlyingToken: TokenInfo) => { const holdingBalAtom = getBalanceAtom(this.holdingTokens[0], atom(true)); return atomWithQuery((get) => { From 1bfa417f7ec80362376824dbb5e3c77301ad7f62 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Wed, 6 Aug 2025 23:31:33 +0530 Subject: [PATCH 09/48] fix xSTRK APY bug, increase xSTRK limit --- .../[strategyId]/_components/Strategy.tsx | 5 +- src/constants.ts | 8 +- src/store/strategies.atoms.tsx | 38 ++-- src/store/zklend.store.ts | 84 -------- src/strategies/IStrategy.ts | 14 +- src/strategies/auto_strk.strat.ts | 17 +- src/strategies/delta_neutral_mm.ts | 24 ++- src/strategies/delta_neutral_mm_2.ts | 4 - src/strategies/delta_neutral_mm_vesu_endur.ts | 203 ++++++++++-------- 9 files changed, 160 insertions(+), 237 deletions(-) delete mode 100755 src/store/zklend.store.ts diff --git a/src/app/strategy/[strategyId]/_components/Strategy.tsx b/src/app/strategy/[strategyId]/_components/Strategy.tsx index bd13ffc8..133c741d 100755 --- a/src/app/strategy/[strategyId]/_components/Strategy.tsx +++ b/src/app/strategy/[strategyId]/_components/Strategy.tsx @@ -62,6 +62,9 @@ function HoldingsText({ }) { if (strategy.settings.isInMaintenance) return Maintenance Mode; + + if (strategy?.isRetired()) return '-'; + if (!address) return You will see your holdings here; if (balData.isLoading || !balData.data?.tokenInfo) { @@ -80,7 +83,7 @@ function HoldingsText({ balData.data.tokenInfo?.displayDecimals || 2, ), ); - if (value === 0 || strategy?.isRetired()) return '-'; + if (value === 0) return '-'; return `${balData.data.amount.toEtherToFixedDecimals( balData.data.tokenInfo?.displayDecimals || 2, )} ${balData.data.tokenInfo?.name}`; diff --git a/src/constants.ts b/src/constants.ts index a0f8fe5d..9d575f7f 100755 --- a/src/constants.ts +++ b/src/constants.ts @@ -24,12 +24,12 @@ export type TokenName = export const CONSTANTS = { DEX_INCENTIVE_URL: - 'https://kx58j6x5me.execute-api.us-east-1.amazonaws.com/starknet/fetchFile?file=strk_grant.json', + 'https://app.troves.fi/strk-incentives/fetchFile?file=strk_grant.json', NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', CARMINE_URL: '/carmine/api/v2/mainnet', LENDING_INCENTIVES_URL: - 'https://kx58j6x5me.execute-api.us-east-1.amazonaws.com/starknet/fetchFile?file=prod-api/lending/lending_strk_grant.json', + 'https://app.troves.fi/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', LOGOS, COMMUNITY_TG: 'https://troves.fi/tg', NOSTRA: { @@ -54,8 +54,8 @@ export const CONSTANTS = { BASE_APR_API: '/haiko/markets?network=mainnet', }, Troves: { - // BASE_APR_API: '/api/strategies', - BASE_APR_API: 'https://beta.troves.fi/api/strategies', + BASE_APR_API: '/api/strategies', + // BASE_APR_API: 'https://beta.troves.fi/api/strategies', }, MY_SWAP: { POOLS_API: '/myswap/data/pools/all.json', diff --git a/src/store/strategies.atoms.tsx b/src/store/strategies.atoms.tsx index 056cb4c3..b9b829a5 100755 --- a/src/store/strategies.atoms.tsx +++ b/src/store/strategies.atoms.tsx @@ -64,10 +64,22 @@ export function getStrategies() { }, ]; + const DNMMDescription = (token1: string, token2: string) => ( + + + Note: Vault is retired due to zkLend + exploit. Claim any recovered funds{' '} + + here. + + + + ); + const autoStrkStrategy = new AutoTokenStrategy( 'STRK', 'Auto Compounding STRK', - "Stake your STRK or zkLend's zSTRK token to receive DeFi Spring $STRK rewards every 7 days. The strategy auto-collects your rewards and re-invests them in the zkLend STRK pool, giving you higher return through compounding. You receive frmzSTRK LP token as representation for your stake on Troves. You can withdraw anytime by redeeming your frmzSTRK for zSTRK and see your STRK in zkLend.", + DNMMDescription('', ''), 'zSTRK', CONSTANTS.CONTRACTS.AutoStrkFarm, { @@ -81,7 +93,7 @@ export function getStrategies() { const autoUSDCStrategy = new AutoTokenStrategy( 'USDC', 'Auto Compounding USDC', - "Stake your USDC or zkLend's zUSDC token to receive DeFi Spring $STRK rewards every 7 days. The strategy auto-collects your $STRK rewards, swaps them to USDC and re-invests them in the zkLend USDC pool, giving you higher return through compounding. You receive frmzUSDC LP token as representation for your stake on Troves. You can withdraw anytime by redeeming your frmzUSDC for zUSDC and see your STRK in zkLend.", + DNMMDescription('', ''), 'zUSDC', CONSTANTS.CONTRACTS.AutoUsdcFarm, { @@ -113,25 +125,6 @@ export function getStrategies() { }, ]; - const DNMMDescription = (token1: string, token2: string) => ( - - - Deposit your {token1} to automatically loop your funds between zkLend - and Nostra to create a delta neutral position. This strategy is designed - to maximize your yield on {token1}. Your position is automatically - adjusted periodically to maintain a healthy health factor. You receive a - NFT as representation for your stake on Troves. You can withdraw anytime - by redeeming your NFT for {token2}. - - - Note: Vault is retired due to zkLend - exploit. Claim any recovered funds{' '} - - here. - - - - ); const usdcTokenInfo = getTokenInfoFromName('USDC'); const deltaNeutralMMUSDCETH = new DeltaNeutralMM( usdcTokenInfo, @@ -210,7 +203,7 @@ export function getStrategies() { [1, 1, 0.725, 1.967985], // precomputed factors based on strategy math StrategyLiveStatus.ACTIVE, { - maxTVL: 500000, + maxTVL: 1500000, alerts: [ // { // type: 'warning', @@ -356,7 +349,6 @@ const strategiesAtomAsync = atomWithQuery((get) => { const allPools = get(allPoolsAtomUnSorted); const requiredPools = allPools.filter( (p) => - p.protocol.name === 'zkLend' || p.protocol.name === 'Nostra' || p.protocol.name === 'Vesu' || p.protocol.name === endur.name, diff --git a/src/store/zklend.store.ts b/src/store/zklend.store.ts deleted file mode 100755 index 92f4180e..00000000 --- a/src/store/zklend.store.ts +++ /dev/null @@ -1,84 +0,0 @@ -import CONSTANTS from '@/constants'; -import { PoolInfo, ProtocolAtoms2, StrkLendingIncentivesAtom } from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { IDapp } from './IDapp.store'; -import { StrategyAction } from '@/strategies/IStrategy'; -import { LendingSpace } from './lending.base'; -import { customAtomWithFetch } from '@/utils/customAtomWithFetch'; - -export class ZkLend extends IDapp { - name = 'zkLend'; - link = 'https://app.zklend.com/markets'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/zkLend/logo_dark.png'; - - incentiveDataKey = 'zkLend'; - LIQUIDATION_THRESHOLD = 1; - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ).map((p) => ({ ...p, additional: { ...p.additional, riskFactor: 5 } })); - // due to hack - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } - - // ! To consider price of tokens later. used for stables only for now. - getHF(positions: StrategyAction[]) { - return LendingSpace.getHF(positions, this.LIQUIDATION_THRESHOLD); - } - - // Returns the maximum debt that can be taken out incl. the factor. - getMaxFactoredOut(positions: StrategyAction[], minHf: number) { - let numerator = 0; - let denominator = 0; - positions.map((p) => { - // ! TODO To update math using bignumber and decimals - if (p.isDeposit) { - numerator += - Number(p.amount.toString()) * p.pool.lending.collateralFactor; - } else { - denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; - } - }); - - // HF = (numerator) / (denominator + factoredAmount) - // whre factoredAmount = (Amount of new Debt / debt factor) - const factoredAmount = numerator / minHf - denominator; - if (factoredAmount < 0) return 0; - return factoredAmount; - } -} - -export const zkLend = new ZkLend(); -const ZkLendAtoms: ProtocolAtoms2 = { - baseAPRs: customAtomWithFetch({ - url: CONSTANTS.ZKLEND.BASE_APR_API, - queryKey: 'zklend_lending_base_aprs', - }), - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (!ZkLendAtoms.baseAPRs) return empty; - const baseInfo = get(ZkLendAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = zkLend._computePoolsInfo(poolsInfo.data); - return zkLend.addBaseAPYs(pools, baseInfo); - } - return empty; - }), -}; -export default ZkLendAtoms; diff --git a/src/strategies/IStrategy.ts b/src/strategies/IStrategy.ts index 33b12dee..2f45cf74 100755 --- a/src/strategies/IStrategy.ts +++ b/src/strategies/IStrategy.ts @@ -7,7 +7,6 @@ import { import { IndexedPoolData } from '@/store/endur.store'; import { LendingSpace } from '@/store/lending.base'; import { Category, PoolInfo } from '@/store/pools'; -import { zkLend } from '@/store/zklend.store'; import { convertToV2TokenInfo, convertToV2Web3Number, @@ -407,9 +406,7 @@ export class IStrategy extends IStrategyProps { filterTokenByProtocol( tokenName: string, - protocol: - | IDapp - | IDapp = zkLend, + protocol: IDapp | IDapp, ) { return ( pools: PoolInfo[], @@ -479,7 +476,7 @@ export class IStrategy extends IStrategyProps { } } } catch (err) { - console.warn(`${this.tag} - unsolved`, err); + console.warn(`${this.tag} - unsolved`, this.name, err); return; } @@ -488,7 +485,12 @@ export class IStrategy extends IStrategyProps { const sign = action.isDeposit ? 1 : -1; const apr = action.isDeposit ? action.pool.apr : action.pool.borrow.apr; netYield += sign * apr * Number(action.amount); - console.log('netYield1', sign, apr, action.amount, netYield); + console.log('netYield1', { + sign, + apr, + amount: action.amount, + netYield, + }); }); this.netYield = netYield / Number(amount); console.log('netYield2', netYield, this.netYield, Number(amount)); diff --git a/src/strategies/auto_strk.strat.ts b/src/strategies/auto_strk.strat.ts index 212d8e0d..5257e574 100755 --- a/src/strategies/auto_strk.strat.ts +++ b/src/strategies/auto_strk.strat.ts @@ -22,8 +22,8 @@ import { getTokenInfoFromName, ZeroAmountsInfo, } from '@/utils'; -import { zkLend } from '@/store/zklend.store'; import { ContractAddr, IStrategyMetadata, Web3Number } from '@strkfarm/sdk'; +import React from 'react'; interface Step { name: string; @@ -48,7 +48,7 @@ export class AutoTokenStrategy extends IStrategy { constructor( token: TokenName, name: string, - description: string, + description: string | React.ReactNode, lpTokenName: string, strategyAddress: string, settings: IStrategySettings, @@ -101,18 +101,7 @@ export class AutoTokenStrategy extends IStrategy { ); this.token = tokenInfo; - this.steps = [ - { - name: `Supplies your ${token} to zkLend`, - optimizer: this.optimizer, - filter: [this.filterTokenByProtocol(this.token.name, zkLend)], - }, - { - name: `Re-invest your STRK Rewards every 7 days`, - optimizer: this.compounder, - filter: [this.filterTokenByProtocol('STRK', zkLend)], - }, - ]; + this.steps = []; const _risks = [...this.risks]; this.risks = [ this.getSafetyFactorLine(), diff --git a/src/strategies/delta_neutral_mm.ts b/src/strategies/delta_neutral_mm.ts index e3ee8fb3..a0b1d096 100755 --- a/src/strategies/delta_neutral_mm.ts +++ b/src/strategies/delta_neutral_mm.ts @@ -11,12 +11,10 @@ import { TokenInfo, WithdrawActionInputs, } from './IStrategy'; -import { zkLend } from '@/store/zklend.store'; import ERC20Abi from '@/abi/erc20.abi.json'; import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; import MyNumber from '@/utils/MyNumber'; import { Call, Contract, uint256 } from 'starknet'; -import { nostraLending } from '@/store/nostralending.store'; import { buildStrategyActionHook, convertToV2TokenInfo, @@ -45,8 +43,8 @@ export class DeltaNeutralMM extends IStrategy { readonly stepAmountFactors: number[]; fee_factor = 0.1; // 10% fee - protocol1: IDapp; - protocol2: IDapp; + protocol1: IDapp | null = null; + protocol2: IDapp | null = null; constructor( token: TokenInfo, name: string, @@ -56,8 +54,8 @@ export class DeltaNeutralMM extends IStrategy { stepAmountFactors: number[], liveStatus: StrategyLiveStatus, settings: IStrategySettings, - protocol1: IDapp = zkLend, - protocol2: IDapp = nostraLending, + protocol1: IDapp | null = null, + protocol2: IDapp | null = null, ) { const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; const nftInfo = NFTS.find( @@ -118,7 +116,10 @@ export class DeltaNeutralMM extends IStrategy { this.steps = this.getSteps(); - if (stepAmountFactors.length != this.getSteps().length - 1) { + if ( + this.getSteps().length > 0 && + stepAmountFactors.length != this.getSteps().length - 1 + ) { throw new Error( 'stepAmountFactors length should be equal to steps length', ); @@ -136,6 +137,9 @@ export class DeltaNeutralMM extends IStrategy { } getSteps() { + if (!this.protocol1 || !this.protocol2) { + return []; + } return [ { name: `Supply's your ${this.token.name} to ${this.protocol1.name}`, @@ -176,6 +180,9 @@ export class DeltaNeutralMM extends IStrategy { prevActions: StrategyAction[], ) { console.log('filterMainToken', pools); + if (!this.protocol1 || !this.protocol2) { + return []; + } const dapp = prevActions.length == 0 || prevActions.length == 4 ? this.protocol1 @@ -190,6 +197,9 @@ export class DeltaNeutralMM extends IStrategy { amount: string, prevActions: StrategyAction[], ) { + if (!this.protocol1 || !this.protocol2) { + return []; + } const dapp = prevActions.length == 1 ? this.protocol1 : this.protocol2; return pools.filter( (p) => p.pool.name == this.secondaryToken && p.protocol.name == dapp.name, diff --git a/src/strategies/delta_neutral_mm_2.ts b/src/strategies/delta_neutral_mm_2.ts index 35514f70..5e500808 100644 --- a/src/strategies/delta_neutral_mm_2.ts +++ b/src/strategies/delta_neutral_mm_2.ts @@ -6,8 +6,6 @@ import { StrategyLiveStatus, TokenInfo, } from './IStrategy'; -import { nostraLending } from '@/store/nostralending.store'; -import { zkLend } from '@/store/zklend.store'; import { convertToV2TokenInfo, getPrice, @@ -38,8 +36,6 @@ export class DeltaNeutralMM2 extends DeltaNeutralMM { stepAmountFactors, liveStatus, settings, - nostraLending, - zkLend, ); } diff --git a/src/strategies/delta_neutral_mm_vesu_endur.ts b/src/strategies/delta_neutral_mm_vesu_endur.ts index 572c62e1..e8987c08 100644 --- a/src/strategies/delta_neutral_mm_vesu_endur.ts +++ b/src/strategies/delta_neutral_mm_vesu_endur.ts @@ -6,6 +6,7 @@ import { Step, StrategyAction, StrategyLiveStatus, + StrategyStatus, TokenInfo, } from './IStrategy'; import MyNumber from '@/utils/MyNumber'; @@ -17,7 +18,7 @@ import { } from '@/utils'; import { vesu } from '@/store/vesu.store'; import { endur } from '@/store/endur.store'; -import { PoolInfo } from '@/store/pools'; +import { getDefaultPoolInfo, PoolInfo } from '@/store/pools'; import { Contract } from 'starknet'; import { fetchQuotes, QuoteRequest } from '@avnu/avnu-sdk'; import { Web3Number } from '@strkfarm/sdk'; @@ -78,7 +79,7 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM { ? this.token.name : `${this.token.name} (${this.vesuPoolName})`; return pools.filter( - (p) => p.pool.name == tokenName && p.protocol.name == dapp.name, + (p) => p.pool.name == tokenName && p.protocol.name == dapp?.name, ); } @@ -89,16 +90,10 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM { tokenName: string, ) { const dapp = this.protocol2; - console.log( - 'filterSecondaryToken', - pools.filter((p) => p.protocol.name == dapp.name), - tokenName, - `${tokenName} (${this.vesuPoolName})`, - ); return pools.filter( (p) => p.pool.name == `${tokenName} (${this.vesuPoolName})` && - p.protocol.name == dapp.name, + p.protocol.name == dapp?.name, ); } @@ -107,33 +102,13 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM { amount: string, actions: StrategyAction[], ): StrategyAction[] { - console.log('optimizer', actions.length, this.stepAmountFactors); - const _amount = ( - Number(amount) * this.stepAmountFactors[actions.length] - ).toFixed(2); - const pool = { ...eligiblePools[0] }; - const isDeposit = actions.length == 0 || actions.length == 1; - const effectiveAPR = pool.aprSplits.reduce((a, b) => { - if (b.apr == 'Err') return a; - if (!isDeposit) return a + Number(b.apr); - if (b.title.includes('STRK rewards')) { - return a + Number(b.apr) * (1 - this.fee_factor); - } - return a + Number(b.apr); - }, 0); - console.log('optimizer2', isDeposit, pool, effectiveAPR); - pool.apr = isDeposit ? effectiveAPR : pool.borrow.apr; - return [ - ...actions, - { - pool, - amount: _amount, - isDeposit, - }, - ]; + return []; // @deprecated } getSteps(): Step[] { + if (!this.protocol1 || !this.protocol2) { + return []; + } return [ { name: `Stake ${this.token.name} to ${this.protocol1.name}`, @@ -176,76 +151,116 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM { amount: string, actions: StrategyAction[], ) { - console.log('getLookRepeatYieldAmount', amount, actions); - let full_amount = Number(amount); - this.stepAmountFactors.slice(0, actions.length).forEach((factor, i) => { - full_amount /= factor; + return []; // @deprecated + } + + async solve(pools: PoolInfo[], amount: string) { + const netYield = 0; + this.status = StrategyStatus.SOLVING; + const re7PoolID = + '2345856225134458665876812536882617294246962319062565703131100435311373119841'; + const xSTRKPool = pools.find((p) => p.pool.id == `Vesu_${re7PoolID}_xSTRK`); + const STRKPool = pools.find((p) => p.pool.id == `Vesu_${re7PoolID}_STRK`); + const endurXSTRK = pools.find((p) => p.pool.id == 'endur_strk'); + + this.actions = this.getSteps().map((step) => { + return { + name: step.name, + amount: '0', + isDeposit: step.name.includes('Borrow') ? false : true, + pool: getDefaultPoolInfo(), + }; }); - const excessFactor = this.stepAmountFactors[actions.length]; - const amount1 = excessFactor * full_amount; - const exp1 = amount1 * this.actions[0].pool.apr; - const amount2 = this.stepAmountFactors[1] * amount1; - const exp2 = amount2 * this.actions[1].pool.apr; - const amount3 = this.stepAmountFactors[2] * amount2; - const exp3 = -amount3 * this.actions[2].pool.borrow.apr; - const effecitveAmount = amount1 - amount3; - const effectiveAPR = (exp1 + exp2 + exp3) / effecitveAmount; - const pool: PoolInfo = { ...eligiblePools[0] }; - pool.apr = effectiveAPR; - const strategyAction: StrategyAction = { - pool, - amount: effecitveAmount.toString(), - isDeposit: true, - }; - console.log( - 'getLookRepeatYieldAmount exp1', - this.id, - exp1, - full_amount, - exp2, - amount2, - this.actions[2], - this.actions[1], - exp3, - amount1, - amount3, + + const fee = this.fee_factor; + let STRKRewardsAPR = + xSTRKPool?.aprSplits.find((a) => a.title == 'STRK rewards')?.apr || 0; + STRKRewardsAPR = STRKRewardsAPR == 'Err' ? 0 : STRKRewardsAPR; + const collateralAPY = (xSTRKPool?.apr || 0) + (endurXSTRK?.apr || 0); + const feeAdjustedColAPY = collateralAPY - STRKRewardsAPR * this.fee_factor; + const borrowAPY = STRKPool?.borrow.apr || 0; + + const { + collateralXSTRK, + collateralUSDValue, + debtSTRK, + debtUSDValue, + xSTRKPrice, + } = await this.getPositionInfo(); + + const PAYOFF = + Number(collateralUSDValue.toEtherToFixedDecimals(6)) * feeAdjustedColAPY - + Number(debtUSDValue.toEtherStr()) * borrowAPY; + const investment = + Number(collateralUSDValue.toEtherToFixedDecimals(6)) - + Number(debtUSDValue.toEtherStr()); + this.netYield = investment == 0 ? 0 : PAYOFF / investment; + } + + async getPositionInfo() { + const resp = await fetch( + `${getEndpoint()}/vesu/positions?walletAddress=${this.strategyAddress}`, ); - return [...actions, strategyAction]; + const data = await resp.json(); + if (!data.data || data.data.length == 0) { + throw new Error('No positions found'); + } + + const collateralXSTRK = new MyNumber( + data.data[0].collateral.value, + data.data[0].collateral.decimals, + ); + const collateralUSDValue = new MyNumber( + data.data[0].collateral.usdPrice.value, + data.data[0].collateral.usdPrice.decimals, + ); + const debtSTRK = new MyNumber( + data.data[0].debt.value, + data.data[0].debt.decimals, + ); + const debtUSDValue = new MyNumber( + data.data[0].debt.usdPrice.value, + data.data[0].debt.usdPrice.decimals, + ); + + const xSTRKPrice = await this.getXSTRKPrice(); + const collateralInSTRK = + Number(collateralXSTRK.toEtherToFixedDecimals(6)) * xSTRKPrice; + const STRKUSDPrice = + Number(debtUSDValue.toEtherToFixedDecimals(6)) / + Number(debtSTRK.toEtherToFixedDecimals(6)); + const actualCollateralUSDValue = collateralInSTRK * STRKUSDPrice; + + return { + collateralXSTRK, + collateralUSDValue: MyNumber.fromEther( + actualCollateralUSDValue.toFixed(6), + collateralUSDValue.decimals, + ), + debtSTRK, + debtUSDValue, + xSTRKPrice, + collateralInSTRK, + }; } getTVL = async (): Promise => { if (!this.isLive()) return ZeroAmountsInfo([this.token]); try { - const resp = await fetch( - `${getEndpoint()}/vesu/positions?walletAddress=${this.strategyAddress}`, - ); - const data = await resp.json(); - if (!data.data || data.data.length == 0) { - throw new Error('No positions found'); - } - const collateralXSTRK = new MyNumber( - data.data[0].collateral.value, - data.data[0].collateral.decimals, - ); - const collateralUSDValue = new MyNumber( - data.data[0].collateral.usdPrice.value, - data.data[0].collateral.usdPrice.decimals, - ); - const debtSTRK = new MyNumber( - data.data[0].debt.value, - data.data[0].debt.decimals, - ); - const debtUSDValue = new MyNumber( - data.data[0].debt.usdPrice.value, - data.data[0].debt.usdPrice.decimals, - ); - const xSTRKPrice = await this.getXSTRKPrice(); - const collateralInSTRK = - Number(collateralXSTRK.toEtherToFixedDecimals(6)) * xSTRKPrice; + const { + collateralXSTRK, + collateralUSDValue, + debtSTRK, + debtUSDValue, + xSTRKPrice, + collateralInSTRK, + } = await this.getPositionInfo(); + const usdValue = - Number(collateralUSDValue.toEtherStr()) - + Number(collateralUSDValue.toEtherToFixedDecimals(6)) - Number(debtUSDValue.toEtherStr()); + return { usdValue, amounts: [ @@ -254,7 +269,7 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM { ( collateralInSTRK - Number(debtSTRK.toEtherToFixedDecimals(6)) ).toFixed(6), - data.data[0].collateral.decimals, + collateralXSTRK.decimals, ), usdValue, tokenInfo: convertToV2TokenInfo(this.token), From 5a5b7f4a0178ca9e6a783967153f6e135f8a9313 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Sun, 10 Aug 2025 14:27:50 +0530 Subject: [PATCH 10/48] update sensei - confirmation, faqs, etc --- package.json | 2 +- src/app/api/price/[name]/route.ts | 2 +- .../[strategyId]/_components/DetailsTab.tsx | 13 +- src/components/ConfirmationDialog.tsx | 94 ++++ src/components/Deposit.tsx | 5 +- src/components/TxButton.tsx | 46 +- src/store/strategies.atoms.tsx | 40 +- src/strategies/IStrategy.ts | 33 +- src/strategies/delta_neutral_mm.ts | 31 +- src/strategies/delta_neutral_mm_vesu_endur.ts | 453 ++++++++---------- yarn.lock | 116 ++--- 11 files changed, 489 insertions(+), 346 deletions(-) create mode 100644 src/components/ConfirmationDialog.tsx diff --git a/package.json b/package.json index b1bc4ece..df981dfa 100755 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "3.0.0", "@starknet-react/core": "3.0.1", - "@strkfarm/sdk": "^1.0.51", + "@strkfarm/sdk": "1.0.55", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/src/app/api/price/[name]/route.ts b/src/app/api/price/[name]/route.ts index 0daaf8d7..fd103ece 100644 --- a/src/app/api/price/[name]/route.ts +++ b/src/app/api/price/[name]/route.ts @@ -9,7 +9,7 @@ async function initRedis() { try { console.log('initRedis server'); // eslint-disable-next-line - const config = getMainnetConfig(); + const config = getMainnetConfig(process.env.RPC_URL!, 'pending'); const pricer = new PricerRedis(config, []); if (!process.env.REDIS_URL) { console.warn('REDIS_URL not set'); diff --git a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx index 585ed04c..583e10e4 100644 --- a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx +++ b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx @@ -29,6 +29,16 @@ export function DetailsTab(props: DetailsTabProps) { return []; }, [strategyAPIResult.actions, strategy.metadata.investmentSteps]); + function isDeposit(action: string) { + return ( + action.toLowerCase().includes('stake') || + action.toLowerCase().includes('supply') || + action.toLowerCase().includes('deposit') || + action.toLowerCase().includes('invest') || + action.toLowerCase().includes('buy') + ); + } + return ( @@ -54,8 +64,7 @@ export function DetailsTab(props: DetailsTabProps) { borderRadius={'8px'} padding={'10px'} > - {action.toLowerCase().includes('stake') || - action.toLowerCase().includes('supply') ? ( + {isDeposit(action) ? ( ) : action.toLowerCase().includes('borrow') ? ( diff --git a/src/components/ConfirmationDialog.tsx b/src/components/ConfirmationDialog.tsx new file mode 100644 index 00000000..6edb3de2 --- /dev/null +++ b/src/components/ConfirmationDialog.tsx @@ -0,0 +1,94 @@ +import { + Modal, + ModalOverlay, + ModalContent, + ModalCloseButton, + ModalBody, + Text, + Box, + useDisclosure, + Button, + List, + ListItem, +} from '@chakra-ui/react'; +import React, { forwardRef, useImperativeHandle } from 'react'; + +export interface ConfirmationDialogProps { + content: React.ReactNode | string[]; + onConfirm: () => void; + onCancel: () => void; +} + +const ConfirmationDialog = forwardRef(function ConfirmationDialog( + props: ConfirmationDialogProps, + ref, +) { + const { isOpen, onOpen, onClose } = useDisclosure(); + + const handleTrigger = () => { + onOpen(); + }; + + // Expose this function to parent via ref + useImperativeHandle(ref, () => ({ + handleTrigger: () => handleTrigger(), + })); + + return ( + + + + + + + Please confirm your action. + + {Array.isArray(props.content) ? ( + + {props.content.map((content, index) => ( + + {index + 1}. {content} + + ))} + + ) : ( + + {props.content} + + )} + + + + + + + + ); +}); + +export default ConfirmationDialog; diff --git a/src/components/Deposit.tsx b/src/components/Deposit.tsx index c48d1557..93883d54 100755 --- a/src/components/Deposit.tsx +++ b/src/components/Deposit.tsx @@ -279,10 +279,10 @@ function InternalDeposit(props: DepositProps) { }, [props]); // constructs tx calls - const { calls } = useMemo(() => { + const { calls, onClickConfirmationPopup } = useMemo(() => { const hook = callsInfo[depositInfo.actionIndex]; if (!hook) return { calls: [] }; - return { calls: hook.calls }; + return { calls: hook.calls, onClickConfirmationPopup: hook.onClickButton }; }, [address, provider, isMaxClicked, callsInfo, depositInfo]); const tvlInfo = useAtomValue(props.strategy.tvlAtom); @@ -369,6 +369,7 @@ function InternalDeposit(props: DepositProps) { } }); }} + onClickConfirmationPopup={onClickConfirmationPopup} /> diff --git a/src/components/TxButton.tsx b/src/components/TxButton.tsx index 803650e5..660665c9 100755 --- a/src/components/TxButton.tsx +++ b/src/components/TxButton.tsx @@ -23,9 +23,11 @@ import { import { useAccount, useSendTransaction } from '@starknet-react/core'; import { useAtomValue, useSetAtom } from 'jotai'; import mixpanel from 'mixpanel-browser'; -import { useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import { TwitterShareButton } from 'react-share'; import { Call } from 'starknet'; +import ConfirmationDialog from './ConfirmationDialog'; +import MyNumber from '@/utils/MyNumber'; interface TxButtonProps { txInfo: StrategyTxProps; @@ -37,6 +39,9 @@ interface TxButtonProps { selectedMarket?: TokenInfo; strategy?: IStrategyProps; resetDepositForm: () => void; + onClickConfirmationPopup?: ( + amount: MyNumber, + ) => Promise; } export default function TxButton(props: TxButtonProps) { @@ -123,7 +128,36 @@ export default function TxButton(props: TxButtonProps) { return strategiesList.find((s: any) => s.id === props.strategy?.id); }, [strategiesInfo, props.strategy?.id]); + // Type the ref to match ConfirmationDialog's handleTrigger method + type ConfirmationDialogRef = { handleTrigger: () => void }; + const buttonRef = useRef(null); + const loading = ( + + Loading... + + ); + const [popupContent, setPopupContent] = useState( + loading, + ); + + async function preHandleButton() { + if (props.onClickConfirmationPopup && buttonRef.current) { + buttonRef.current.handleTrigger(); + try { + const res = await props.onClickConfirmationPopup(props.txInfo.amount); + setPopupContent(res); + } catch (error) { + setPopupContent( + Something went wrong. Please try again later., + ); + } + } else { + handleButton(); + } + } + async function handleButton() { + setPopupContent(loading); writeAsync().then((tx) => { if (props.buttonText === 'Deposit') onOpen(); mixpanel.track('Submitted tx', { @@ -229,6 +263,14 @@ export default function TxButton(props: TxButtonProps) { + { + setPopupContent(loading); + }} + />