- Claim your amount
+ Claim your amount
here
@@ -298,7 +299,7 @@ export default function Recovery() {
will be distributed to the affected users in a similar way after few
weeks. The details of the same will be announced on our{' '}
X page
@@ -312,12 +313,12 @@ export default function Recovery() {
{(!isLoading || !address) && (
-
+
| Amount |
-
+
|
|
-
+
|
|
-
+
|
- https://www.strkfarm.com/
+ https://www.troves.fi/
2025-02-14T13:00:00+01:00
monthly
1.0
- https://app.strkfarm.com/
+ https://app.troves.fi/
2025-02-14T13:00:00+01:00
weekly
0.8
- https://app.strkfarm.com/community
+ https://app.troves.fi/community
2025-02-14T13:00:00+01:00
weekly
0.6
diff --git a/src/app/strategy/[strategyId]/_components/DetailsTab.tsx b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx
new file mode 100644
index 00000000..585ed04c
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/DetailsTab.tsx
@@ -0,0 +1,100 @@
+import { Box, Center, Spinner, Flex, Text, Image } 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 { useMemo } from 'react';
+import { StrategyInfo } from '@/store/strategies.atoms';
+
+interface DetailsTabProps {
+ strategy: StrategyInfo;
+ strategyAPIResult: TrovesStrategyAPIResult;
+ isMobile?: boolean;
+}
+
+export function DetailsTab(props: DetailsTabProps) {
+ const { strategy, strategyAPIResult, isMobile } = props;
+
+ const steps = useMemo(() => {
+ if (strategyAPIResult.actions.length > 0) {
+ const res: string[] = strategyAPIResult.actions
+ .filter((action) => action.name != undefined) // Filter out empty action names
+ .map((action) => action.name);
+ return res;
+ }
+ if (strategy.metadata.investmentSteps.length > 0) {
+ return strategy.metadata.investmentSteps;
+ }
+ return [];
+ }, [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 && (
+
+
+
+ )}
+ >
+
+ )}
+
+ {strategyAPIResult.investmentFlows.length > 0 && (
+
+
+ Configuration
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/strategy/[strategyId]/_components/FAQTab.tsx b/src/app/strategy/[strategyId]/_components/FAQTab.tsx
new file mode 100644
index 00000000..f252ef89
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/FAQTab.tsx
@@ -0,0 +1,139 @@
+import {
+ Box,
+ Flex,
+ Text,
+ AccordionPanel,
+ AccordionButton,
+ Accordion,
+ AccordionItem,
+ AccordionIcon,
+ Button,
+ Link,
+} from '@chakra-ui/react';
+import { StrategyInfo } from '@/store/strategies.atoms';
+import CONSTANTS from '@/constants';
+
+interface FAQTabProps {
+ strategy: StrategyInfo;
+ isMobile?: boolean;
+}
+
+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}
+
+
+ ))}
+
+
+
+
+
+
+ For more queries reach out to us on Telegram
+
+
+ Our team will respond to you soon!
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/strategy/[strategyId]/_components/FlowChart.tsx b/src/app/strategy/[strategyId]/_components/FlowChart.tsx
index 5813026c..57113945 100644
--- a/src/app/strategy/[strategyId]/_components/FlowChart.tsx
+++ b/src/app/strategy/[strategyId]/_components/FlowChart.tsx
@@ -7,18 +7,16 @@ import {
useNodesState,
} from '@xyflow/react';
import Dagre from '@dagrejs/dagre';
-import STRKFarmAtoms, {
- STRKFarmStrategyAPIResult,
-} from '@/store/strkfarm.atoms';
+import TrovesAtoms, { TrovesStrategyAPIResult } from '@/store/troves.atoms';
import '@xyflow/react/dist/style.css';
import { IInvestmentFlow } from '@strkfarm/sdk';
import { useAtomValue } from 'jotai';
-import { Spinner } from '@chakra-ui/react';
+import { Spinner, Box } from '@chakra-ui/react';
// import ELK from 'elkjs/lib/elk.bundled.js';
const boxStyle = {
- background: 'var(--chakra-colors-bg)',
+ background: 'var(--chakra-colors-mybg)',
opacity: 0.9,
color: 'white',
padding: '10px',
@@ -227,10 +225,10 @@ function getNodesAndEdges(
}
function InternalFlowChart(props: FlowChartProps) {
- const strategiesInfo = useAtomValue(STRKFarmAtoms.baseAPRs!);
+ const strategiesInfo = useAtomValue(TrovesAtoms.baseAPRs!);
const strategyCached = useMemo(() => {
if (!strategiesInfo || !strategiesInfo.data) return null;
- const strategiesList: STRKFarmStrategyAPIResult[] =
+ const strategiesList: TrovesStrategyAPIResult[] =
strategiesInfo.data.strategies;
return strategiesList.find((s: any) => s.id === props.strategyId);
}, [strategiesInfo]);
@@ -260,7 +258,7 @@ function InternalFlowChart(props: FlowChartProps) {
if (strategyCached && strategyCached.investmentFlows.length > 0)
return (
-
+
-
+
);
return (
-
+
-
+
);
}
diff --git a/src/app/strategy/[strategyId]/_components/ManageTab.tsx b/src/app/strategy/[strategyId]/_components/ManageTab.tsx
new file mode 100644
index 00000000..ff40fb83
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/ManageTab.tsx
@@ -0,0 +1,96 @@
+import { Box, Flex, Text } from '@chakra-ui/react';
+import React from 'react';
+
+import { StrategyInfo } from '@/store/strategies.atoms';
+import { TokenDeposit } from './TokenDeposit';
+import { ContractDetails } from '@/components/ContractDetails';
+
+interface ManageTabProps {
+ strategy: StrategyInfo;
+ isMobile?: boolean;
+}
+
+export function ManageTab(props: ManageTabProps) {
+ const { strategy, isMobile } = props;
+
+ return (
+
+
+
+ How does it work?
+
+ {/*
+
+ Deposit USDC to automatically loop funds between zkLend and Nostra.
+
+
+ Creates a delta-neutral position to maximize USDC yield.
+
+
+ Position is periodically adjusted to maintain a healthy health
+ factor
+
+
+ Receive an NFT as representation for your stake on Troves.
+
+ Withdraw anytime by redeeming your NFT for USDC.
+ */}
+
+ {strategy.description}
+
+
+
+ {/*
+
+ Risks
+
+
+ {strategy.metadata.risk.riskFactor.map((r: any, i: number) => (
+
+
+ {r.type.valueOf()}
+
+
+ ))}
+
+ */}
+
+
+
+ {!strategy ||
+ (strategy.isSingleTokenDepositView && (
+
+ ))}
+ {strategy && !strategy.isSingleTokenDepositView && (
+
+ )}
+
+
+ );
+}
diff --git a/src/app/strategy/[strategyId]/_components/RiskTab.tsx b/src/app/strategy/[strategyId]/_components/RiskTab.tsx
new file mode 100644
index 00000000..59e391c2
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/RiskTab.tsx
@@ -0,0 +1,173 @@
+import {
+ Badge,
+ Box,
+ Flex,
+ ListItem,
+ OrderedList,
+ Text,
+ Tooltip,
+} from '@chakra-ui/react';
+import { StrategyInfo } from '@/store/strategies.atoms';
+import { getRiskColor, getRiskExplaination, RiskFactor } from '@strkfarm/sdk';
+import { useMemo } from 'react';
+import { MYSTYLES } from '@/style';
+import { getRiskString } from '@/strategies/IStrategy';
+
+interface RiskTabProps {
+ strategy: StrategyInfo;
+ isMobile?: boolean;
+}
+
+export function RiskTab(props: RiskTabProps) {
+ const { strategy, isMobile } = props;
+
+ function getToolTip(risk: RiskFactor) {
+ return (
+
+
+ Definition: {getRiskExplaination(risk.type)}
+
+ {risk.reason && (
+
+ Justification: {risk.reason}
+
+ )}
+
+ );
+ }
+
+ const risks = useMemo(() => {
+ const _risks = strategy.metadata.risk.riskFactor.map((risk) => ({
+ type: risk.type.toLowerCase(),
+ value: risk.value,
+ color: getRiskColor(risk),
+ toolTip: getToolTip(risk),
+ }));
+ const noRisks = strategy.metadata.risk.notARisks.map((risk) => ({
+ type: risk.toLowerCase(),
+ value: 0,
+ color: 'text_secondary',
+ toolTip: getToolTip({
+ type: risk,
+ value: 0,
+ weight: 0,
+ reason: 'This risk is not applicable to this strategy.',
+ }),
+ }));
+ return [..._risks, ...noRisks];
+ }, [strategy.metadata.risk.riskFactor, strategy.metadata.risk.notARisks]);
+
+ return (
+
+ {risks.length > 0 && (
+
+
+ Risk Assessment
+
+
+ {risks.map((risk, index) => (
+
+
+ {risk.type}: {getRiskString(risk.value)}
+
+
+ ))}
+
+
+ )}
+
+
+ Risk details
+
+
+
+ {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 04f31ada..bd13ffc8 100755
--- a/src/app/strategy/[strategyId]/_components/Strategy.tsx
+++ b/src/app/strategy/[strategyId]/_components/Strategy.tsx
@@ -1,60 +1,242 @@
'use client';
+import { ArrowBackIcon } from '@chakra-ui/icons';
import {
- Alert,
- AlertIcon,
- Avatar,
- AvatarGroup,
- Badge,
+ Accordion,
+ AccordionButton,
+ AccordionIcon,
+ AccordionItem,
+ AccordionPanel,
Box,
- Card,
- Center,
+ Button,
+ Container,
Flex,
- Grid,
- GridItem,
- HStack,
Link,
- ListItem,
- OrderedList,
Spinner,
+ Stack,
+ Tab,
+ TabIndicator,
+ TabList,
+ TabPanel,
+ TabPanels,
+ Tabs,
Text,
Tooltip,
VStack,
- Wrap,
- WrapItem,
} from '@chakra-ui/react';
import { atom, useAtomValue, useSetAtom } from 'jotai';
import mixpanel from 'mixpanel-browser';
+import { useRouter, useSearchParams } from 'next/navigation';
import { useCallback, useEffect, useMemo, useState } from 'react';
+import { APYInfo } from '@/components/APYInfo';
import HarvestTime from '@/components/HarvestTime';
+import { useIsMobile } from '@/hooks/use-mobile';
import { DUMMY_BAL_ATOM, returnEmptyBal } from '@/store/balance.atoms';
import { addressAtom } from '@/store/claims.atoms';
import { strategiesAtom, StrategyInfo } from '@/store/strategies.atoms';
import { TxHistoryAtom } from '@/store/transactions.atom';
import {
- capitalize,
- getTokenInfoFromAddr,
- getUniqueById,
- shortAddress,
- timeAgo,
-} from '@/utils';
+ TrovesBaseAPYsAtom,
+ TrovesStrategyAPIResult,
+} from '@/store/troves.atoms';
+import { MYSTYLES } from '@/style';
+import { getTokenInfoFromAddr } from '@/utils';
import MyNumber from '@/utils/MyNumber';
-import { ExternalLinkIcon } from '@chakra-ui/icons';
import { StrategyParams } from '../page';
-import FlowChart from './FlowChart';
-import { isMobile } from 'react-device-detect';
-import { getRiskExplaination } from '@strkfarm/sdk';
-import {
- STRKFarmBaseAPYsAtom,
- STRKFarmStrategyAPIResult,
-} from '@/store/strkfarm.atoms';
-import { TokenDeposit } from './TokenDeposit';
+import { DetailsTab } from './DetailsTab';
+import { FAQTab } from './FAQTab';
+import { ManageTab } from './ManageTab';
+import { RiskTab } from './RiskTab';
+import { StrategyInfoComponent } from './StrategyInfo';
+import { TransactionsTab } from './TransactionsTab';
+
+function HoldingsText({
+ strategy,
+ address,
+ balData,
+}: {
+ strategy: StrategyInfo;
+ address: string | undefined;
+ balData: any;
+}) {
+ if (strategy.settings.isInMaintenance)
+ return Maintenance Mode;
+ if (!address)
+ return You will see your holdings here;
+ if (balData.isLoading || !balData.data?.tokenInfo) {
+ return (
+ <>
+
+ >
+ );
+ }
+ if (balData.isError) {
+ console.error('Balance data error:', balData.error);
+ return 'Error';
+ }
+ const value = Number(
+ balData.data.amount.toEtherToFixedDecimals(
+ balData.data.tokenInfo?.displayDecimals || 2,
+ ),
+ );
+ if (value === 0 || strategy?.isRetired()) return '-';
+ return `${balData.data.amount.toEtherToFixedDecimals(
+ balData.data.tokenInfo?.displayDecimals || 2,
+ )} ${balData.data.tokenInfo?.name}`;
+}
+
+function NetEarningsText({
+ strategy,
+ address,
+ profit,
+ balData,
+}: {
+ strategy: StrategyInfo;
+ address: string | undefined;
+ profit: number;
+ balData: any;
+}) {
+ if (
+ !address ||
+ profit === 0 ||
+ strategy?.isRetired() ||
+ strategy.settings.isInMaintenance
+ )
+ return '-';
+ return `${profit?.toFixed(
+ balData.data.tokenInfo?.displayDecimals || 2,
+ )} ${balData.data.tokenInfo?.name}`;
+}
+
+function HoldingsAndEarnings({
+ strategy,
+ address,
+ balData,
+ profit,
+}: {
+ strategy: StrategyInfo;
+ address: string | undefined;
+ balData: any;
+ profit: number;
+}) {
+ return (
+
+
+
+ Your Holdings
+
+
+
+
+
+ {!strategy.settings.isTransactionHistDisabled && (
+
+
+
+ Net earnings
+
+ 0
+ ? 'light_green_2'
+ : 'red'
+ }
+ >
+
+
+
+
+ )}
+
+ );
+}
const Strategy = ({ params }: StrategyParams) => {
const address = useAtomValue(addressAtom);
const strategies = useAtomValue(strategiesAtom);
const [isMounted, setIsMounted] = useState(false);
+ const router = useRouter();
+ const searchParams = useSearchParams();
+ const [tabIndex, setTabIndex] = useState(0);
+ const [accordionIndex, setAccordionIndex] = useState(0);
+
+ function setRoute(value: string) {
+ router.push(`?tab=${value}`);
+ }
+
+ function handleTabsChange(index: number) {
+ switch (index) {
+ case 0:
+ setRoute('manage');
+ break;
+ case 1:
+ setRoute('details');
+ break;
+ case 2:
+ setRoute('risks');
+ break;
+ case 3:
+ setRoute('faq');
+ break;
+ case 4:
+ setRoute('transactions');
+ break;
+ default:
+ setRoute('manage');
+ break;
+ }
+ }
+
+ useEffect(() => {
+ mixpanel.track('Page open');
+ }, []);
+
+ useEffect(() => {
+ (async () => {
+ const tab = searchParams.get('tab');
+
+ switch (tab) {
+ case 'manage':
+ setTabIndex(0);
+ break;
+ case 'details':
+ setTabIndex(1);
+ break;
+ case 'risks':
+ setTabIndex(2);
+ break;
+ case 'faq':
+ setTabIndex(3);
+ break;
+ case 'transactions':
+ setTabIndex(4);
+ break;
+ default:
+ setTabIndex(0);
+ break;
+ }
+ })();
+ }, [searchParams]);
const strategy: StrategyInfo | undefined = useMemo(() => {
const id = params.strategyId;
@@ -80,8 +262,8 @@ const Strategy = ({ params }: StrategyParams) => {
const individualBalances = useAtomValue(
strategy?.balancesAtom || atom([returnEmptyBal()]),
);
+ console.log('balData', balData);
- // fetch tx history
const txHistoryAtom = useMemo(
() => TxHistoryAtom(strategyAddress, address!),
[address, strategyAddress],
@@ -107,10 +289,6 @@ const Strategy = ({ params }: StrategyParams) => {
return txHistoryResult.data || { findManyInvestment_flows: [] };
}, [JSON.stringify(txHistoryResult.data)]);
- // compute profit
- // profit doesnt change quickly in real time, but total deposit amount can change
- // and it can impact the profit calc as txHistory may not be updated at the same time as balData
- // So, we compute profit once only
const [profit, setProfit] = useState(0);
const computeProfit = useCallback(() => {
if (!txHistory.findManyInvestment_flows.length) return 0;
@@ -152,538 +330,284 @@ const Strategy = ({ params }: StrategyParams) => {
const colSpan1: any = { base: '5', md: '3' };
const colSpan2: any = { base: '5', md: '2' };
+ const isMobile = useIsMobile();
+
useEffect(() => {
setIsMounted(true);
}, []);
- const strategiesInfo = useAtomValue(STRKFarmBaseAPYsAtom);
+ const strategiesInfo = useAtomValue(TrovesBaseAPYsAtom);
const strategyCached = useMemo(() => {
if (!strategiesInfo || !strategiesInfo.data) return null;
- const strategiesList: STRKFarmStrategyAPIResult[] =
+ const strategiesList: TrovesStrategyAPIResult[] =
strategiesInfo.data.strategies;
return strategiesList.find((s: any) => s.id === params.strategyId);
}, [strategiesInfo, params.strategyId]);
if (!isMounted) return null;
+ function getUniqueById(items: { id: string; logo: string }[]) {
+ const uniqueItems = new Map();
+ items.forEach((item) => {
+ if (!uniqueItems.has(item.id)) {
+ uniqueItems.set(item.id, item);
+ }
+ });
+ return Array.from(uniqueItems.values());
+ }
+
return (
- <>
-
-
- {strategy &&
- strategy.metadata.depositTokens.length > 0 &&
- strategy.metadata.depositTokens.map((token: any) => {
- return (
-
- );
- })}
- {strategy && strategy.metadata.depositTokens.length == 0 && (
-
- )}
-
-
+
+
+
+ }
+ _hover={{
+ bg: 'transparent',
+ color: 'white',
+ }}
+ >
+ Back
+
+
+
+
- {strategy ? strategy.name : 'Strategy Not found'}
-
-
-
- {strategy && (
-
-
-
-
- {!strategy?.isRetired() && (
-
- )}
-
-
-
- How does it work?
-
-
- {strategy.description}
-
-
- {getUniqueById(
- strategy.actions.map((p) => ({
- id: p.pool.protocol.name,
- logo: p.pool.protocol.logo,
- })),
- ).map((p) => (
-
-
-
- {p.id}
-
-
- ))}
-
-
-
+ {strategy && (
+
+
+ {!strategy?.isRetired() && strategyCached && (
- {!balData.isLoading &&
- !balData.isError &&
- !balData.isPending &&
- balData.data &&
- balData.data.tokenInfo && (
-
-
-
- Your Holdings
-
-
- {address
- ? Number(
- balData.data.amount.toEtherToFixedDecimals(
- balData.data.tokenInfo?.displayDecimals ||
- 2,
- ),
- ) === 0 || strategy?.isRetired()
- ? '-'
- : `${balData.data.amount.toEtherToFixedDecimals(balData.data.tokenInfo?.displayDecimals || 2)} ${balData.data.tokenInfo?.name}`
- : 'Connect wallet'}
-
-
- {!strategy.settings.isTransactionHistDisabled && (
-
-
-
- Net earnings
-
- = 0 ? 'cyan' : 'red'}
- >
- {address &&
- profit !== 0 &&
- !strategy?.isRetired()
- ? `${profit?.toFixed(balData.data.tokenInfo?.displayDecimals || 2)} ${balData.data.tokenInfo?.name}`
- : '-'}
-
-
-
- )}
-
- )}
- {(balData.isLoading || !balData.data?.tokenInfo) && (
-
- Your Holdings:
- {address ? (
-
- ) : (
- 'Connect wallet'
- )}
-
- )}
- {balData.isError && (
-
- Your Holdings: Error
-
- )}
-
- {/* Show individual holdings is more tokens */}
- {individualBalances.length > 1 &&
- balData.data?.amount.compare('0', 'gt') && (
-
-
- Detailed Split:
- {individualBalances.map((bx, index) => {
- return (
-
- {bx?.amount.toEtherToFixedDecimals(
- bx.tokenInfo?.displayDecimals || 2,
- )}{' '}
- {bx?.tokenInfo?.name}
-
- );
- })}
-
-
- )}
-
- {address &&
- balData.data &&
- strategy.id == 'xstrk_sensei' &&
- profit < 0 &&
- profit /
- Number(balData.data.amount.toEtherToFixedDecimals(6)) <
- -0.01 && (
-
-
- Why did my holdings drop?{' '}
-
- Learn more
-
-
- )}
+
- {strategy?.isRetired() && (
-
-
-
-
- This strategy is retired due to zkLend exploit. You can
- recover your partial funds from{' '}
-
- here.
-
-
-
- )}
-
-
-
-
- {!strategy ||
- (strategy.isSingleTokenDepositView && (
-
- ))}
- {strategy && !strategy.isSingleTokenDepositView && (
-
- )}
-
-
-
- {!isMobile && (
-
-
- Behind the scenes
-
-
- Actions done automatically by the strategy (smart-contract) with
- an investment of $1000
-
- {strategy.steps.length > 0 && (
-
-
-
- Action
-
-
- Protocol
-
-
- Amount
-
-
- Yield
-
-
- {strategyCached &&
- strategyCached.actions.map((action, index) => (
-
-
- {index + 1}
- {')'} {action.name}
-
-
- {' '}
- {action.token.name} on
- {' '}
- {action.protocol.name}
-
-
- ${Number(action.amount).toLocaleString()} yields{' '}
- {(action.apy * 100).toFixed(2)}%
-
-
- ${Number(action.amount).toLocaleString()}
-
-
- {(action.apy * 100).toFixed(2)}%
-
-
- ))}
- {(!strategyCached || strategyCached.actions.length == 0) && (
-
-
-
- )}
-
)}
-
-
+
+ )}
+
+ {strategy && (
+
+
+
+
)}
-
-
- {/* Risks card */}
-
+
+ {!isMobile && (
+
+
+ {
+ mixpanel.track('Manage clicked');
+ }}
>
-
- Risks
-
-
- {strategy.risks.map((r) => (
-
- {r}
-
- ))}
-
-
- {strategy.metadata.risk.riskFactor.map(
- (r: any, i: number) => (
-
-
- {r.type.valueOf()}
-
-
- ),
- )}
-
-
-
-
- {/* Transaction history card */}
-
+ {
+ mixpanel.track('Details clicked');
+ }}
>
-
- Transaction history
-
- {!strategy.settings.isTransactionHistDisabled && (
-
- There may be delays fetching data. If your transaction{' '}
- {`isn't`} found, try again later.
-
+ Details
+
+ {
+ mixpanel.track('Risk clicked');
+ }}
+ >
+ Risks
+
+ {
+ mixpanel.track('FAQs clicked');
+ }}
+ >
+ FAQs
+
+ {
+ mixpanel.track('Transactions clicked');
+ }}
+ >
+ Transactions
+
+
+
+
+
+ {strategy && }
+
+
+ {strategyCached && strategy && (
+
)}
+
+
+ {strategy && }
+
+
+
+ {strategy && }
+
- {txHistoryResult.isSuccess && (
- <>
- {txHistory.findManyInvestment_flows.map((tx, index) => {
- const token = getTokenInfoFromAddr(tx.asset);
- const decimals = token?.decimals;
-
- return (
-
-
- {index + 1}.
-
-
- {Number(
- new MyNumber(
- tx.amount,
- decimals!,
- ).toEtherToFixedDecimals(
- token.displayDecimals,
- ),
- ).toLocaleString()}{' '}
- {token?.name}
-
-
- {capitalize(tx.type)}
-
-
-
-
-
-
- {shortAddress(tx.txHash)}
-
-
-
- {/* The default msg contains strategy name, since this for a specific strategy, replace it */}
- {timeAgo(new Date(tx.timestamp * 1000))}
-
-
-
-
- );
- })}
- >
+
+ {strategy && (
+
)}
+
+
+
+ )}
- {/* If no filtered tx */}
- {!strategy.settings.isTransactionHistDisabled &&
- txHistory.findManyInvestment_flows.length === 0 && (
-
- No transactions found
-
- )}
- {strategy.settings.isTransactionHistDisabled && (
-
+ {
+ 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) => (
+
- Transaction history is not available for this strategy yet.
- If enabled in future, will include the entire history.
-
- )}
-
-
-
-
- )}
- >
+
+
+ {item.label}
+
+
+
+
+ {item.content}
+
+
+ ))}
+
+
+ )}
+
+
);
};
diff --git a/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx
new file mode 100644
index 00000000..bdf5f3de
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/StrategyInfo.tsx
@@ -0,0 +1,70 @@
+import {
+ Avatar,
+ AvatarGroup,
+ Box,
+ Flex,
+ Image,
+ Link,
+ Text,
+ Tooltip,
+} from '@chakra-ui/react';
+import shield from '@/assets/shield.svg';
+import { StrategyInfo } from '@/store/strategies.atoms';
+
+export function StrategyInfoComponent(props: { strategy: StrategyInfo }) {
+ const { strategy } = props;
+ return (
+
+
+ {strategy &&
+ strategy.metadata.depositTokens.length > 0 &&
+ strategy.metadata.depositTokens.map((token: any) => {
+ return (
+
+ );
+ })}
+ {strategy && strategy.metadata.depositTokens.length == 0 && (
+
+ )}
+
+
+ {strategy ? strategy.name : 'Strategy Not found'}
+
+ {strategy.metadata.auditUrl && (
+ Audited. Click to view report.}>
+
+
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx b/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx
index 4319b924..4f7af8e6 100644
--- a/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx
+++ b/src/app/strategy/[strategyId]/_components/TokenDeposit.tsx
@@ -3,9 +3,7 @@ import { StrategyInfo } from '@/store/strategies.atoms';
import {
Alert,
AlertIcon,
- Card,
Tab,
- TabIndicator,
TabList,
TabPanel,
TabPanels,
@@ -23,119 +21,118 @@ export function TokenDeposit(props: TokenDepositProps) {
const [tabIndex, setTabIndex] = useState(0);
const { strategy } = props;
return (
-
- {
- setTabIndex(index);
- }}
- >
-
- {
- // mixpanel.track('All pools clicked')
- }}
- >
- Deposit
-
- {
- // mixpanel.track('Strategies opened')
- }}
- >
- Withdraw
-
-
-
-
-
- {tabIndex == 0 && (
- <>
-
- {strategy.settings.alerts != undefined && (
-
- {strategy.settings.alerts
- .filter((a) => a.tab == 'deposit' || a.tab == 'all')
- .map((alert, index) => (
-
-
- {alert.text}
-
- ))}
-
- )}
- >
- )}
-
-
- {tabIndex == 1 && (
- <>
-
- {strategy.settings.alerts != undefined && (
-
- {strategy.settings.alerts
- .filter((a) => a.tab == 'withdraw' || a.tab == 'all')
- .map((alert, index) => (
-
-
- {alert.text}
-
- ))}
-
- )}
- >
- )}
-
-
-
-
+ {
+ setTabIndex(index);
+ }}
+ >
+
+ {
+ // mixpanel.track('All pools clicked')
+ }}
+ >
+ Deposit
+
+ {
+ // mixpanel.track('Strategies opened')
+ }}
+ >
+ Withdraw
+
+
+
+
+ {tabIndex == 0 && (
+ <>
+
+ {strategy.settings.alerts != undefined && (
+
+ {strategy.settings.alerts
+ .filter((a) => a.tab == 'deposit' || a.tab == 'all')
+ .map((alert, index) => (
+
+
+ {alert.text}
+
+ ))}
+
+ )}
+ >
+ )}
+
+
+ {tabIndex == 1 && (
+ <>
+
+ {strategy.settings.alerts != undefined && (
+
+ {strategy.settings.alerts
+ .filter((a) => a.tab == 'withdraw' || a.tab == 'all')
+ .map((alert, index) => (
+
+
+ {alert.text}
+
+ ))}
+
+ )}
+ >
+ )}
+
+
+
);
}
diff --git a/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx
new file mode 100644
index 00000000..e73ff21f
--- /dev/null
+++ b/src/app/strategy/[strategyId]/_components/TransactionsTab.tsx
@@ -0,0 +1,324 @@
+import {
+ Box,
+ Flex,
+ Link,
+ Table,
+ Thead,
+ Tbody,
+ Tr,
+ Th,
+ Td,
+ TableContainer,
+ Text,
+} from '@chakra-ui/react';
+import { ArrowDownIcon, ArrowUpIcon, ExternalLinkIcon } from '@chakra-ui/icons';
+import { useAccount } from '@starknet-react/core';
+
+import {
+ capitalize,
+ getTokenInfoFromAddr,
+ shortAddress,
+ timeAgo,
+} from '@/utils';
+import MyNumber from '@/utils/MyNumber';
+import { StrategyInfo } from '@/store/strategies.atoms';
+import CONSTANTS from '@/constants';
+
+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;
+}
+
+function DesktopTransactionHistory(props: { transactions: ITransaction[] }) {
+ const { transactions } = props;
+ return (
+ transactions.length !== 0 && (
+ <>
+
+
+
+
+ |
+ #
+ |
+
+ Amount
+ |
+
+ Transaction type
+ |
+
+ Transaction hash
+ |
+
+ Time
+ |
+
+
+
+ {transactions.map((tx, index) => {
+ const token = getTokenInfoFromAddr(tx.asset);
+ const decimals = token?.decimals;
+
+ return (
+
+ |
+ {index + 1}.
+ |
+
+ {Number(
+ new MyNumber(
+ tx.amount,
+ decimals!,
+ ).toEtherToFixedDecimals(token.displayDecimals),
+ ).toLocaleString()}{' '}
+ {token?.name}
+ |
+
+
+ {tx.type === 'deposit' ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+ {capitalize(tx.type)}
+
+ |
+
+
+
+ {shortAddress(tx.txHash)}
+
+
+ |
+
+
+ {timeAgo(new Date(tx.timestamp * 1000))}
+
+ |
+
+ );
+ })}
+
+
+
+ >
+ )
+ );
+}
+
+function MobileTransactionHistory(props: { transactions: ITransaction[] }) {
+ const { transactions: transactions } = props;
+
+ return (
+ <>
+ {transactions.map((tx, index) => {
+ const token = getTokenInfoFromAddr(tx.asset);
+ const decimals = token?.decimals;
+ const isDeposit = tx.type === 'deposit';
+
+ return (
+
+
+
+ {isDeposit ? (
+
+ ) : (
+
+ )}
+
+
+ {isDeposit ? 'Deposited' : 'Withdrawn'}
+
+
+
+ Amount:{' '}
+ {Number(
+ new MyNumber(tx.amount, decimals!).toEtherToFixedDecimals(
+ token.displayDecimals,
+ ),
+ ).toLocaleString()}{' '}
+ {token?.name}
+
+
+ Tx Hash:{' '}
+
+ {shortAddress(tx.txHash)}
+
+
+
+ {timeAgo(new Date(tx.timestamp * 1000))}
+
+
+ );
+ })}
+ >
+ );
+}
+
+export function TransactionsTab(props: TransactionsTabProps) {
+ const { address } = useAccount();
+ 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.
+
+ )}
+
+ {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
+
+ )
+ ) : (
+
+ Connect your wallet to view transaction history
+
+ )}
+
+ );
+}
diff --git a/src/app/strategy/[strategyId]/page.tsx b/src/app/strategy/[strategyId]/page.tsx
index 3b5d2b63..c95e97a8 100644
--- a/src/app/strategy/[strategyId]/page.tsx
+++ b/src/app/strategy/[strategyId]/page.tsx
@@ -13,21 +13,21 @@ export async function generateMetadata({ params }: StrategyParams) {
const strategy = strategies.find((s) => s.id === params?.strategyId);
if (strategy) {
return {
- title: `${strategy.name} | STRKFarm`,
+ title: `${strategy.name} | Troves`,
description: strategy.description,
};
}
return {
- title: 'Yield Strategy | STRKFarm',
+ title: 'Yield Strategy | Troves',
description:
- "STRKFarm's yield strategies are designed to maximize your yield farming returns. Stake your assets in our strategies to earn passive income while we take care of the rest.",
+ "Troves's yield strategies are designed to maximize your yield farming returns. Stake your assets in our strategies to earn passive income while we take care of the rest.",
};
}
export default function StrategyPage({ params }: StrategyParams) {
return (
-
+
);
diff --git a/src/app/template.tsx b/src/app/template.tsx
index 2b8664d8..d604e6e9 100755
--- a/src/app/template.tsx
+++ b/src/app/template.tsx
@@ -19,8 +19,9 @@ import * as React from 'react';
import { Toaster } from 'react-hot-toast';
import { RpcProviderOptions, constants } from 'starknet';
+import Footer from '@/components/Footer';
+import { useIsMobile } from '@/hooks/use-mobile';
import { Inter } from 'next/font/google';
-import { isMobile } from 'react-device-detect';
const inter = Inter({ subsets: ['latin'] });
mixpanel.init('118f29da6a372f0ccb6f541079cad56b');
@@ -29,25 +30,64 @@ const theme = extendTheme({
colors: {
transparent: 'rgba(0, 0, 0, 0)',
opacity_50p: 'rgba(0, 0, 0, 0.5)',
- color1: 'rgba(53, 60, 79, 1)',
- color1_65p: 'rgba(53, 60, 79, 0.65)',
- color1_50p: 'rgba(53, 60, 79, 0.5)',
- color1_35p: 'rgba(53, 60, 79, 0.35)',
- color1_light: '#bcc9ff80',
- color2: 'rgba(132, 132, 195, 1)',
- color2Text: 'rgb(184 184 239)',
- color2_65p: 'rgba(132, 132, 195, 0.65)',
- color2_50p: 'rgba(132, 132, 195, 0.15)',
- highlight: '#1a1a27', // light grey
- light_grey: '#9ca9ad',
disabled_text: '#818181',
disabled_bg: '#5f5f5f',
- purple: '#6e53dc',
- cyan: '#7DFACB',
- bg: '#111119', // dark blue
+
+ highlight: '#303136',
+ purple: '#9069F0',
+ purple_60p: '#6F5CA599',
+ purple_hover: '#4C2CD7',
+ purple_hover_2: '#C5A6FF',
+ purple_active: '#3B20B4',
+ bright_purple: '#907CFF',
+ purple_gray: '#DFDFEC',
+
+ header: '#1d1531',
+
+ badge_blue: '#002F6A',
+ badge_green: '#016131',
+
+ mybg: 'black', // dark blue
+ bg_2: '#111113',
+ bg_3: '#090910',
+
+ mycard: '#19191b',
+ mycard_light: '#212121',
+ mycard_light_2x: '#303136',
+ mycard_dark: '#121212',
+
grey_text: '#B6B6B6',
+ text_primary: 'white',
+ text_secondary: '#b2b3bd',
+ text_secondary_2: '#D3D3D3',
+
yellow: '#EFDB72',
+ yellow_2: '#FFA500',
+
red: '#e18787',
+ red_2: '#FF5F5F',
+
+ // green colors
+ light_green: '#3EE5C2',
+ light_green_2: '#61FCAE',
+ light_green_30p: '#3EE5C24D',
+
+ border_light: '#CFCFEA',
+ border_light_3p: '#CFCFEA0D',
+ border_light_30p: '#CFCFEA4D',
+
+ disabled_button: '#2A2A3D80',
+ disabled_button_text: '#7D7D93',
+
+ dark_bg: '#111119',
+ purple_tint: '#CFCFEA',
+ lavender_gray: '#B4B1BD',
+
+ text_subtle: '#a0a2b0',
+ text_subtle_50p: '#a0a2b080',
+
+ connect_button_gradient:
+ 'linear-gradient(93.94deg, #9069f0 3.22%, #4a14cd 101.67%)',
},
fontSizes: {
large: '50px',
@@ -104,6 +144,8 @@ export default function Template({ children }: { children: React.ReactNode }) {
);
}
+ const isMobile = useIsMobile();
+
return (
-
+
-
+
{children}
+
diff --git a/src/assets/argentMobile.svg b/src/assets/argentMobile.svg
new file mode 100644
index 00000000..1dd02636
--- /dev/null
+++ b/src/assets/argentMobile.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/src/assets/depositAction.svg b/src/assets/depositAction.svg
new file mode 100644
index 00000000..c1ca5b83
--- /dev/null
+++ b/src/assets/depositAction.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/assets/docs.svg b/src/assets/docs.svg
new file mode 100644
index 00000000..a4bea6dd
--- /dev/null
+++ b/src/assets/docs.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/assets/loopAction.svg b/src/assets/loopAction.svg
new file mode 100644
index 00000000..5fd0516e
--- /dev/null
+++ b/src/assets/loopAction.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/shield.svg b/src/assets/shield.svg
index 198e3ee4..8b97b9d2 100644
--- a/src/assets/shield.svg
+++ b/src/assets/shield.svg
@@ -1,7 +1,7 @@
)}
);
diff --git a/src/components/Filters.tsx b/src/components/Filters.tsx
index ed454a01..dba946d8 100755
--- a/src/components/Filters.tsx
+++ b/src/components/Filters.tsx
@@ -1,27 +1,137 @@
-import React from 'react';
-import { useAtomValue, useSetAtom } from 'jotai';
+import { Category, PoolType } from '@/store/pools';
+import {
+ ALL_FILTER,
+ filterAtoms,
+ filters,
+ updateFiltersAtom,
+} from '@/store/protocols';
+import { ChevronDownIcon } from '@chakra-ui/icons';
import {
Avatar,
- AvatarBadge,
- AvatarGroup,
Box,
+ Button,
+ Grid,
HStack,
- IconButton,
+ Menu,
+ MenuButton,
+ MenuItem,
+ MenuList,
Tag,
TagLabel,
Text,
Tooltip,
} from '@chakra-ui/react';
-import { CheckIcon, CloseIcon } from '@chakra-ui/icons';
-import {
- ALL_FILTER,
- filterAtoms,
- filters,
- updateFiltersAtom,
-} from '@/store/protocols';
-import { getTokenInfoFromName } from '@/utils';
-import { Category, PoolType } from '@/store/pools';
+import { useAtomValue, useSetAtom } from 'jotai';
import mixpanel from 'mixpanel-browser';
+import React, { useMemo } from 'react';
+
+function getTextProps(isActive: boolean) {
+ return {
+ fontSize: '14px',
+ fontWeight: isActive ? '600' : 'normal',
+ color: isActive ? 'black' : 'white',
+ };
+}
+
+function MyTag(
+ props: {
+ index: number;
+ totalItems: number;
+ isSelected: boolean;
+ onClick: () => void;
+ label: string;
+ } & React.ComponentProps,
+) {
+ const { index, totalItems, isSelected, onClick, label, ...tagProps } = props;
+
+ const borderRadius = useMemo(() => {
+ if (index === 0) {
+ return '8px 0px 0px 8px';
+ } else if (index === totalItems - 1) {
+ return '0px 8px 8px 0px';
+ }
+ return 'none';
+ }, [index, totalItems]);
+
+ return (
+ *': {
+ fontWeight: '600',
+ },
+ }}
+ onClick={() => {
+ onClick();
+ }}
+ >
+ {label}
+
+ );
+}
+
+// Helper function to check if any filter is active
+function hasAnyFilterActive(
+ protocolsFilter: string[],
+ categoriesFilter: string[],
+ riskLevelFilters: string[],
+ poolTypeFilters: string[],
+) {
+ return (
+ !protocolsFilter.includes(ALL_FILTER) ||
+ !categoriesFilter.includes(ALL_FILTER) ||
+ !riskLevelFilters.includes(ALL_FILTER) ||
+ !poolTypeFilters.includes(ALL_FILTER)
+ );
+}
+
+// Helper function to get total selected count across all filters
+function getTotalSelectedCount(
+ protocolsFilter: string[],
+ categoriesFilter: string[],
+ riskLevelFilters: string[],
+ poolTypeFilters: string[],
+) {
+ let count = 0;
+
+ // Protocols count
+ if (protocolsFilter.includes(ALL_FILTER)) {
+ count += filters.protocols.length;
+ } else {
+ count += protocolsFilter.length;
+ }
+
+ // Categories count
+ if (categoriesFilter.includes(ALL_FILTER)) {
+ count += filters.categories.length;
+ } else {
+ count += categoriesFilter.length;
+ }
+
+ // Risk levels count
+ if (riskLevelFilters.includes(ALL_FILTER)) {
+ count += 5; // Assuming 5 risk levels (1-5)
+ } else {
+ count += riskLevelFilters.length;
+ }
+
+ // Pool types count
+ if (poolTypeFilters.includes(ALL_FILTER)) {
+ count += filters.types.length;
+ } else {
+ count += poolTypeFilters.length;
+ }
+
+ return count;
+}
export function ProtocolFilters() {
const protocolsFilter = useAtomValue(filterAtoms.protocolsAtom);
@@ -34,112 +144,194 @@ export function ProtocolFilters() {
}
function atleastOneProtocolSelected() {
- return protocolsFilter.length > 0;
+ return (
+ protocolsFilter.includes(ALL_FILTER) ||
+ (protocolsFilter.length > 0 && !protocolsFilter.includes(ALL_FILTER))
+ );
+ }
+
+ function getSelectedProtocolsCount() {
+ if (protocolsFilter.includes(ALL_FILTER)) {
+ return filters.protocols.length;
+ }
+ return protocolsFilter.length;
}
+
const updateFilters = useSetAtom(updateFiltersAtom);
return (
-
- {filters.protocols.map((p) => (
-
+
+ {filters.protocols
+ .sort((a, b) => a.name.localeCompare(b.name))
+ .map((p, index) => {
+ const isSelected =
+ isProtocolSelected(p.name) &&
+ !protocolsFilter.includes(ALL_FILTER);
+ return (
+ {
+ const selectedProtocols = protocolsFilter.includes(ALL_FILTER)
+ ? []
+ : protocolsFilter;
+
+ let updatedProtocols = [];
+ if (selectedProtocols.includes(p.name)) {
+ updatedProtocols = selectedProtocols.filter(
+ (x) => x !== p.name,
+ );
+ } else {
+ updatedProtocols = [...selectedProtocols, p.name];
+ }
+ if (updatedProtocols.length === filters.protocols.length) {
+ updatedProtocols = [ALL_FILTER];
+ }
+ mixpanel.track('Protocol Filter', {
+ protocol: p.name,
+ selected:
+ updatedProtocols.includes(p.name) ||
+ updatedProtocols.includes(ALL_FILTER),
+ updatedProtocols: JSON.stringify(updatedProtocols),
+ });
+ updateFilters('protocols', updatedProtocols);
+ }}
+ >
+
+
+
+
+ );
+ })}
+
+
+ {/* Mobile dropdown for protocol filters */}
+
- ))}
-
- {/* Clear all or select all button */}
-
-
- : }
- onClick={() => {
- updateFilters(
- 'protocols',
- atleastOneProtocolSelected() ? [] : [ALL_FILTER],
- );
- mixpanel.track('Clear/Select all protocols', {
- atleastOneProtocolSelected: atleastOneProtocolSelected(),
- });
- }}
- _hover={{
- bg: atleastOneProtocolSelected() ? 'bg' : 'purple',
- boxShadow: '0px 0px 5px var(--chakra-colors-color1)',
- }}
- />
-
-
+
+ Protocols
+
+ {getSelectedProtocolsCount()}
+
+
+
+
+ {filters.protocols.map((p) => (
+
+ ))}
+
+
);
}
@@ -230,237 +422,1039 @@ export function CategoryFilters() {
return riskLevelFilters.includes('1') || riskLevelFilters.includes('2');
}
- function getTextProps(isActive: boolean) {
- return {
- fontSize: '14px',
- color: isActive ? 'bg' : 'color2Text',
- };
- }
-
return (
-
- {/* Protocols: {JSON.stringify(protocolFilters)}
- Category: {JSON.stringify(categoriesFilter)}
- Risk: {JSON.stringify(riskLevelFilters)}
- Types: {JSON.stringify(poolTypeFilters)} */}
-
- {/* Stable pools */}
- {
- updateCategory(Category.Stable);
- }}
- bg={
- categoriesFilter.includes(Category.Stable.valueOf())
- ? 'purple'
- : 'color1'
- }
- marginBottom={'10px'}
- >
-
-
+ {/* Desktop category filters */}
+
+
+ {/* Stable pools */}
+ updateCategory(Category.Stable)}
+ label={Category.Stable.valueOf().split(' ')[0]}
/>
- updateCategory(Category.STRK)}
+ label={Category.STRK.valueOf().split(' ')[0]}
/>
-
-
- {Category.Stable.valueOf()}
-
-
-
- {/* STRK pools */}
- {
- updateCategory(Category.STRK);
- }}
- bg={
- categoriesFilter.includes(Category.STRK.valueOf())
- ? 'purple'
- : 'color1'
- }
- marginBottom={'10px'}
- >
-
- updateCategory(Category.ETH)}
+ label={Category.ETH.valueOf().split(' ')[0]}
/>
-
-
- {Category.STRK.valueOf()}
-
-
-
- {/* ETH pools */}
- {
- updateCategory(Category.ETH);
- }}
- bg={
- categoriesFilter.includes(Category.ETH.valueOf())
- ? 'purple'
- : 'color1'
- }
- marginBottom={'10px'}
- >
-
- updateRiskLevel(['1', '2'])}
+ label="Low risk"
/>
-
-
- {Category.ETH.valueOf()}
-
-
-
- {/* Low risk pools */}
- {
- updateRiskLevel(['1', '2']);
- }}
- bg={isLowRisk() ? 'purple' : 'color1'}
- marginBottom={'10px'}
+
+
+
+ {/* DEXes */}
+
+ updatePoolType([PoolType.DEXV2, PoolType.DEXV3], 'DEX')
+ }
+ label="DEX"
+ />
+ {/* Lending */}
+ updatePoolType([PoolType.Lending], 'Lending')}
+ label="Lending"
+ />
+ {/* Derivatives */}
+
+ updatePoolType([PoolType.Derivatives], 'Derivatives')
+ }
+ label="Derivatives"
+ />
+
+
+
+
-
- {['USDC', 'USDT', 'STRK', 'ETH'].map((token, index) => (
-
+ }
+ bg="mycard_light"
+ color="white"
+ borderRadius="md"
+ padding="12px"
+ size="lg"
+ fontSize="14px"
+ fontWeight="normal"
+ _hover={{
+ bg: 'mycard_light_2x',
+ '& > *': {
+ color: 'black',
+ },
+ }}
+ >
+ Categories
+
+
+ {[Category.Stable, Category.STRK, Category.ETH].map((category) => (
+
+ ))}
+
- ))}
-
- Low risk
-
-
- {/* DEXes */}
- {
- updatePoolType([PoolType.DEXV2, PoolType.DEXV3], 'DEX');
- }}
- bg={
- poolTypeFilters.includes(PoolType.DEXV2.valueOf()) ||
- poolTypeFilters.includes(PoolType.DEXV3.valueOf())
- ? 'purple'
- : 'color1'
- }
- marginBottom={'10px'}
+
+ Low risk
+ {isLowRisk() && (
+
+ ✓
+
+ )}
+
+
+
+
+
+
+
+
+ );
+}
+
+export function CombinedFilters({
+ paginationComponent,
+}: {
+ paginationComponent?: React.ReactNode;
+}) {
+ const updateFilters = useSetAtom(updateFiltersAtom);
+ const protocolsFilter = useAtomValue(filterAtoms.protocolsAtom);
+ const categoriesFilter = useAtomValue(filterAtoms.categoriesAtom);
+ const riskLevelFilters = useAtomValue(filterAtoms.riskAtom);
+ const poolTypeFilters = useAtomValue(filterAtoms.typesAtom);
+
+ const hasAnyFilter = hasAnyFilterActive(
+ protocolsFilter,
+ categoriesFilter,
+ riskLevelFilters,
+ poolTypeFilters,
+ );
+
+ const totalSelectedCount = getTotalSelectedCount(
+ protocolsFilter,
+ categoriesFilter,
+ riskLevelFilters,
+ poolTypeFilters,
+ );
+
+ const handleCombinedFilterToggle = () => {
+ if (hasAnyFilter) {
+ updateFilters('protocols', [ALL_FILTER]);
+ updateFilters('categories', [ALL_FILTER]);
+ updateFilters('risk', [ALL_FILTER]);
+ updateFilters('poolTypes', [ALL_FILTER]);
+ mixpanel.track('Clear all filters');
+ } else {
+ updateFilters('protocols', []);
+ updateFilters('categories', []);
+ updateFilters('risk', []);
+ updateFilters('poolTypes', []);
+ mixpanel.track('Select all filters');
+ }
+ };
+
+ return (
+
+
-
- DEX Pools
-
-
-
- {/* Lending */}
- {
- updatePoolType([PoolType.Lending], 'Lending');
- }}
- bg={poolTypeFilters.includes(PoolType.Lending) ? 'purple' : 'color1'}
- marginBottom={'10px'}
- >
-
- Lending Pools
-
-
-
- {/* Derivatives */}
- {
- updatePoolType([PoolType.Derivatives], 'Derivatives');
- }}
- bg={
- poolTypeFilters.includes(PoolType.Derivatives) ? 'purple' : 'color1'
- }
- marginBottom={'10px'}
- >
- a.name.localeCompare(b.name))
+ .map((p, index) => {
+ const isSelected =
+ (protocolsFilter.includes(ALL_FILTER) ||
+ protocolsFilter.includes(p.name)) &&
+ !protocolsFilter.includes(ALL_FILTER);
+ return (
+ {
+ const selectedProtocols = protocolsFilter.includes(
+ ALL_FILTER,
+ )
+ ? []
+ : protocolsFilter;
+
+ let updatedProtocols = [];
+ if (selectedProtocols.includes(p.name)) {
+ updatedProtocols = selectedProtocols.filter(
+ (x) => x !== p.name,
+ );
+ } else {
+ updatedProtocols = [...selectedProtocols, p.name];
+ }
+ if (updatedProtocols.length === filters.protocols.length) {
+ updatedProtocols = [ALL_FILTER];
+ }
+ mixpanel.track('Protocol Filter', {
+ protocol: p.name,
+ selected:
+ updatedProtocols.includes(p.name) ||
+ updatedProtocols.includes(ALL_FILTER),
+ updatedProtocols: JSON.stringify(updatedProtocols),
+ });
+ updateFilters('protocols', updatedProtocols);
+ }}
+ >
+
+
+
+
+ );
+ })}
+
+
+ {/* Mobile dropdown for protocol filters */}
+
+
+ *': {
+ color: 'white',
+ },
+ }}
+ onClick={handleCombinedFilterToggle}
>
- Derivative Pools
-
-
-
- {/* Reset */}
- {
- updateFilters('categories', [ALL_FILTER]);
- updateFilters('risk', [ALL_FILTER]);
- updateFilters('poolTypes', [ALL_FILTER]);
- mixpanel.track('Reset Filters');
- }}
- marginBottom={'10px'}
+
+ {totalSelectedCount}
+
+ {hasAnyFilter ? 'Clear filters' : 'Select all'}
+
+
+
+
-
-
- Reset
-
-
-
+
+
+ {
+ const existingCategories = categoriesFilter.includes(ALL_FILTER)
+ ? []
+ : categoriesFilter;
+ let isCategoryAdded = false;
+ if (existingCategories.includes(Category.Stable)) {
+ const newFilters = existingCategories.filter(
+ (x) => x !== Category.Stable.valueOf(),
+ );
+ updateFilters(
+ 'categories',
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters,
+ );
+ } else {
+ updateFilters('categories', [
+ ...existingCategories,
+ Category.Stable.valueOf(),
+ ]);
+ isCategoryAdded = true;
+ }
+ mixpanel.track('Category Filter', {
+ category: Category.Stable.valueOf(),
+ selected: isCategoryAdded,
+ });
+ }}
+ label={Category.Stable.valueOf().split(' ')[0]}
+ />
+ {/* STRK pools */}
+ {
+ const existingCategories = categoriesFilter.includes(ALL_FILTER)
+ ? []
+ : categoriesFilter;
+ let isCategoryAdded = false;
+ if (existingCategories.includes(Category.STRK)) {
+ const newFilters = existingCategories.filter(
+ (x) => x !== Category.STRK.valueOf(),
+ );
+ updateFilters(
+ 'categories',
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters,
+ );
+ } else {
+ updateFilters('categories', [
+ ...existingCategories,
+ Category.STRK.valueOf(),
+ ]);
+ isCategoryAdded = true;
+ }
+ mixpanel.track('Category Filter', {
+ category: Category.STRK.valueOf(),
+ selected: isCategoryAdded,
+ });
+ }}
+ label={Category.STRK.valueOf().split(' ')[0]}
+ />
+
+ {
+ const existingCategories = categoriesFilter.includes(ALL_FILTER)
+ ? []
+ : categoriesFilter;
+ let isCategoryAdded = false;
+ if (existingCategories.includes(Category.ETH)) {
+ const newFilters = existingCategories.filter(
+ (x) => x !== Category.ETH.valueOf(),
+ );
+ updateFilters(
+ 'categories',
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters,
+ );
+ } else {
+ updateFilters('categories', [
+ ...existingCategories,
+ Category.ETH.valueOf(),
+ ]);
+ isCategoryAdded = true;
+ }
+ mixpanel.track('Category Filter', {
+ category: Category.ETH.valueOf(),
+ selected: isCategoryAdded,
+ });
+ }}
+ label={Category.ETH.valueOf().split(' ')[0]}
+ />
+
+ {
+ let existingRiskLevels = riskLevelFilters.includes(ALL_FILTER)
+ ? []
+ : riskLevelFilters;
+
+ let isSelected = false;
+ ['1', '2'].map((riskLevel) => {
+ if (existingRiskLevels.includes(riskLevel)) {
+ const newFilters = existingRiskLevels.filter(
+ (x) => x !== riskLevel,
+ );
+ existingRiskLevels =
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters;
+ updateFilters('risk', existingRiskLevels);
+ } else {
+ existingRiskLevels = [...existingRiskLevels, riskLevel];
+ isSelected = true;
+ updateFilters('risk', existingRiskLevels);
+ }
+ });
+
+ mixpanel.track('Risk Filter', {
+ riskLevel: 'low',
+ selected: isSelected,
+ });
+ }}
+ label="Low risk"
+ />
+
+
+
+ {
+ let existingPoolTypes = poolTypeFilters.includes(ALL_FILTER)
+ ? []
+ : poolTypeFilters;
+ let isSelected = false;
+ [PoolType.DEXV2, PoolType.DEXV3].map((type) => {
+ if (existingPoolTypes.includes(type.valueOf())) {
+ const newFilters = existingPoolTypes.filter(
+ (x) => x !== type.valueOf(),
+ );
+ existingPoolTypes =
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters;
+ updateFilters('poolTypes', existingPoolTypes);
+ } else {
+ existingPoolTypes = [...existingPoolTypes, type.valueOf()];
+ isSelected = true;
+ updateFilters('poolTypes', existingPoolTypes);
+ }
+ });
+ mixpanel.track('Pool Type Filter', {
+ poolType: 'DEX',
+ selected: isSelected,
+ });
+ }}
+ label="DEX"
+ />
+ {
+ let existingPoolTypes = poolTypeFilters.includes(ALL_FILTER)
+ ? []
+ : poolTypeFilters;
+ let isSelected = false;
+ [PoolType.Lending].map((type) => {
+ if (existingPoolTypes.includes(type.valueOf())) {
+ const newFilters = existingPoolTypes.filter(
+ (x) => x !== type.valueOf(),
+ );
+ existingPoolTypes =
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters;
+ updateFilters('poolTypes', existingPoolTypes);
+ } else {
+ existingPoolTypes = [...existingPoolTypes, type.valueOf()];
+ isSelected = true;
+ updateFilters('poolTypes', existingPoolTypes);
+ }
+ });
+ mixpanel.track('Pool Type Filter', {
+ poolType: 'Lending',
+ selected: isSelected,
+ });
+ }}
+ label="Lending"
+ />
+ {
+ let existingPoolTypes = poolTypeFilters.includes(ALL_FILTER)
+ ? []
+ : poolTypeFilters;
+ let isSelected = false;
+ [PoolType.Derivatives].map((type) => {
+ if (existingPoolTypes.includes(type.valueOf())) {
+ const newFilters = existingPoolTypes.filter(
+ (x) => x !== type.valueOf(),
+ );
+ existingPoolTypes =
+ newFilters.length === 0 ? [ALL_FILTER] : newFilters;
+ updateFilters('poolTypes', existingPoolTypes);
+ } else {
+ existingPoolTypes = [...existingPoolTypes, type.valueOf()];
+ isSelected = true;
+ updateFilters('poolTypes', existingPoolTypes);
+ }
+ });
+ mixpanel.track('Pool Type Filter', {
+ poolType: 'Derivatives',
+ selected: isSelected,
+ });
+ }}
+ label="Derivatives"
+ />
+
+
+
+ {paginationComponent && (
+
+ {paginationComponent}
+
+ )}
+
+
+
+
+
+
+
);
}
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
new file mode 100644
index 00000000..7c02122c
--- /dev/null
+++ b/src/components/Footer.tsx
@@ -0,0 +1,198 @@
+import React from 'react';
+import {
+ Box,
+ Flex,
+ Text,
+ Link,
+ Image,
+ IconButton,
+ useDisclosure,
+ Container,
+ Grid,
+} from '@chakra-ui/react';
+import tg from '@/assets/tg.svg';
+import x from '@/assets/x.svg';
+import fulllogo from '@public/fulllogo.png';
+import CONSTANTS from '@/constants';
+
+const footerLinks = [
+ {
+ heading: 'Developers',
+ links: [
+ {
+ label: 'Open-source',
+ href: 'https://app.onlydust.com/p/strkfarm',
+ isExternal: true,
+ },
+ { label: 'Audit', href: 'https://www.troves.fi/audit' },
+ {
+ label: 'Github',
+ href: 'https://github.com/trovesfi',
+ isExternal: true,
+ },
+ ],
+ },
+ {
+ heading: 'General',
+ links: [
+ { label: 'Defi Spring', href: 'https://defispring.starknet.io/' },
+ {
+ label: 'Branding kit',
+ href: 'https://drive.google.com/drive/folders/1-D6uizWgdH2XwbP0f3Fc22wQgxhr_RUY?usp=sharing',
+ },
+ { label: 'Status page', href: 'https://status.troves.fi/' },
+ ],
+ },
+ {
+ heading: 'Community',
+ links: [
+ { label: 'Telegram', href: 'https://troves.fi/tg', isExternal: true },
+ {
+ label: 'Twitter',
+ href: 'https://twitter.com/trovesfi',
+ isExternal: true,
+ },
+ ],
+ },
+];
+
+const socialLinks = [
+ // {
+ // icon: discord.src,
+ // label: 'Discord',
+ // href: 'https://discord.gg/',
+ // gradient: 'mycard_light',
+ // },
+ {
+ icon: tg.src,
+ label: 'Telegram',
+ href: CONSTANTS.COMMUNITY_TG,
+ gradient: 'mycard_light',
+ },
+ {
+ icon: x.src,
+ label: 'Twitter',
+ href: 'https://troves.fi/twitter',
+ gradient: 'mycard_light',
+ },
+];
+
+const Footer: React.FC = () => {
+ const { isOpen, onOpen, onClose } = useDisclosure();
+
+ return (
+
+
+
+
+
+
+
+
+ {footerLinks.map((col) => (
+
+
+ {col.heading}
+
+ {col.links.map((link) => (
+
+ {link.label}
+
+ ))}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ © 2024 Troves. All right reserved.
+
+
+
+ Terms and Conditions
+
+
+ {socialLinks.map((s) => (
+ }
+ target="_blank"
+ rel="noopener noreferrer"
+ borderRadius="full"
+ bg="black"
+ _hover={{ filter: 'brightness(1.2)' }}
+ />
+ ))}
+
+
+
+
+
+ );
+};
+
+export default Footer;
diff --git a/src/components/HarvestTime.tsx b/src/components/HarvestTime.tsx
index e7b9f701..6da1ee86 100644
--- a/src/components/HarvestTime.tsx
+++ b/src/components/HarvestTime.tsx
@@ -1,24 +1,10 @@
import React, { useMemo } from 'react';
-import {
- Box,
- Flex,
- Spinner,
- Stat,
- StatLabel,
- StatNumber,
- Tag,
- Text,
- Tooltip,
-} from '@chakra-ui/react';
+import { Box, Flex, Text, Tooltip } from '@chakra-ui/react';
import { useAccount } from '@starknet-react/core';
import { StrategyInfo } from '@/store/strategies.atoms';
import { HarvestTimeAtom } from '@/store/harvest.atom';
import { useAtomValue } from 'jotai';
-import { formatTimediff, getDisplayCurrencyAmount, timeAgo } from '@/utils';
-import { isMobile } from 'react-device-detect';
-import STRKFarmAtoms, {
- STRKFarmStrategyAPIResult,
-} from '@/store/strkfarm.atoms';
+import { formatTimediff, getDisplayCurrencyAmount } from '@/utils';
interface HarvestTimeProps {
strategy: StrategyInfo;
@@ -74,225 +60,150 @@ const HarvestTime: React.FC = ({ strategy, balData }) => {
return formatTimediff(nextHarvest);
}, [data?.timestamp, lastHarvest]);
- const strategiesInfo = useAtomValue(STRKFarmAtoms.baseAPRs!);
-
- const strategyInfo = useMemo(() => {
- if (!strategiesInfo || !strategiesInfo.data) return null;
-
- const strategiesList: STRKFarmStrategyAPIResult[] =
- strategiesInfo.data.strategies;
- const strategyInfo = strategiesList.find(
- (strat) => strat.id == strategy.id,
- );
- return strategyInfo ? strategyInfo : null;
- }, [strategiesInfo]);
-
- const leverage = useMemo(() => {
- if (!strategyInfo) return 0;
- return strategyInfo.leverage || 0;
- }, [strategyInfo]);
-
- const defaultAPYTooltip =
- 'Current APY including any fees. Net returns subject to change based on market conditions.';
return (
-
-
-
-
-
- {strategy.metadata.apyMethodology || defaultAPYTooltip}
-
- {strategyInfo && (
-
-
- Strategy APY:
-
- Including fees and Defi spring rewards
-
-
-
- {(strategyInfo.apySplit.baseApy * 100).toFixed(2)}%
-
-
- )}
- {strategyInfo && strategyInfo.apySplit.rewardsApy > 0 && (
-
-
- Rewards APY:
-
- Incentives by STRKFarm
-
-
-
- {(strategyInfo.apySplit.rewardsApy * 100).toFixed(2)}%
-
-
- )}
-
- }
- >
-
- APY
-
- {((strategyInfo?.apy || 0) * 100).toFixed(2)}%
-
-
-
- {strategyInfo && strategyInfo.apySplit.rewardsApy > 0 && (
-
-
-
- 🔥 Boosted
- {leverage == 0 && (
-
- )}
-
-
-
- )}
-
-
- {!isMobile && !strategy.settings.hideHarvestInfo && (
+
+
+ {!strategy.settings.hideHarvestInfo && (
-
-
+
- Next Harvest in:{' '}
+ Next Harvest in:
{harvestTimestamp.isZero && (
-
+
Anytime now
)}
-
+
+
-
-
- Days
-
-
- {harvestTimestamp.days ?? 0}
-
-
-
-
-
- Hour
-
-
- {harvestTimestamp.hours ?? 0}
-
-
-
-
-
- Mins
-
-
- {harvestTimestamp.minutes ?? 0}
-
-
+ {[
+ {
+ label: 'Days',
+ value: harvestTimestamp.days ?? 0,
+ },
+ {
+ label: 'Hrs',
+ value: harvestTimestamp.hours ?? 0,
+ },
+ {
+ label: 'Min',
+ value: harvestTimestamp.minutes ?? 0,
+ },
+ {
+ label: 'Sec',
+ value: harvestTimestamp.seconds ?? 0,
+ },
+ ].map((item, index) => (
+
+
+ {item.label}
+
+
+ {item.value}
+
+
+ ))}
-
+
)}
- {!strategy.settings.hideHarvestInfo && (
-
-
+ {!strategy.settings.hideHarvestInfo && (
+
- Harvested{' '}
-
+
+ Total rewards harvested:{' '}
{getDisplayCurrencyAmount(
harvestTime?.data?.totalStrkHarvestedByContract.STRKAmount || 0,
2,
)}{' '}
STRK
- {' '}
- over {harvestTime?.data?.totalHarvestsByContract} claims.{' '}
- {lastHarvest && (
-
- Last harvested {timeAgo(lastHarvest)} (Across all users).
-
- )}
-
-
- )}
-
+
+
+
+ Total number of times harvested:{' '}
+ {harvestTime?.data?.totalHarvestsByContract || '-'}
+
+
+ )}
+
+
);
};
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
index 1e0abce0..fe507ffe 100644
--- a/src/components/Navbar.tsx
+++ b/src/components/Navbar.tsx
@@ -1,15 +1,10 @@
-import { ChevronDownIcon, HamburgerIcon } from '@chakra-ui/icons';
+import { ChevronDownIcon, EmailIcon } from '@chakra-ui/icons';
import {
Avatar,
Box,
Button,
Center,
Container,
- Drawer,
- DrawerBody,
- DrawerContent,
- DrawerHeader,
- DrawerOverlay,
Flex,
IconButton,
Image,
@@ -28,8 +23,10 @@ import {
StarknetkitConnector,
} from 'starknetkit';
+import argentMobile from '@/assets/argentMobile.svg';
import tg from '@/assets/tg.svg';
import CONSTANTS from '@/constants';
+import { useIsMobile } from '@/hooks/use-mobile';
import { getERC20Balance } from '@/store/balance.atoms';
import { addressAtom } from '@/store/claims.atoms';
import { lastWalletAtom } from '@/store/utils.atoms';
@@ -42,7 +39,7 @@ import {
standariseAddress,
truncate,
} from '@/utils';
-import fulllogo from '@public/fulllogo.png';
+import fulllogo from '@public/fulllogo.svg';
import {
InjectedConnector,
useAccount,
@@ -52,7 +49,6 @@ import {
} from '@starknet-react/core';
import mixpanel from 'mixpanel-browser';
import { useEffect, useMemo } from 'react';
-import { isMobile } from 'react-device-detect';
import { constants } from 'starknet';
import {
ArgentMobileConnector,
@@ -68,7 +64,7 @@ import TncModal from './TncModal';
export function getConnectors(isMobile: boolean) {
const mobileConnector = ArgentMobileConnector.init({
options: {
- dappName: 'STRKFarm',
+ dappName: 'Troves',
url: getEndpoint(),
chainId: constants.NetworkName.SN_MAIN,
},
@@ -157,6 +153,16 @@ export function getConnectors(isMobile: boolean) {
return sortedConnectors;
}
+const walletIconMap: Record = {
+ argentMobile,
+ argentWebWallet: EmailIcon,
+};
+
+const getWalletIcon = (walletId: string) => {
+ console.log(walletId, 'walletId');
+ return walletIconMap[walletId];
+};
+
interface NavbarProps {
hideTg?: boolean;
forceShowConnect?: boolean;
@@ -181,6 +187,8 @@ export default function Navbar(props: NavbarProps) {
return balance.amount.toEtherToFixedDecimals(6);
};
+ const isMobile = useIsMobile();
+
console.log(account, 'account');
const connectorConfig: ConnectOptionsWithConnectors = useMemo(() => {
@@ -189,11 +197,11 @@ export default function Navbar(props: NavbarProps) {
modalTheme: 'dark',
webWalletUrl: 'https://web.argent.xyz',
argentMobileOptions: {
- dappName: 'STRKFarm',
+ dappName: 'Troves',
chainId: constants.NetworkName.SN_MAIN,
url: getEndpoint(),
},
- dappName: 'STRKFarm',
+ dappName: 'Troves',
connectors: getConnectors(isMobile) as StarknetkitConnector[],
};
}, [isMobile]);
@@ -201,6 +209,7 @@ export default function Navbar(props: NavbarProps) {
async function connectWallet(config = connectorConfig) {
try {
const { connector } = await connect(config);
+ console.log(connector, 'connector');
if (connector) {
connectSnReact({ connector: connector as any });
@@ -255,52 +264,49 @@ export default function Navbar(props: NavbarProps) {
return (
-
+
-
- Strategies with{' '}
-
+ ⚡ New name. Bigger vision. STRKFarm is now{' '}
+
- {' '}
- zkLend exploit
- {' '}
- exposure have been retired. You can check your partially recovered
- funds
-
- {' '}
- here.
-
-
+ Troves
+
+
-
-
+
+
+ {/*
+ Troves
+ */}
{/*
+
+ )}
+
+ {true && (
+
+
+
+ )}
+ {/*
+ {isMobile && (
+ }
+ background="transparent"
+ display={{ base: 'flex', md: 'none' }}
+ onClick={onOpen}
+ _focus={{
+ bg: 'none',
+ }}
+ />
+ )} */}
+
+ {/*
+
+
+ Menu
+
+
+
+ Home
+
+
+ 🕹 {' '}Raffle
+
+ {
+ onClose();
+ mixpanel.track('community_program_click');
+ }}
+ mt={4}
+ >
+ ✨ Community Program
+
+
+
+
+ */}
+
diff --git a/src/components/Pools.tsx b/src/components/Pools.tsx
index ab10541c..24e08164 100755
--- a/src/components/Pools.tsx
+++ b/src/components/Pools.tsx
@@ -1,6 +1,6 @@
'use client';
-import { CategoryFilters, ProtocolFilters } from '@/components/Filters';
+import { CombinedFilters } from '@/components/Filters';
import {
allPoolsAtomUnSorted,
filteredPools,
@@ -31,6 +31,71 @@ import { useAtomValue, useSetAtom } from 'jotai';
import { useMemo, useState } from 'react';
import YieldCard, { HeaderSorter } from './YieldCard';
+function MyPagination(props: {
+ pagesCount: number;
+ currentPage: number;
+ setCurrentPage: (page: number) => void;
+ pages: number[];
+}) {
+ const { pagesCount, currentPage, setCurrentPage, pages } = props;
+ return (
+ {
+ setCurrentPage(page);
+ }}
+ >
+
+
+ {'<'}
+
+
+ {pages.map((page: number) => (
+
+ ))}
+
+
+ {'>'}
+
+
+
+ );
+}
+
export default function Pools() {
const allPools = useAtomValue(allPoolsAtomUnSorted);
const _filteredPools = useAtomValue(filteredPools);
@@ -101,119 +166,134 @@ export default function Pools() {
}
};
return (
-
-
-
-
-
+
+
+
+
+ }
+ />
-
- {
- setCurrentPage(page);
+
+
+
-
-
- {'<'}
-
-
- {pages.map((page: number) => (
-
+
+ |
+ Pool name
+ |
+
+
- ))}
-
-
- {'>'}
-
-
-
+ |
+
+
+
+
+ |
+
+
+ |
+
+
+
+ {allPools.length > 0 && (
+ <>
+ {pools.map((pool, index) => {
+ return (
+
+ );
+ })}
+ >
+ )}
+
+
+ {allPools.length > 0 && pools.length === 0 && (
+
+
+ No pools. Check filters.
+
+
+ )}
+ {allPools.length === 0 && (
+
+
+
+
+
+ )}
-
-
-
-
- | Pool name |
-
-
- |
-
-
- |
-
-
- |
-
-
-
- {allPools.length > 0 && (
- <>
- {pools.map((pool, index) => {
- return (
-
- );
- })}
- >
- )}
-
-
- {allPools.length > 0 && pools.length === 0 && (
-
-
- No pools. Check filters.
-
-
- )}
- {allPools.length === 0 && (
-
-
-
-
-
- )}
-
+
);
}
diff --git a/src/components/Strategies.tsx b/src/components/Strategies.tsx
index 71184288..641966a4 100755
--- a/src/components/Strategies.tsx
+++ b/src/components/Strategies.tsx
@@ -1,7 +1,9 @@
import { usePagination } from '@ajna/pagination';
import {
+ AccordionButton,
+ AccordionItem,
+ AccordionPanel,
Container,
- Link,
Skeleton,
Stack,
Table,
@@ -10,26 +12,30 @@ import {
Th,
Thead,
Tr,
+ VStack,
} from '@chakra-ui/react';
import { useAtomValue } from 'jotai';
import React, { useMemo } from 'react';
+import { Accordion } from '@chakra-ui/react';
-import CONSTANTS from '@/constants';
import { filteredPools } from '@/store/protocols';
import {
- STRKFarmBaseAPYsAtom,
- STRKFarmStrategyAPIResult,
-} from '@/store/strkfarm.atoms';
+ TrovesBaseAPYsAtom,
+ TrovesStrategyAPIResult,
+} from '@/store/troves.atoms';
import { YieldStrategyCard } from './YieldCard';
+import { addressAtom } from '@/store/claims.atoms';
+import { QuestionIcon } from '@chakra-ui/icons';
export default function Strategies() {
- const strkFarmPoolsRes = useAtomValue(STRKFarmBaseAPYsAtom);
+ const strkFarmPoolsRes = useAtomValue(TrovesBaseAPYsAtom);
const strkFarmPools = useMemo(() => {
if (!strkFarmPoolsRes || !strkFarmPoolsRes.data)
- return [] as STRKFarmStrategyAPIResult[];
+ return [] as TrovesStrategyAPIResult[];
return strkFarmPoolsRes.data.strategies;
}, [strkFarmPoolsRes]);
+ const address = useAtomValue(addressAtom);
const _filteredPools = useAtomValue(filteredPools);
const ITEMS_PER_PAGE = 15;
@@ -44,24 +50,118 @@ export default function Strategies() {
}, [_filteredPools, currentPage]);
return (
-
-
- What are strategies?
-
-
- Strategies are a combination of investment steps that combine various
- pools to maximize yield.
-
-
-
-
- | Strategy name |
- APY |
- Risk |
- TVL |
-
-
-
+
+
+
+
+
+ What are strategies?
+
+ {/* */}
+
+
+
+ Strategies are structured investment plans that combine multiple
+ liquidity pools or protocols to optimize returns. They automate
+ the process of maximizing yield by intelligently allocating assets
+ across opportunities.
+
+
+
+
+
+ {strkFarmPools.length > 0 && (
+
+
+
+
+ |
+ Strategy name
+ |
+
+ APY
+ |
+
+ Risk
+ |
+
+ TVL
+ |
+ {address != undefined && (
+
+ MY BAL
+ |
+ )}
+
+
+
+ {strkFarmPools.length > 0 && (
+ <>
+ {strkFarmPools.map((pool, index) => {
+ return (
+
+ );
+ })}
+ >
+ )}
+
+
+
+ {/*
{strkFarmPools.length > 0 && (
<>
{strkFarmPools.map((pool, index) => {
@@ -71,8 +171,10 @@ export default function Strategies() {
})}
>
)}
-
-
+ */}
+
+ )}
+
{strkFarmPools.length === 0 && (
@@ -81,19 +183,6 @@ export default function Strategies() {
)}
-
- More strategies coming soon. Join our{' '}
-
- Telegram channel
- {' '}
- to stay upto date.
-
);
}
diff --git a/src/components/TVL.tsx b/src/components/TVL.tsx
index 67c929f6..5b0a9115 100755
--- a/src/components/TVL.tsx
+++ b/src/components/TVL.tsx
@@ -2,6 +2,7 @@ import { addressAtom } from '@/store/claims.atoms';
import { referralCodeAtom } from '@/store/referral.store';
import { strategiesAtom } from '@/store/strategies.atoms';
import { dAppStatsAtom, userStatsAtom } from '@/store/utils.atoms';
+import { MYSTYLES } from '@/style';
import { copyReferralLink, getHosturl } from '@/utils';
import { CopyIcon } from '@chakra-ui/icons';
import {
@@ -40,14 +41,23 @@ const TVL: React.FC = () => {
return (
-
+
- Total Value locked (TVL)
-
+
+ Total Value locked (TVL)
+
+
$
{isPending ? (
@@ -62,17 +72,24 @@ const TVL: React.FC = () => {
-
+
- Your holdings
-
+ Your holdings
+
$
{userStatsPending ? (
) : !userData ? (
0
) : (
- Number(userData?.holdingsUSD.toFixed(2)).toLocaleString()
+ Number(userData?.holdingsUSD?.toFixed(2)).toLocaleString()
)}
@@ -80,9 +97,16 @@ const TVL: React.FC = () => {
-
+
-
+
Your referral link{' '}
{/* TODO: update the url */}
@@ -104,20 +128,20 @@ const TVL: React.FC = () => {
) : (
{
copyReferralLink(referralCode);
}}
+ {...MYSTYLES.TEXT.H1Label}
>
{referralCode}
)
) : (
-
+
-
diff --git a/src/components/TncModal.tsx b/src/components/TncModal.tsx
index d585dccc..0a8dc28e 100644
--- a/src/components/TncModal.tsx
+++ b/src/components/TncModal.tsx
@@ -213,7 +213,7 @@ const TncModal: React.FC = (props) => {
- By clicking agree, you agree to STRKFarm terms and conditions as
+ By clicking agree, you agree to Troves terms and conditions as
stated in above document.
@@ -248,6 +248,9 @@ const TncModal: React.FC = (props) => {
disconnectAsync();
onClose();
}}
+ _hover={{
+ bg: 'mycard2',
+ }}
ml={'10px'}
>
Disconnect
diff --git a/src/components/TxButton.tsx b/src/components/TxButton.tsx
index 721ddf97..803650e5 100755
--- a/src/components/TxButton.tsx
+++ b/src/components/TxButton.tsx
@@ -1,5 +1,10 @@
+import { useIsMobile } from '@/hooks/use-mobile';
import { referralCodeAtom } from '@/store/referral.store';
import { StrategyTxProps, monitorNewTxAtom } from '@/store/transactions.atom';
+import {
+ TrovesBaseAPYsAtom,
+ TrovesStrategyAPIResult,
+} from '@/store/troves.atoms';
import { IStrategyProps, TokenInfo } from '@/strategies/IStrategy';
import { getReferralUrl } from '@/utils';
import {
@@ -19,7 +24,6 @@ import { useAccount, useSendTransaction } from '@starknet-react/core';
import { useAtomValue, useSetAtom } from 'jotai';
import mixpanel from 'mixpanel-browser';
import { useEffect, useMemo } from 'react';
-import { isMobile } from 'react-device-detect';
import { TwitterShareButton } from 'react-share';
import { Call } from 'starknet';
@@ -41,11 +45,11 @@ export default function TxButton(props: TxButtonProps) {
const { isOpen, onOpen, onClose } = useDisclosure();
const referralCode = useAtomValue(referralCodeAtom);
+ const isMobile = useIsMobile();
+
const disabledStyle = {
- bg: 'var(--chakra-colors-disabled_bg)',
- color: 'var(--chakra-colors-disabled_text)',
- borderColor: 'var(--chakra-colors-disabled_bg)',
- borderWidth: '1px',
+ bg: 'mycard_light',
+ color: 'disabled_text',
};
const {
@@ -76,7 +80,9 @@ export default function TxButton(props: TxButtonProps) {
mixpanel.track('Transaction success', {
strategyId: props.txInfo.strategyId,
actionType: props.txInfo.actionType,
- amount: props.txInfo.amount.toEtherToFixedDecimals(6),
+ amount: Number.isNaN(props.txInfo.amount.toString())
+ ? 0
+ : props.txInfo.amount.toEtherToFixedDecimals(6),
tokenAddr: props.txInfo.tokenAddr,
status: 'success',
createdAt: new Date(),
@@ -87,7 +93,9 @@ export default function TxButton(props: TxButtonProps) {
mixpanel.track('Transaction failed', {
strategyId: props.txInfo.strategyId,
actionType: props.txInfo.actionType,
- amount: props.txInfo.amount.toEtherToFixedDecimals(6),
+ amount: Number.isNaN(props.txInfo.amount.toString())
+ ? 0
+ : props.txInfo.amount.toEtherToFixedDecimals(6),
tokenAddr: props.txInfo.tokenAddr,
status: 'failed',
createdAt: new Date(),
@@ -103,10 +111,18 @@ export default function TxButton(props: TxButtonProps) {
if (!address) return props.text;
return '';
}
- if (!address) return 'Wallet not connected';
+ if (!address) return 'Connect wallet to continue';
return '';
}, [isMobile, address, props]);
+ const strategiesInfo = useAtomValue(TrovesBaseAPYsAtom);
+ const strategyCached = useMemo(() => {
+ if (!strategiesInfo || !strategiesInfo.data) return null;
+ const strategiesList: TrovesStrategyAPIResult[] =
+ strategiesInfo.data.strategies;
+ return strategiesList.find((s: any) => s.id === props.strategy?.id);
+ }, [strategiesInfo, props.strategy?.id]);
+
async function handleButton() {
writeAsync().then((tx) => {
if (props.buttonText === 'Deposit') onOpen();
@@ -123,6 +139,8 @@ export default function TxButton(props: TxButtonProps) {
if (disabledText) {
return (
- While your deposit is being processed, if you like STRKFarm, do
- you mind sharing on X/Twitter?
+ While your deposit is being processed, if you like Troves, do you
+ mind sharing on X/Twitter?
{
mixpanel.track('Click strategy button', {
diff --git a/src/components/YieldCard.tsx b/src/components/YieldCard.tsx
index 770adeb4..478a9ae8 100644
--- a/src/components/YieldCard.tsx
+++ b/src/components/YieldCard.tsx
@@ -2,22 +2,20 @@ import shield from '@/assets/shield.svg';
import { addressAtom } from '@/store/claims.atoms';
import { isPoolRetired, PoolInfo } from '@/store/pools';
import { getPoolInfoFromStrategy, sortAtom } from '@/store/protocols';
-import { STRKFarmStrategyAPIResult } from '@/store/strkfarm.atoms';
+import { strategiesAtom } from '@/store/strategies.atoms';
+import { TrovesStrategyAPIResult } from '@/store/troves.atoms';
import { UserStats, userStatsAtom } from '@/store/utils.atoms';
import { isLive, StrategyLiveStatus } from '@/strategies/IStrategy';
import { getDisplayCurrencyAmount } from '@/utils';
-import { TriangleDownIcon, TriangleUpIcon } from '@chakra-ui/icons';
+import { ArrowDownIcon, ArrowUpIcon } from '@chakra-ui/icons';
import {
Avatar,
AvatarGroup,
Badge,
Box,
Flex,
- Grid,
- GridItem,
Heading,
HStack,
- Icon,
Image,
Link,
Spinner,
@@ -32,34 +30,31 @@ import { ContractAddr } from '@strkfarm/sdk';
import { useAtomValue } from 'jotai';
import mixpanel from 'mixpanel-browser';
import { useMemo } from 'react';
-import { isMobile } from 'react-device-detect';
-import { FaWallet } from 'react-icons/fa';
export interface YieldCardProps {
pool: PoolInfo;
index: number;
showProtocolName?: boolean;
+ showBalance?: boolean;
}
export function getStratCardBg(status: StrategyLiveStatus, index: number) {
- if (status == StrategyLiveStatus.HOT) {
- return '#414173';
- }
- if (isLive(status)) {
- return index % 2 === 0 ? 'color1_50p' : 'color2_50p';
- }
- if (status == StrategyLiveStatus.RETIRED) {
- return 'black';
- }
- return 'bg';
+ // if (isLive(status)) {
+ // return index % 2 === 0 ? 'mycard_dark' : 'mycard_dark';
+ // }
+ // if (status == StrategyLiveStatus.RETIRED) {
+ // return 'black';
+ // }
+ // return 'bg';
+ return 'mycard_dark';
}
function getStratCardBadgeBg(status: StrategyLiveStatus) {
if (isLive(status)) {
- return 'cyan';
+ return 'badge_blue';
} else if (status === StrategyLiveStatus.COMING_SOON) {
return 'yellow';
- } else if (status == StrategyLiveStatus.RETIRED) {
+ } else if (status === StrategyLiveStatus.RETIRED) {
return 'grey';
}
return 'bg';
@@ -68,64 +63,94 @@ function getStratCardBadgeBg(status: StrategyLiveStatus) {
export function StrategyInfo(props: YieldCardProps) {
const { pool } = props;
+ const tags = useMemo(() => {
+ if (!pool.additional || !pool.additional.tags) return [];
+ return pool.additional.tags.filter(
+ (tag) => tag != StrategyLiveStatus.ACTIVE,
+ );
+ }, [pool.additional]);
+
return (
-
+
{pool.pool.logos.map((logo, index) => (
))}
-
-
-
- {pool.pool.name}
-
- {pool.additional &&
- pool.additional.tags
- .filter((tag) => tag != StrategyLiveStatus.ACTIVE)
- .map((tag) => {
- return (
-
+
+
+
+ {pool.pool.name}
+
+ {pool.additional && pool.additional.auditUrl && (
+
+
+
- {tag}
-
- );
- })}
- {pool.additional && pool.additional.auditUrl && (
-
-
-
-
-
-
-
+
+
+
+
+ )}
+
+ {tags.length > 0 && (
+
+
+ {tags.map((tag) => {
+ return (
+
+ {tag}
+
+ );
+ })}
+
+
)}
-
+
{props.showProtocolName && (
-
+
-
+
{pool.protocol.name}
)}
-
+
);
@@ -136,18 +161,11 @@ function getAPRWithToolTip(pool: PoolInfo) {
{pool.aprSplits.map((split) => {
return (
-
-
- {split.title}:
-
- {split.description}
-
-
-
+
+
+ {split.title} {split.description ? `(${split.description})` : ''}
+
+
{split.apr === 'Err' ? split.apr : (split.apr * 100).toFixed(2)}%
@@ -168,10 +186,10 @@ function getAPRWithToolTip(pool: PoolInfo) {
{!pool.isLoading && (
<>
{(pool.apr * 100).toFixed(2)}%
@@ -182,26 +200,61 @@ function getAPRWithToolTip(pool: PoolInfo) {
);
}
+function PointsMultiplier(props: {
+ points: { multiplier: number; logo: string; toolTip?: string }[];
+}) {
+ const { points } = props;
+ return (
+
+
+ {points.map((point, index) => (
+
+
+
+ {point.multiplier}x
+ Points
+
+
+
+
+ ))}
+
+
+ );
+}
+
function StrategyAPY(props: YieldCardProps) {
const { pool } = props;
const isRetired = useMemo(() => {
return isPoolRetired(pool);
}, [pool]);
+ const strategies = useAtomValue(strategiesAtom);
+
+ const strategy = useMemo(() => {
+ return strategies.find((s) => s.id === pool.pool.id);
+ }, [strategies, pool.pool.id]);
+
return (
-
+
{isRetired ? (
-
) : (
- <>
+
{getAPRWithToolTip(pool)}
{pool.aprSplits.length &&
pool.aprSplits.some((a) => a.title == 'Rewards APY') && (
@@ -222,7 +275,10 @@ function StrategyAPY(props: YieldCardProps) {
)}
- >
+ {strategy != undefined && strategy.metadata.points != undefined && (
+
+ )}
+
)}
);
@@ -259,6 +315,32 @@ export function getStrategyWiseHoldingsInfo(
export function StrategyTVL(props: YieldCardProps) {
const { pool } = props;
+
+ const isPoolLive =
+ pool.additional &&
+ pool.additional.tags[0] &&
+ isLive(pool.additional.tags[0]);
+
+ return (
+
+ {isPoolLive && (
+
+ ${getDisplayCurrencyAmount(pool.tvl || 0, 0)}
+
+ )}
+ {!isPoolLive && -}
+
+ );
+}
+
+export function StrategyBalance(props: YieldCardProps) {
+ const { pool } = props;
const address = useAtomValue(addressAtom);
const { data: userData } = useAtomValue(userStatsAtom);
@@ -272,70 +354,50 @@ export function StrategyTVL(props: YieldCardProps) {
return (
- {isPoolLive && (
-
- ${getDisplayCurrencyAmount(pool.tvl || 0, 0)}
-
- )}
{!isPoolLive && -}
- {address && isPoolLive && pool.protocol.name == 'STRKFarm' && (
-
-
-
-
-
- ${getDisplayCurrencyAmount(holdingsInfo.usdValue, 0)}
+ {address && isPoolLive && pool.protocol.name === 'Troves' && (
+
+ <>
+
+ ${getDisplayCurrencyAmount(holdingsInfo.usdValue, 0)}
+
+ {holdingsInfo.amount != 0 && (
+
+ {/* */}
+
+ {getDisplayCurrencyAmount(
+ holdingsInfo.amount,
+ holdingsInfo.tokenInfo.displayDecimals,
+ ).toLocaleString()}
-
-
-
+
- {holdingsInfo.amount != 0 && (
-
- {/* */}
-
- {getDisplayCurrencyAmount(
- holdingsInfo.amount,
- holdingsInfo.tokenInfo.displayDecimals,
- ).toLocaleString()}
-
-
-
- )}
-
-
-
+ )}
+ >
+
)}
);
}
+
// return sort heading text to match with sort options heading text
function sortHeading(field: string) {
if (field == 'APY') {
@@ -343,6 +405,7 @@ function sortHeading(field: string) {
}
return field.toUpperCase();
}
+
function GetRiskLevel(riskFactor: number) {
let color = '';
let bgColor = '';
@@ -370,8 +433,8 @@ function GetRiskLevel(riskFactor: number) {
))}
-
@@ -428,74 +479,72 @@ function GetRiskLevel(riskFactor: number) {
function StrategyMobileCard(props: YieldCardProps) {
const { pool, index } = props;
+ const riskLevel = pool.additional?.riskFactor || 0;
+ const isRetired = useMemo(() => {
+ return isPoolRetired(pool);
+ }, [pool]);
+
return (
-
-
-
-
-
-
- APY
-
-
-
-
-
- RISK
-
- {pool.additional?.riskFactor
- ? GetRiskLevel(pool.additional?.riskFactor)
- : '-'}
-
-
-
- TVL
-
-
-
-
+
+
+ {/* Top row: Avatars, name, shield, New badge */}
+
+
+
+
+ {/* APY, TVL, Risk row */}
+
+
+
+ APY
+
+
+ {(pool.apr * 100).toFixed(2)}%
+
+
+
+
+ TVL
+
+
+ {`$${getDisplayCurrencyAmount(pool.tvl, 0)}`}
+
+
+
+
+ Risk
+
+
+ {GetRiskLevel(pool.additional?.riskFactor)}
+
+
+
+
+
);
}
export function getLinkProps(pool: PoolInfo, showProtocolName?: boolean) {
return {
href: pool.protocol.link,
- target: isMobile ? '_self' : '_blank',
+ // target: isMobile ? '_self' : '_blank',
onClick: () => {
mixpanel.track('Pool clicked', {
pool: pool.pool.name,
@@ -510,28 +559,42 @@ export function getLinkProps(pool: PoolInfo, showProtocolName?: boolean) {
}
export default function YieldCard(props: YieldCardProps) {
const { pool, index } = props;
+ const address = useAtomValue(addressAtom);
+
+ const showBalance = useMemo(() => {
+ return props.showBalance && address != undefined;
+ }, [props.showBalance, address]);
const isRetired = useMemo(() => {
return isPoolRetired(pool);
}, [pool]);
+
return (
<>
- |
-
+ |
+
+
+
|
-
+ |
{isRetired ? (
-
@@ -540,18 +603,20 @@ export default function YieldCard(props: YieldCardProps) {
)}
|
-
+ |
{isRetired ? (
-
+
-
) : pool.additional?.riskFactor ? (
- GetRiskLevel(pool.additional?.riskFactor)
+
+ {GetRiskLevel(pool.additional?.riskFactor)}
+
) : (
'-'
)}
|
-
+ |
{isRetired ? (
-
@@ -560,6 +625,17 @@ export default function YieldCard(props: YieldCardProps) {
)}
|
+ {showBalance && (
+
+ {isRetired ? (
+
+ -
+
+ ) : (
+
+ )}
+ |
+ )}
;
+ return (
+
+ );
}
export function HeaderSorter(props: {
heading: string;
+ align: 'left' | 'right';
mainColor: string;
inActiveColor: string;
onClick: (order: 'asc' | 'desc') => void;
@@ -601,25 +685,32 @@ export function HeaderSorter(props: {
onClick={() => {
props.onClick(order);
}}
- float={'right'}
+ float={props.align}
+ padding={0}
>
{props.heading.toUpperCase()}
-
-
+
-
-
+
);
}
diff --git a/src/constants.ts b/src/constants.ts
index 47bbe3d6..a0f8fe5d 100755
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -4,13 +4,12 @@ import { getEndpoint, standariseAddress } from './utils';
import MyNumber from './utils/MyNumber';
const LOGOS = {
- USDT: '/zklend/icons/tokens/usdt.svg?w=20',
- USDC: '/zklend/icons/tokens/usdc.svg?w=20',
- WBTC: '/zklend/icons/tokens/wbtc.svg?w=20',
- ETH: '/zklend/icons/tokens/eth.svg?w=20',
- STRK: '/zklend/icons/tokens/strk.svg?w=20',
- DAI: '/zklend/icons/tokens/dai.svg?w=20',
- kSTRK: '/zklend/icons/tokens/kstrk.svg?w=20',
+ USDT: 'https://assets.troves.fi/integrations/tokens/usdt.svg?w=20',
+ USDC: 'https://assets.troves.fi/integrations/tokens/usdc.svg?w=20',
+ WBTC: 'https://assets.troves.fi/integrations/tokens/wbtc.svg?w=20',
+ ETH: 'https://assets.troves.fi/integrations/tokens/eth.svg?w=20',
+ STRK: 'https://assets.troves.fi/integrations/tokens/strk.svg?w=20',
+ DAI: 'https://assets.troves.fi/integrations/tokens/dai.svg?w=20',
xSTRK: '/imagedelivery/c1f44170-c1b0-4531-3d3b-5f0bacfe1300/logo',
};
@@ -21,7 +20,6 @@ export type TokenName =
| 'STRK'
| 'WBTC'
| 'DAI'
- | 'kSTRK'
| 'xSTRK';
export const CONSTANTS = {
@@ -33,12 +31,12 @@ export const CONSTANTS = {
LENDING_INCENTIVES_URL:
'https://kx58j6x5me.execute-api.us-east-1.amazonaws.com/starknet/fetchFile?file=prod-api/lending/lending_strk_grant.json',
LOGOS,
- COMMUNITY_TG: 'https://t.me/+HQ_eHaXmF-1lZDc1',
+ COMMUNITY_TG: 'https://troves.fi/tg',
NOSTRA: {
LENDING_GRAPH_URL: '/nostra/app/data-yqlpb/endpoint/data/v1/action/find',
},
ZKLEND: {
- BASE_APR_API: '/zklend/api/pools',
+ BASE_APR_API: '/zklend/api/poolsee',
},
NIMBORA: {
DEX_APR_API: '/nimbora/yield-dex/strategies',
@@ -55,9 +53,9 @@ export const CONSTANTS = {
HAIKO: {
BASE_APR_API: '/haiko/markets?network=mainnet',
},
- STRKFarm: {
- BASE_APR_API: '/api/strategies',
- // BASE_APR_API: 'https://app.strkfarm.com/api/strategies',
+ Troves: {
+ // BASE_APR_API: '/api/strategies',
+ BASE_APR_API: 'https://beta.troves.fi/api/strategies',
},
MY_SWAP: {
POOLS_API: '/myswap/data/pools/all.json',
@@ -69,7 +67,7 @@ export const CONSTANTS = {
'0x541681b9ad63dff1b35f79c78d8477f64857de29a27902f7298f7b620838ea',
AutoUsdcFarm:
'0x16912b22d5696e95ffde888ede4bd69fbbc60c5f873082857a47c543172694f',
- AutoxSTRKFarm:
+ AutoxTroves:
'0x2102068cf222a37076b9e322c6428cb9e7110591c8df8a733df2110fdb0c329',
DeltaNeutralMMUSDCETH:
'0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422',
@@ -83,6 +81,7 @@ export const CONSTANTS = {
'0x7023a5cadc8a5db80e4f0fde6b330cbd3c17bbbf9cb145cbabd7bd5e6fb7b0b',
},
MOBILE_MSG: 'Desktop/Tablet only',
+ BLOCK_EXPLORER: 'https://voyager.online',
};
export const TOKENS: TokenInfo[] = [
@@ -213,7 +212,7 @@ export const TOKENS: TokenInfo[] = [
isERC4626: true,
},
{
- token: CONSTANTS.CONTRACTS.AutoxSTRKFarm,
+ token: CONSTANTS.CONTRACTS.AutoxTroves,
name: 'frmxSTRK',
decimals: 18,
displayDecimals: 2,
@@ -223,19 +222,6 @@ export const TOKENS: TokenInfo[] = [
stepAmount: MyNumber.fromEther('0.01', 18),
isERC4626: true,
},
- {
- token: standariseAddress(
- '0x045cd05ee2caaac3459b87e5e2480099d201be2f62243f839f00e10dde7f500c',
- ),
- name: 'kSTRK',
- decimals: 18,
- displayDecimals: 2,
- logo: CONSTANTS.LOGOS.STRK,
- minAmount: MyNumber.fromEther('10', 18),
- maxAmount: MyNumber.fromEther('10000', 18),
- stepAmount: MyNumber.fromEther('10', 18),
- isERC4626: false,
- },
];
export const NFTS: NFTInfo[] = [
@@ -294,7 +280,7 @@ export const provider = new RpcProvider({
// ? When updating this, ensure there is redirect available for this route
// ? to respect version of doc in github
-export const LATEST_TNC_DOC_VERSION = 'tnc/v1';
+export const LATEST_TNC_DOC_VERSION = 'tnc/v2';
export const TnC_DOC_URL = `${getEndpoint()}/${LATEST_TNC_DOC_VERSION}`;
export const SIGNING_DATA = {
types: {
@@ -310,8 +296,8 @@ export const SIGNING_DATA = {
},
primaryType: 'Tnc',
domain: {
- name: 'STRKFarm',
- version: '1',
+ name: 'Troves',
+ version: '2',
chainId: getNetwork(),
},
message: {
diff --git a/src/hooks/use-mobile.tsx b/src/hooks/use-mobile.tsx
new file mode 100644
index 00000000..a5d40612
--- /dev/null
+++ b/src/hooks/use-mobile.tsx
@@ -0,0 +1,21 @@
+import * as React from 'react';
+
+const MOBILE_BREAKPOINT = 1024;
+
+export function useIsMobile() {
+ const [isMobile, setIsMobile] = React.useState(
+ undefined,
+ );
+
+ React.useEffect(() => {
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
+ const onChange = () => {
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
+ };
+ mql.addEventListener('change', onChange);
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
+ return () => mql.removeEventListener('change', onChange);
+ }, []);
+
+ return !!isMobile;
+}
diff --git a/src/store/ekobu.store.ts b/src/store/ekobu.store.ts
index 1908ee55..641e5a2f 100755
--- a/src/store/ekobu.store.ts
+++ b/src/store/ekobu.store.ts
@@ -84,7 +84,6 @@ export class Ekubo extends IDapp {
'ETH/USDC',
'STRK/USDC',
'STRK/ETH',
- 'kSTRK/STRK',
'xSTRK/STRK',
'USDC/USDT',
'USDC',
@@ -177,7 +176,7 @@ export class Ekubo extends IDapp {
priceOfUsdc,
} = data.data;
- const strkToken = tokens.find((t) => t.symbol === 'STRK');
+ const strkToken = tokens?.find((t) => t.symbol === 'STRK');
const getTokenPrice = (symbol: string): number => {
switch (symbol) {
@@ -196,9 +195,9 @@ export class Ekubo extends IDapp {
.map((p) => {
const t0 = BigInt(p.token0);
const t1 = BigInt(p.token1);
- const token0 = tokens.find((t) => BigInt(t.l2_token_address) === t0);
+ const token0 = tokens?.find((t) => BigInt(t.l2_token_address) === t0);
if (!token0 || token0.hidden) return;
- const token1 = tokens.find((t) => BigInt(t.l2_token_address) === t1);
+ const token1 = tokens?.find((t) => BigInt(t.l2_token_address) === t1);
if (!token1 || token1.hidden) return;
const springPair = defiSpringData.pairs.find(
diff --git a/src/store/endur.store.ts b/src/store/endur.store.ts
index 734d1590..95706339 100644
--- a/src/store/endur.store.ts
+++ b/src/store/endur.store.ts
@@ -22,7 +22,7 @@ export interface IndexedPoolData {
export class Endur extends IDapp {
name = 'Endur';
- link = 'https://endur.fi/r/strkfarm';
+ link = 'https://endur.fi/r/troves';
logo = 'https://endur.fi/favicon.ico';
incentiveDataKey: string = 'Endur';
}
diff --git a/src/store/protocols.ts b/src/store/protocols.ts
index ff784d5a..3b22a955 100644
--- a/src/store/protocols.ts
+++ b/src/store/protocols.ts
@@ -1,22 +1,15 @@
-import strkfarmLogo from '@public/logo.png';
+import trovesLogo from '@public/logo.png';
import { atom } from 'jotai';
import CarmineAtoms, { carmine } from './carmine.store';
import EkuboAtoms, { ekubo } from './ekobu.store';
import EndurAtoms, { endur } from './endur.store';
-import HaikoAtoms, { haiko } from './haiko.store';
-import HashstackAtoms, { hashstack } from './hashstack.store';
-import MySwapAtoms, { mySwap } from './myswap.store';
import NostraDegenAtoms, { nostraDegen } from './nostradegen.store';
import NostraDexAtoms, { nostraDex } from './nostradex.store';
import NostraLendingAtoms, { nostraLending } from './nostralending.store';
import { Category, isPoolRetired, PoolInfo, PoolType } from './pools';
-import STRKFarmAtoms, {
- strkfarm,
- STRKFarmStrategyAPIResult,
-} from './strkfarm.atoms';
+import { getLiveStatusEnum } from '@/utils/strategyStatus';
+import TrovesAtoms, { troves, TrovesStrategyAPIResult } from './troves.atoms';
import VesuAtoms, { vesu } from './vesu.store';
-import ZkLendAtoms, { zkLend } from './zklend.store';
-import { getLiveStatusEnum } from '@/strategies/IStrategy';
export const getProtocols = () => [
{
@@ -25,9 +18,9 @@ export const getProtocols = () => [
atoms: EndurAtoms,
},
{
- name: strkfarm.name,
- class: strkfarm,
- atoms: STRKFarmAtoms,
+ name: troves.name,
+ class: troves,
+ atoms: TrovesAtoms,
},
{
name: ekubo.name,
@@ -39,21 +32,11 @@ export const getProtocols = () => [
// class: jedi,
// atoms: JediAtoms,
// },
- {
- name: mySwap.name,
- class: mySwap,
- atoms: MySwapAtoms,
- },
// {
// name: tenkswap.name,
// class: tenkswap,
// atoms: TenkSwapAtoms,
// },
- {
- name: haiko.name,
- class: haiko,
- atoms: HaikoAtoms,
- },
{
name: nostraDex.name,
class: nostraDex,
@@ -79,21 +62,11 @@ export const getProtocols = () => [
// class: sithswap,
// atoms: SithswapAtoms,
// },
- {
- name: zkLend.name,
- class: zkLend,
- atoms: ZkLendAtoms,
- },
{
name: nostraLending.name,
class: nostraLending,
atoms: NostraLendingAtoms,
},
- {
- name: hashstack.name,
- class: hashstack,
- atoms: HashstackAtoms,
- },
{
name: vesu.name,
class: vesu,
@@ -177,7 +150,7 @@ export const allPoolsAtomUnSorted = atom((get) => {
});
export function getPoolInfoFromStrategy(
- strat: STRKFarmStrategyAPIResult,
+ strat: TrovesStrategyAPIResult,
): PoolInfo {
const category = [Category.Others];
if (strat.name.includes('STRK')) {
@@ -194,9 +167,9 @@ export function getPoolInfoFromStrategy(
logos: [...strat.logos],
},
protocol: {
- name: 'STRKFarm',
+ name: 'Troves',
link: `/strategy/${strat.id}`,
- logo: strkfarmLogo.src,
+ logo: trovesLogo.src,
},
tvl: strat.tvlUsd,
apr: strat.apy,
@@ -230,7 +203,7 @@ export function getPoolInfoFromStrategy(
item.aprSplits.push({
apr: strat.apySplit.rewardsApy,
title: 'Rewards APY',
- description: 'Additional incentives by STRKFarm',
+ description: 'Additional incentives by Troves',
});
}
return item;
diff --git a/src/store/strategies.atoms.tsx b/src/store/strategies.atoms.tsx
index 3414d656..056cb4c3 100755
--- a/src/store/strategies.atoms.tsx
+++ b/src/store/strategies.atoms.tsx
@@ -14,7 +14,7 @@ import { AutoTokenStrategy } from '@/strategies/auto_strk.strat';
import { DeltaNeutralMM } from '@/strategies/delta_neutral_mm';
import { DeltaNeutralMM2 } from '@/strategies/delta_neutral_mm_2';
import { DeltaNeutralMMVesuEndur } from '@/strategies/delta_neutral_mm_vesu_endur';
-import { Box, Link } from '@chakra-ui/react';
+import { Box, Link, Text } from '@chakra-ui/react';
import { EkuboCLVaultStrategies, VesuRebalanceStrategies } from '@strkfarm/sdk';
import { VesuRebalanceStrategy } from '@/strategies/vesu_rebalance';
import { atomWithQuery } from 'jotai-tanstack-query';
@@ -34,7 +34,7 @@ export function getStrategies() {
Deposits are expected to fail for this strategy due to an ongoing
zkLend security incident until further notice.{' '}
@@ -49,10 +49,10 @@ export function getStrategies() {
text: (
You will receive withdrawals as zTokens, redeemable on zkLend.
- However, redemptions may be affected due to an ongoing security
- incident.{' '}
+ However, since zkLend is exploited, redemptions may not be in full
+ value.{' '}
@@ -67,7 +67,7 @@ export function getStrategies() {
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 STRKFarm. You can withdraw anytime by redeeming your frmzSTRK for zSTRK and see your STRK in zkLend.",
+ "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.",
'zSTRK',
CONSTANTS.CONTRACTS.AutoStrkFarm,
{
@@ -81,7 +81,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 STRKFarm. You can withdraw anytime by redeeming your frmzUSDC for zUSDC and see your STRK in zkLend.",
+ "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.",
'zUSDC',
CONSTANTS.CONTRACTS.AutoUsdcFarm,
{
@@ -99,9 +99,9 @@ export function getStrategies() {
text: (
Deposits and Withdraws are paused for this strategy due to zkLend
- security incident until further notice.{' '}
+ security incident. This vault is retired.{' '}
@@ -113,12 +113,30 @@ export function getStrategies() {
},
];
- const DNMMDescription = `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 STRKFarm. You can withdraw anytime by redeeming your NFT for {{token1}}.`;
+ 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,
'USDC Sensei',
- Mustache.render(DNMMDescription, { token1: 'USDC', token2: 'ETH' }),
+ DNMMDescription('USDC', 'ETH'),
'ETH',
CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH,
[1, 0.615384615, 1, 0.584615385, 0.552509024], // precomputed factors based on strategy math
@@ -135,7 +153,7 @@ export function getStrategies() {
const deltaNeutralMMETHUSDC = new DeltaNeutralMM(
getTokenInfoFromName('ETH'),
'ETH Sensei',
- Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }),
+ DNMMDescription('ETH', 'USDC'),
'USDC',
CONSTANTS.CONTRACTS.DeltaNeutralMMETHUSDC,
[1, 0.609886, 1, 0.920975, 0.510078], // precomputed factors based on strategy math
@@ -151,7 +169,7 @@ export function getStrategies() {
const deltaNeutralMMSTRKETH = new DeltaNeutralMM(
getTokenInfoFromName('STRK'),
'STRK Sensei',
- Mustache.render(DNMMDescription, { token1: 'STRK', token2: 'ETH' }),
+ DNMMDescription('STRK', 'ETH'),
'ETH',
CONSTANTS.CONTRACTS.DeltaNeutralMMSTRKETH,
[1, 0.384615, 1, 0.492308, 0.233276], // precomputed factors based on strategy math, last is the excess deposit1 that is happening
@@ -168,7 +186,7 @@ export function getStrategies() {
const deltaNeutralMMETHUSDCReverse = new DeltaNeutralMM2(
getTokenInfoFromName('ETH'),
'ETH Sensei XL',
- Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }),
+ DNMMDescription('ETH', 'USDC'),
'USDC',
CONSTANTS.CONTRACTS.DeltaNeutralMMETHUSDCXL,
[1, 0.5846153846, 1, 0.920975, 0.552509], // precomputed factors based on strategy math
@@ -182,7 +200,7 @@ export function getStrategies() {
},
);
- const xSTRKDescription = `Deposit your {{token1}} to automatically loop your funds via Endur and Vesu 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 STRKFarm. You can withdraw anytime by redeeming your NFT for {{token2}}.`;
+ const xSTRKDescription = `Deposit your {{token1}} to automatically loop your funds via Endur and Vesu 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}}.`;
const deltaNeutralxSTRKSTRK = new DeltaNeutralMMVesuEndur(
getTokenInfoFromName('STRK'),
'xSTRK Sensei',
@@ -196,8 +214,22 @@ export function getStrategies() {
alerts: [
// {
// type: 'warning',
- // text: 'Note: Deposits may fail sometimes due to high utilisation on Vesu. We are working to add a dynamic TVL limit to better show limits.',
- // tab: 'deposit',
+ // text: (
+ //
+ // Note: Vesu has recently migrated. Deposits and
+ // withdrawals for this strategy are temporarily paused until we
+ // migrate this strategy.{' '}
+ //
+ // Learn more
+ //
+ // .
+ //
+ // ),
+ // tab: 'all',
// },
{
type: 'info',
@@ -205,6 +237,8 @@ export function getStrategies() {
tab: 'all',
},
],
+ isPaused: false,
+ isInMaintenance: false,
isAudited: false,
quoteToken: convertToV2TokenInfo(getTokenInfoFromName('STRK')),
},
@@ -216,13 +250,34 @@ export function getStrategies() {
v.name,
v.description as string,
v,
- StrategyLiveStatus.HOT,
+ StrategyLiveStatus.ACTIVE,
{
maxTVL: 0,
isAudited: v.auditUrl ? true : false,
auditUrl: v.auditUrl,
isPaused: false,
- alerts: [],
+ isInMaintenance: false,
+ alerts: [
+ // {
+ // type: 'warning',
+ // text: (
+ //
+ // Note: Vesu has recently migrated. Deposits and
+ // withdrawals for this strategy are temporarily paused until we
+ // migrate this strategy.{' '}
+ //
+ // Learn more
+ //
+ // .
+ //
+ // ),
+ // tab: 'all',
+ // },
+ ],
quoteToken: convertToV2TokenInfo(
getTokenInfoFromName(v.depositTokens[0]?.symbol || ''),
),
@@ -230,7 +285,7 @@ export function getStrategies() {
);
});
- const ekuboCLStrats = EkuboCLVaultStrategies.map((v) => {
+ const ekuboCLStrats = [EkuboCLVaultStrategies[0]].map((v) => {
return new EkuboClStrategy(
v.name,
v.description as ReactNode,
@@ -258,8 +313,8 @@ export function getStrategies() {
// const xSTRKStrategy = new AutoXSTRKStrategy(
// 'Stake STRK',
- // 'Endur is Starknet’s dedicated staking platform, where you can stake STRK to earn staking rewards. This strategy, built on Endur, is an incentivized vault that boosts returns by offering additional rewards. In the future, it may transition to auto-compounding on DeFi Spring, reinvesting rewards for maximum growth. Changes will be announced at least three days in advance on our socials.',
- // CONSTANTS.CONTRACTS.AutoxSTRKFarm,
+ // 'Endur is Starknet's dedicated staking platform, where you can stake STRK to earn staking rewards. This strategy, built on Endur, is an incentivized vault that boosts returns by offering additional rewards. In the future, it may transition to auto-compounding on DeFi Spring, reinvesting rewards for maximum growth. Changes will be announced at least three days in advance on our socials.',
+ // CONSTANTS.CONTRACTS.AutoxTroves,
// {
// maxTVL: 2000000,
// alerts: [],
diff --git a/src/store/transactions.atom.ts b/src/store/transactions.atom.ts
index 47558680..71e915da 100755
--- a/src/store/transactions.atom.ts
+++ b/src/store/transactions.atom.ts
@@ -85,10 +85,10 @@ export const TxHistoryAtom = (contract: string, owner: string) =>
// balData just to trigger a refetch
queryKey: ['tx_history', contract, owner, JSON.stringify(get(newTxsAtom))],
queryFn: async ({ queryKey }: any): Promise => {
- const [, { contract, owner }] = queryKey;
+ // const [, { contract, owner }] = queryKey;
const res = await getTxHistory(contract, owner);
- console.log('TxHistoryAtom res', res, contract, owner, queryKey);
+ console.log('TxHistoryAtom res', res, { contract, owner, queryKey });
// add new txs from local cache
const newTxs = get(newTxsAtom);
console.log('TxHistoryAtom newTxs', newTxs);
@@ -180,18 +180,6 @@ async function waitForTransaction(
tx.status = 'success';
txs.push(tx);
set(transactionsAtom, txs);
-
- let newTxs = get(newTxsAtom);
- console.log('waitForTransaction newTxs', newTxs);
- const txExists = newTxs.find(
- (t) => t.txHash.toLowerCase() === tx.txHash.toLowerCase(),
- );
- console.log('waitForTransaction txExists', txExists);
- if (!txExists) {
- newTxs = [...newTxs, tx];
- console.log('waitForTransaction newTxs2', newTxs);
- set(newTxsAtom, newTxs);
- }
}
// Somehow waitForTransaction is giving delayed confirmation
diff --git a/src/store/strkfarm.atoms.ts b/src/store/troves.atoms.ts
similarity index 77%
rename from src/store/strkfarm.atoms.ts
rename to src/store/troves.atoms.ts
index 79acf8b3..f6480864 100644
--- a/src/store/strkfarm.atoms.ts
+++ b/src/store/troves.atoms.ts
@@ -1,5 +1,5 @@
import CONSTANTS from '@/constants';
-import strkfarmLogo from '@public/logo.png';
+import trovesLogo from '@public/logo.png';
import { atom } from 'jotai';
import { atomWithQuery, AtomWithQueryResult } from 'jotai-tanstack-query';
import { IDapp } from './IDapp.store';
@@ -12,10 +12,10 @@ import {
PoolType,
ProtocolAtoms,
} from './pools';
+import { getLiveStatusEnum } from '@/utils/strategyStatus';
import { IInvestmentFlow } from '@strkfarm/sdk';
-import { getLiveStatusEnum } from '@/strategies/IStrategy';
-export interface STRKFarmStrategyAPIResult {
+export interface TrovesStrategyAPIResult {
name: string;
id: string;
apy: number;
@@ -57,13 +57,13 @@ export interface STRKFarmStrategyAPIResult {
investmentFlows: IInvestmentFlow[];
}
-export class STRKFarm extends IDapp {
- name = 'STRKFarm';
- logo = strkfarmLogo.src;
+export class Troves extends IDapp {
+ name = 'Troves';
+ logo = trovesLogo.src;
incentiveDataKey = '';
_computePoolsInfo(data: any) {
- const rawPools: STRKFarmStrategyAPIResult[] = data.strategies;
+ const rawPools: TrovesStrategyAPIResult[] = data.strategies;
const pools: PoolInfo[] = [];
return rawPools.map((rawPool) => {
const poolName = rawPool.name;
@@ -77,7 +77,7 @@ export class STRKFarm extends IDapp {
rewardsApy.push({
apr: rawPool.apySplit.rewardsApy,
title: 'Rewards APY',
- description: 'Incentives by STRKFarm',
+ description: 'Incentives by Troves',
});
}
@@ -121,7 +121,7 @@ export class STRKFarm extends IDapp {
}
getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) {
- const aprData: STRKFarmStrategyAPIResult[] = data.data.strategies;
+ const aprData: TrovesStrategyAPIResult[] = data.data.strategies;
let baseAPY: number | 'Err' = 'Err';
let splitApr: APRSplit | null = null;
const metadata: PoolMetadata | null = null;
@@ -144,31 +144,31 @@ export class STRKFarm extends IDapp {
}
}
-export const STRKFarmBaseAPYsAtom = atomWithQuery((get) => ({
- queryKey: ['strkfarm_base_aprs'],
+export const TrovesBaseAPYsAtom = atomWithQuery((get) => ({
+ queryKey: ['troves_base_aprs'],
queryFn: async ({
queryKey,
}): Promise<{
- strategies: STRKFarmStrategyAPIResult[];
+ strategies: TrovesStrategyAPIResult[];
}> => {
- const response = await fetch(`${CONSTANTS.STRKFarm.BASE_APR_API}`);
+ const response = await fetch(`${CONSTANTS.Troves.BASE_APR_API}`);
const data = await response.json();
return data;
},
}));
-export const strkfarm = new STRKFarm();
-const STRKFarmAtoms: ProtocolAtoms = {
- baseAPRs: STRKFarmBaseAPYsAtom,
+export const troves = new Troves();
+const TrovesAtoms: ProtocolAtoms = {
+ baseAPRs: TrovesBaseAPYsAtom,
pools: atom((get) => {
const empty: PoolInfo[] = [];
- if (!STRKFarmAtoms.baseAPRs) return empty;
- const baseInfo = get(STRKFarmAtoms.baseAPRs);
+ if (!TrovesAtoms.baseAPRs) return empty;
+ const baseInfo = get(TrovesAtoms.baseAPRs);
if (baseInfo.data) {
- const pools = strkfarm._computePoolsInfo(baseInfo.data);
- return strkfarm.addBaseAPYs(pools, baseInfo);
+ const pools = troves._computePoolsInfo(baseInfo.data);
+ return troves.addBaseAPYs(pools, baseInfo);
}
return empty;
}),
};
-export default STRKFarmAtoms;
+export default TrovesAtoms;
diff --git a/src/strategies/IStrategy.ts b/src/strategies/IStrategy.ts
index bee05523..33b12dee 100755
--- a/src/strategies/IStrategy.ts
+++ b/src/strategies/IStrategy.ts
@@ -118,6 +118,7 @@ export interface IStrategySettings {
isAudited?: boolean;
auditUrl?: string;
isPaused?: boolean;
+ isInMaintenance?: boolean;
quoteToken: TokenInfoV2; // used to show the holdings in this token,
isTransactionHistDisabled?: boolean;
}
@@ -190,10 +191,7 @@ export class IStrategyProps {
];
getSafetyFactorLine() {
- let factorLevel = 'Low';
- if (this.riskFactor > 2) factorLevel = 'Medium';
- if (this.riskFactor >= 4) factorLevel = 'High';
- return `Risk factor: ${this.riskFactor}/5 (${factorLevel} risk)`;
+ return `Risk factor: ${this.riskFactor}/5`;
}
depositMethods = async (
@@ -525,3 +523,16 @@ export function getLiveStatusEnum(status: number) {
}
return StrategyLiveStatus.RETIRED;
}
+
+export const getRiskString = (riskValue: number): string => {
+ if (riskValue === 0) {
+ return 'No risk';
+ } else if (riskValue <= 1) {
+ return 'Very Low';
+ } else if (riskValue <= 2) {
+ return 'Low';
+ } else if (riskValue < 3) {
+ return 'Medium';
+ }
+ return 'High';
+};
diff --git a/src/strategies/auto_strk.strat.ts b/src/strategies/auto_strk.strat.ts
index 575d091e..212d8e0d 100755
--- a/src/strategies/auto_strk.strat.ts
+++ b/src/strategies/auto_strk.strat.ts
@@ -77,12 +77,16 @@ export class AutoTokenStrategy extends IStrategy {
],
protocols: [],
maxTVL: new Web3Number('0', tokenInfo.decimals),
+ launchBlock: 0,
+ faqs: [],
risk: {
riskFactor: [],
netRisk: 0,
notARisks: [],
},
additionalInfo: undefined,
+ contractDetails: [],
+ investmentSteps: [],
};
super(
`auto_token_${token.toLowerCase()}`,
diff --git a/src/strategies/auto_xstrk.strat.ts b/src/strategies/auto_xstrk.strat.ts
index cbb7995c..57323f30 100644
--- a/src/strategies/auto_xstrk.strat.ts
+++ b/src/strategies/auto_xstrk.strat.ts
@@ -74,6 +74,8 @@ export class AutoXSTRKStrategy extends IStrategy {
displayDecimals: tokenInfo.displayDecimals,
},
],
+ launchBlock: 0,
+ faqs: [],
protocols: [],
maxTVL: new Web3Number('0', tokenInfo.decimals),
risk: {
@@ -82,6 +84,8 @@ export class AutoXSTRKStrategy extends IStrategy {
notARisks: [],
},
additionalInfo: undefined,
+ contractDetails: [],
+ investmentSteps: [],
};
const token = 'STRK';
diff --git a/src/strategies/delta_neutral_mm.ts b/src/strategies/delta_neutral_mm.ts
index ca143b5a..e3ee8fb3 100755
--- a/src/strategies/delta_neutral_mm.ts
+++ b/src/strategies/delta_neutral_mm.ts
@@ -34,6 +34,7 @@ import {
import { atom } from 'jotai';
import { IDapp } from '@/store/IDapp.store';
import { ContractAddr, IStrategyMetadata, Web3Number } from '@strkfarm/sdk';
+import React from 'react';
export class DeltaNeutralMM extends IStrategy {
riskFactor = 0.75;
@@ -49,7 +50,7 @@ export class DeltaNeutralMM extends IStrategy {
constructor(
token: TokenInfo,
name: string,
- description: string,
+ description: string | React.ReactNode,
secondaryTokenName: TokenName,
strategyAddress: string,
stepAmountFactors: number[],
@@ -84,6 +85,8 @@ export class DeltaNeutralMM extends IStrategy {
displayDecimals: tokenInfo.displayDecimals,
},
],
+ launchBlock: 0,
+ faqs: [],
protocols: [],
maxTVL: new Web3Number('0', tokenInfo.decimals),
risk: {
@@ -91,7 +94,9 @@ export class DeltaNeutralMM extends IStrategy {
netRisk: 0,
notARisks: [],
},
+ contractDetails: [],
additionalInfo: undefined,
+ investmentSteps: [],
};
super(
diff --git a/src/strategies/delta_neutral_mm_2.ts b/src/strategies/delta_neutral_mm_2.ts
index d6915afa..35514f70 100644
--- a/src/strategies/delta_neutral_mm_2.ts
+++ b/src/strategies/delta_neutral_mm_2.ts
@@ -16,12 +16,13 @@ import {
} from '@/utils';
import { getERC20Balance } from '@/store/balance.atoms';
import { Web3Number } from '@strkfarm/sdk';
+import React from 'react';
export class DeltaNeutralMM2 extends DeltaNeutralMM {
constructor(
token: TokenInfo,
name: string,
- description: string,
+ description: string | React.ReactNode,
secondaryTokenName: TokenName,
strategyAddress: string,
stepAmountFactors: number[],
diff --git a/src/strategies/delta_neutral_mm_vesu_endur.ts b/src/strategies/delta_neutral_mm_vesu_endur.ts
index fe981248..572c62e1 100644
--- a/src/strategies/delta_neutral_mm_vesu_endur.ts
+++ b/src/strategies/delta_neutral_mm_vesu_endur.ts
@@ -48,10 +48,19 @@ export class DeltaNeutralMMVesuEndur extends DeltaNeutralMM {
vesu,
);
+ this.metadata.points = [
+ {
+ multiplier: 3,
+ toolTip:
+ 'Earn ~3x Endur points on this leveraged strategy. Points can be found on endur.fi.',
+ logo: 'https://endur.fi/favicon.ico',
+ },
+ ];
+ this.metadata.risk.netRisk = 0.75;
const risks = [this.risks[0], this.risks[2]];
if (this.settings.alerts && this.settings.alerts.length > 0) {
risks.push(
- (this.settings.alerts[0].text as string).replace('Note: ', ''),
+ 'If xSTRK price on DEXes deviates from expected price, you may lose money or may have to wait for the price to recover.',
);
}
risks.push(...this.risks.slice(3));
diff --git a/src/strategies/ekubo_cl_vault.ts b/src/strategies/ekubo_cl_vault.ts
index 3d5e3339..04322224 100644
--- a/src/strategies/ekubo_cl_vault.ts
+++ b/src/strategies/ekubo_cl_vault.ts
@@ -136,19 +136,25 @@ export class EkuboClStrategy extends IStrategy {
const changes = args[0];
const allAmounts = args[1];
console.log('onAmountsChange [1.1]', changes, allAmounts);
- const isToken0Change = changes.index == 0;
+ const isToken0Change = changes.index === 0;
const input = {
token0: isToken0Change
? {
...changes.amountInfo,
}
: {
- amount: Web3Number.fromWei('0', allAmounts[0].tokenInfo.decimals),
+ amount: Web3Number.fromWei(
+ '0',
+ allAmounts[0].tokenInfo?.decimals || 0,
+ ),
tokenInfo: allAmounts[0].tokenInfo,
},
token1: isToken0Change
? {
- amount: Web3Number.fromWei('0', allAmounts[1].tokenInfo.decimals),
+ amount: Web3Number.fromWei(
+ '0',
+ allAmounts[1].tokenInfo?.decimals || 0,
+ ),
tokenInfo: allAmounts[1].tokenInfo,
}
: { ...changes.amountInfo },
diff --git a/src/style.ts b/src/style.ts
new file mode 100644
index 00000000..c828195e
--- /dev/null
+++ b/src/style.ts
@@ -0,0 +1,21 @@
+export const MYSTYLES = {
+ TEXT: {
+ H2Label: {
+ fontSize: { base: '15px', md: '18px' },
+ color: 'text_secondary',
+ },
+ H1Label: {
+ fontSize: { base: '20px', md: '24px' },
+ color: 'text_primary',
+ },
+ },
+ TOOLTIP: {
+ STANDARD: {
+ bg: 'mybg',
+ padding: '16px',
+ borderRadius: 'lg',
+ borderWidth: '2px',
+ borderColor: 'mycard',
+ },
+ },
+};
diff --git a/src/utils.ts b/src/utils.ts
index 662fcd71..f2ca90a3 100755
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -74,16 +74,17 @@ export function standariseAddress(address: string | bigint) {
}
export const MyMenuListProps: MenuListProps = {
- bg: 'highlight',
- color: 'white',
- borderColor: 'bg',
+ bg: 'mycard_light_2x',
+ color: 'text_primary',
+ borderColor: 'mycard',
+ boxShadow: '0px 0px 3px var(--chakra-colors-mycard_light_2x)',
padding: 0,
};
export const MyMenuItemProps: MenuItemProps = {
- bg: 'highlight',
+ bg: 'mycard_light_2x',
_hover: {
- bg: 'bg',
+ bg: 'mycard_light',
},
};
@@ -114,8 +115,8 @@ export function generateReferralCode() {
export function getReferralUrl(referralCode: string) {
if (
- window.location.origin.includes('app.strkfarm.xyz') ||
- window.location.origin.includes('app.strkfarm.com')
+ window.location.origin.includes('app.troves.fi') ||
+ window.location.origin.includes('app.troves.fi')
) {
return `https://${getHosturl()}/r/${referralCode}`;
}
@@ -131,7 +132,7 @@ export function getDisplayCurrencyAmount(
});
}
-// returns time to endtime in days, hours, minutes
+// returns time to endtime in days, hours, minutes, seconds
export function formatTimediff(endTime: Date) {
const now = new Date();
if (now.getTime() >= endTime.getTime()) {
@@ -139,11 +140,12 @@ export function formatTimediff(endTime: Date) {
days: 0,
hours: 0,
minutes: 0,
+ seconds: 0,
isZero: true,
};
}
- // else return number of days, months, weeks, hours, minutrs, seconds to endtime
+ // else return number of days, months, weeks, hours, minutes, seconds to endtime
const diff = endTime.getTime() - now.getTime();
// get days floor
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
@@ -151,11 +153,14 @@ export function formatTimediff(endTime: Date) {
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
// after accounting days and hours, get remaining minutes
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
+ // after accounting days, hours and minutes, get remaining seconds
+ const seconds = Math.floor((diff % (1000 * 60)) / 1000);
return {
days,
hours,
minutes,
+ seconds,
isZero: false,
};
}
@@ -193,18 +198,25 @@ export function getEndpoint() {
return (
(typeof window === 'undefined'
? process.env.HOSTNAME
- : window.location.origin) || 'https://app.strkfarm.com'
+ : window.location.origin) || 'https://app.troves.fi'
);
}
export function getHosturl() {
- const FALLBACK = 'strkfarm.com';
+ const FALLBACK = 'troves.fi';
try {
- return (
- (typeof window !== 'undefined'
- ? window.location.hostname.split('.').slice(-2).join('.')
- : null) || FALLBACK
- );
+ if (typeof window !== 'undefined') {
+ const hostname = window.location.hostname;
+ // Check if hostname is an IPv4 or IPv6 address
+ /* prettier-ignore */
+ /* eslint-disable */
+ const isIP =
+ /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname) || // IPv4
+ /^\[?([a-fA-F0-9:]+)\]?$/.test(hostname); // IPv6 (with or without brackets)
+ if (isIP) return FALLBACK;
+ return hostname.split('.').slice(-2).join('.');
+ }
+ return FALLBACK;
} catch (e) {
return FALLBACK;
}
diff --git a/src/utils/strategyStatus.ts b/src/utils/strategyStatus.ts
new file mode 100644
index 00000000..74e72d4a
--- /dev/null
+++ b/src/utils/strategyStatus.ts
@@ -0,0 +1,29 @@
+import { StrategyLiveStatus } from '@/strategies/IStrategy';
+
+export function getLiveStatusNumber(status: StrategyLiveStatus) {
+ if (status == StrategyLiveStatus.HOT) {
+ return 1;
+ }
+ if (status == StrategyLiveStatus.NEW) {
+ return 2;
+ } else if (status == StrategyLiveStatus.ACTIVE) {
+ return 3;
+ } else if (status == StrategyLiveStatus.COMING_SOON) {
+ return 4;
+ }
+ return 5;
+}
+
+export function getLiveStatusEnum(status: number) {
+ if (status == 1) {
+ return StrategyLiveStatus.HOT;
+ }
+ if (status == 2) {
+ return StrategyLiveStatus.NEW;
+ } else if (status == 3) {
+ return StrategyLiveStatus.ACTIVE;
+ } else if (status == 4) {
+ return StrategyLiveStatus.COMING_SOON;
+ }
+ return StrategyLiveStatus.RETIRED;
+}
diff --git a/vercel.json b/vercel.json
index e597d0f8..f6218dda 100644
--- a/vercel.json
+++ b/vercel.json
@@ -1,16 +1,3 @@
{
- "crons": [
- {
- "path": "/api/raffle/luckyWinner?winnersCount=3",
- "schedule": "0 8 * * *"
- },
- {
- "path": "/api/strategies?no_cache=true",
- "schedule": "*/9 * * * *"
- },
- {
- "path": "/api/stats?no_cache=true",
- "schedule": "*/9 * * * *"
- }
- ]
+ "crons": []
}
diff --git a/yarn.lock b/yarn.lock
index cd5018b7..d79c400d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -40,12 +40,7 @@
tslib "^2.3.0"
zen-observable-ts "^1.2.5"
-"@avnu/avnu-sdk@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@avnu/avnu-sdk/-/avnu-sdk-3.0.0.tgz#e4cb63d26aa6c244040963fcef44e2d95c15cba9"
- integrity sha512-BqqazrXDKn5RE1anyl9Ba+Kd/4VaKNsdKTl0ryTfXhMIYp+R4dXMaLD40emfXd+25kxM00xPKiZOiGHl2ntG5g==
-
-"@avnu/avnu-sdk@^3.0.2":
+"@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"
integrity sha512-N8McoXYEcp1uhSZ4XlEi5BcTpvJDDhUw4kYnlYmPrd7fWezfGy4UHyoFT/A4gqEM4nL3vtENczDNFS1AVfdTnA==
@@ -1421,9 +1416,9 @@
yoctocolors-cjs "^2.1.2"
"@inquirer/figures@^1.0.5", "@inquirer/figures@^1.0.6":
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.11.tgz#4744e6db95288fea1dead779554859710a959a21"
- integrity sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.12.tgz#667d6254cc7ba3b0c010a323d78024a1d30c6053"
+ integrity sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==
"@inquirer/input@^2.3.0":
version "2.3.0"
@@ -1695,13 +1690,6 @@
dependencies:
"@noble/hashes" "1.3.2"
-"@noble/curves@1.7.0", "@noble/curves@~1.7.0":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45"
- integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==
- dependencies:
- "@noble/hashes" "1.6.0"
-
"@noble/curves@1.8.1", "@noble/curves@^1.6.0", "@noble/curves@~1.8.1":
version "1.8.1"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff"
@@ -1738,21 +1726,11 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426"
integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
-"@noble/hashes@1.6.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5"
- integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==
-
"@noble/hashes@1.7.1", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f"
integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==
-"@noble/hashes@~1.6.0":
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5"
- integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==
-
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1922,28 +1900,15 @@
dependencies:
"@prisma/debug" "5.18.0"
-"@puppeteer/browsers@2.10.0":
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.10.0.tgz#a6e55bf85bfcc819e5e8c79f6122cccaa52515a4"
- integrity sha512-HdHF4rny4JCvIcm7V1dpvpctIGqM3/Me255CB44vW7hDG1zYMmcBMjpNqZEDxdCfXGLkx5kP0+Jz5DUS+ukqtA==
- dependencies:
- debug "^4.4.0"
- extract-zip "^2.0.1"
- progress "^2.0.3"
- proxy-agent "^6.5.0"
- semver "^7.7.1"
- tar-fs "^3.0.8"
- yargs "^17.7.2"
-
"@redis/bloom@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71"
integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==
-"@redis/client@1.6.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.6.0.tgz#dcf4ae1319763db6fdddd6de7f0af68a352c30ea"
- integrity sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==
+"@redis/client@1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.6.1.tgz#c4636b7cb34e96008a988409b7e787364ae761a2"
+ integrity sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==
dependencies:
cluster-key-slot "1.1.2"
generic-pool "3.9.0"
@@ -1979,11 +1944,6 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1"
integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==
-"@scure/base@1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865"
- integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==
-
"@scure/base@~1.1.3":
version "1.1.9"
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1"
@@ -2011,14 +1971,6 @@
"@noble/hashes" "~1.7.1"
"@scure/base" "~1.2.4"
-"@scure/starknet@1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.1.0.tgz#d1902e053d98196e161b9b2c3996b20999094e7a"
- integrity sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ==
- dependencies:
- "@noble/curves" "~1.7.0"
- "@noble/hashes" "~1.6.0"
-
"@scure/starknet@~1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.0.0.tgz#4419bc2fdf70f3dd6cb461d36c878c9ef4419f8c"
@@ -2205,26 +2157,22 @@
viem "^2.19.1"
zod "^3.22.4"
-"@strkfarm/sdk@^1.0.35":
- version "1.0.35"
- resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.0.35.tgz#307cd2beb53cb12bc66c4aab08560ff5b316ca5e"
- integrity sha512-QG1Oes92QwUvusG8kY8GFWE3CxHr5Zde/ZM9bU1DhwGk0FRMkj0TbN19pNnVOEv4Odw9Tj990uISFphBm/mhHw==
+"@strkfarm/sdk@^1.0.51":
+ version "1.0.51"
+ resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.0.51.tgz#7958e24336c07c7dbba6a76cbe91e45b1f968bbd"
+ integrity sha512-cE9YI+6kmbBlMtpTC96wZ0P1wn2zvIIfsWO3h9bKPgb2jwO+4qWFW2vT+lS3WLtX0TzK6diN2U15WlxKKtM1mA==
dependencies:
- "@avnu/avnu-sdk" "^3.0.2"
- axios "^1.7.2"
+ "@avnu/avnu-sdk" "3.0.2"
bignumber.js "4.0.4"
browser-assert "^1.2.1"
chalk "^4.1.2"
commander "^12.1.0"
ethers "^6.13.5"
- form-data "^4.0.2"
inquirer "^10.1.2"
node-telegram-bot-api "^0.66.0"
proxy-from-env "^1.1.0"
- puppeteer "^24.4.0"
redis "^4.7.0"
stacktrace-js "^2.0.2"
- starknet "^6.11.0"
winston "^3.13.0"
"@swc/helpers@0.5.2":
@@ -2251,11 +2199,6 @@
dependencies:
"@tanstack/query-core" "5.59.0"
-"@tootallnate/quickjs-emscripten@^0.23.0":
- version "0.23.0"
- resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c"
- integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
-
"@trpc/client@^10.38.1":
version "10.45.2"
resolved "https://registry.yarnpkg.com/@trpc/client/-/client-10.45.2.tgz#15f9ba81303bf3417083fc6bb742e4e86b49da90"
@@ -2351,12 +2294,12 @@
dependencies:
"@types/node" "*"
-"@types/node@*", "@types/node@^22.5.5":
- version "22.14.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.14.1.tgz#53b54585cec81c21eee3697521e31312d6ca1e6f"
- integrity sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==
+"@types/node@*":
+ version "24.0.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.3.tgz#f935910f3eece3a3a2f8be86b96ba833dc286cab"
+ integrity sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==
dependencies:
- undici-types "~6.21.0"
+ undici-types "~7.8.0"
"@types/node@18.15.13":
version "18.15.13"
@@ -2377,6 +2320,13 @@
dependencies:
undici-types "~6.19.2"
+"@types/node@^22.5.5":
+ version "22.15.32"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.32.tgz#c301cc2275b535a5e54bb81d516b1d2e9afe06e5"
+ integrity sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==
+ dependencies:
+ undici-types "~6.21.0"
+
"@types/normalize-package-data@^2.4.1":
version "2.4.4"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
@@ -2429,13 +2379,6 @@
resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd"
integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==
-"@types/yauzl@^2.9.1":
- version "2.10.3"
- resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
- integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
- dependencies:
- "@types/node" "*"
-
"@typescript-eslint/eslint-plugin@7.7.0":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3"
@@ -2870,7 +2813,7 @@ JSONStream@^1.3.5:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
-abi-wan-kanabi@^2.2.2, abi-wan-kanabi@^2.2.3:
+abi-wan-kanabi@^2.2.2:
version "2.2.4"
resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.4.tgz#47ebbafbb7f8df81773efbdcca60cdda8008c821"
integrity sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==
@@ -2917,11 +2860,6 @@ agent-base@6:
dependencies:
debug "4"
-agent-base@^7.1.0, agent-base@^7.1.2:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1"
- integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==
-
ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -3159,13 +3097,6 @@ ast-types-flow@^0.0.8:
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6"
integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==
-ast-types@^0.13.4:
- version "0.13.4"
- resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
- integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
- dependencies:
- tslib "^2.0.1"
-
async-mutex@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482"
@@ -3231,25 +3162,11 @@ axios@1.6.7:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
-axios@^1.7.2:
- version "1.8.4"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447"
- integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==
- dependencies:
- follow-redirects "^1.15.6"
- form-data "^4.0.0"
- proxy-from-env "^1.1.0"
-
axobject-query@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
-b4a@^1.6.4:
- version "1.6.7"
- resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4"
- integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==
-
babel-plugin-macros@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
@@ -3264,44 +3181,6 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-bare-events@^2.2.0, bare-events@^2.5.4:
- version "2.5.4"
- resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745"
- integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==
-
-bare-fs@^4.0.1:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.2.tgz#5b048298019f489979d5a6afb480f5204ad4e89b"
- integrity sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==
- dependencies:
- bare-events "^2.5.4"
- bare-path "^3.0.0"
- bare-stream "^2.6.4"
-
-bare-os@^3.0.1:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.1.tgz#9921f6f59edbe81afa9f56910658422c0f4858d4"
- integrity sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==
-
-bare-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178"
- integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==
- dependencies:
- bare-os "^3.0.1"
-
-bare-stream@^2.6.4:
- version "2.6.5"
- resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07"
- integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==
- dependencies:
- streamx "^2.21.0"
-
-basic-ftp@^5.0.2:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0"
- integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==
-
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -3384,11 +3263,6 @@ browserslist@^4.14.5:
node-releases "^2.0.18"
update-browserslist-db "^1.1.0"
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
-
busboy@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
@@ -3503,14 +3377,6 @@ chroma.ts@1.0.10:
resolved "https://registry.yarnpkg.com/chroma.ts/-/chroma.ts-1.0.10.tgz#2b965d8f2c2eee44d25072902e5787fe259d4565"
integrity sha512-0FOQiB6LaiOwoyaxP+a4d3sCIOSf7YvBKj3TfeQM4ZBb2yskRxe4FlT2P4YNpHz7kIB5rXsfmpyniyrYRRyVHw==
-chromium-bidi@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-3.0.0.tgz#bfb0549db96552d42377401aadc0198a1bbb3e9f"
- integrity sha512-ZOGRDAhBMX1uxL2Cm2TDuhImbrsEz5A/tTcVU6RpXEWaTNUNwsHW6njUXizh51Ir6iqHbKAfhA2XK33uBcLo5A==
- dependencies:
- mitt "^3.0.1"
- zod "^3.24.1"
-
citty@^0.1.5, citty@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4"
@@ -3834,16 +3700,6 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
-cosmiconfig@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d"
- integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==
- dependencies:
- env-paths "^2.2.1"
- import-fresh "^3.3.0"
- js-yaml "^4.1.0"
- parse-json "^5.2.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"
@@ -3959,11 +3815,6 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-data-uri-to-buffer@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b"
- integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==
-
data-view-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
@@ -4039,13 +3890,6 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.1.1, debug@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
- integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
- 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"
@@ -4103,15 +3947,6 @@ defu@^6.1.4:
resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479"
integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==
-degenerator@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5"
- integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==
- dependencies:
- ast-types "^0.13.4"
- escodegen "^2.1.0"
- esprima "^4.0.1"
-
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -4142,11 +3977,6 @@ detect-node-es@^1.1.0:
resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
-devtools-protocol@0.0.1425554:
- version "0.0.1425554"
- resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz#51ed2fed1405f56783d24a393f7c75b6bbb58029"
- integrity sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==
-
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@@ -4281,7 +4111,14 @@ enabled@2.0.x:
resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.1.0:
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
+ integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
+ dependencies:
+ once "^1.4.0"
+
+end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -4296,11 +4133,6 @@ enhanced-resolve@^5.15.0:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-env-paths@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
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"
@@ -4368,26 +4200,26 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23
which-typed-array "^1.1.15"
es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9:
- version "1.23.9"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606"
- integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==
+ version "1.24.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328"
+ integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==
dependencies:
array-buffer-byte-length "^1.0.2"
arraybuffer.prototype.slice "^1.0.4"
available-typed-arrays "^1.0.7"
call-bind "^1.0.8"
- call-bound "^1.0.3"
+ call-bound "^1.0.4"
data-view-buffer "^1.0.2"
data-view-byte-length "^1.0.2"
data-view-byte-offset "^1.0.1"
es-define-property "^1.0.1"
es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
+ es-object-atoms "^1.1.1"
es-set-tostringtag "^2.1.0"
es-to-primitive "^1.3.0"
function.prototype.name "^1.1.8"
- get-intrinsic "^1.2.7"
- get-proto "^1.0.0"
+ get-intrinsic "^1.3.0"
+ get-proto "^1.0.1"
get-symbol-description "^1.1.0"
globalthis "^1.0.4"
gopd "^1.2.0"
@@ -4399,21 +4231,24 @@ es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9:
is-array-buffer "^3.0.5"
is-callable "^1.2.7"
is-data-view "^1.0.2"
+ is-negative-zero "^2.0.3"
is-regex "^1.2.1"
+ is-set "^2.0.3"
is-shared-array-buffer "^1.0.4"
is-string "^1.1.1"
is-typed-array "^1.1.15"
- is-weakref "^1.1.0"
+ is-weakref "^1.1.1"
math-intrinsics "^1.1.0"
- object-inspect "^1.13.3"
+ object-inspect "^1.13.4"
object-keys "^1.1.1"
object.assign "^4.1.7"
own-keys "^1.0.1"
- regexp.prototype.flags "^1.5.3"
+ regexp.prototype.flags "^1.5.4"
safe-array-concat "^1.1.3"
safe-push-apply "^1.0.0"
safe-regex-test "^1.1.0"
set-proto "^1.0.0"
+ stop-iteration-iterator "^1.1.0"
string.prototype.trim "^1.2.10"
string.prototype.trimend "^1.0.9"
string.prototype.trimstart "^1.0.8"
@@ -4422,7 +4257,7 @@ es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9:
typed-array-byte-offset "^1.0.4"
typed-array-length "^1.0.7"
unbox-primitive "^1.1.0"
- which-typed-array "^1.1.18"
+ which-typed-array "^1.1.19"
es-define-property@^1.0.0:
version "1.0.0"
@@ -4549,17 +4384,6 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-escodegen@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
- integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
- dependencies:
- esprima "^4.0.1"
- estraverse "^5.2.0"
- esutils "^2.0.2"
- optionalDependencies:
- source-map "~0.6.1"
-
eslint-config-next@14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97"
@@ -4758,7 +4582,7 @@ espree@^9.6.0, espree@^9.6.1:
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
-esprima@^4.0.1, esprima@~4.0.0:
+esprima@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -4801,9 +4625,9 @@ ethers@6.11.1:
ws "8.5.0"
ethers@^6.13.5:
- version "6.13.5"
- resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.5.tgz#8c1d6ac988ac08abc3c1d8fabbd4b8b602851ac4"
- integrity sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==
+ version "6.14.4"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.14.4.tgz#0f6fbc562a8425c7c888da307fa71ef796be0c04"
+ integrity sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==
dependencies:
"@adraffy/ens-normalize" "1.10.1"
"@noble/curves" "1.2.0"
@@ -4857,17 +4681,6 @@ external-editor@^3.1.0:
iconv-lite "^0.4.24"
tmp "^0.0.33"
-extract-zip@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
- integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
- dependencies:
- debug "^4.1.1"
- get-stream "^5.1.0"
- yauzl "^2.10.0"
- optionalDependencies:
- "@types/yauzl" "^2.9.1"
-
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -4883,11 +4696,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-fifo@^1.2.0, fast-fifo@^1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
- integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
-
fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
@@ -4921,13 +4729,6 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
- dependencies:
- pend "~1.2.0"
-
fecha@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
@@ -4941,14 +4742,6 @@ fetch-cookie@^3.0.0:
set-cookie-parser "^2.4.8"
tough-cookie "^5.0.0"
-fetch-cookie@~3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963"
- integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==
- dependencies:
- set-cookie-parser "^2.4.8"
- tough-cookie "^4.0.0"
-
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
@@ -5020,7 +4813,7 @@ focus-lock@^1.3.5:
dependencies:
tslib "^2.0.3"
-follow-redirects@^1.15.4, follow-redirects@^1.15.6:
+follow-redirects@^1.15.4:
version "1.15.9"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
@@ -5061,14 +4854,15 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
-form-data@^4.0.2, form-data@~4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c"
- integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==
+form-data@~4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.3.tgz#608b1b3f3e28be0fccf5901fc85fb3641e5cf0ae"
+ integrity sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
es-set-tostringtag "^2.1.0"
+ hasown "^2.0.2"
mime-types "^2.1.12"
framer-motion@11.0.5:
@@ -5206,7 +5000,7 @@ get-port-please@^3.1.2:
resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49"
integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==
-get-proto@^1.0.0, get-proto@^1.0.1:
+get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
@@ -5236,13 +5030,6 @@ get-starknet@3.3.3:
bowser "^2.11.0"
get-starknet-core "^3.3.3"
-get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
get-stream@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
@@ -5273,15 +5060,6 @@ get-tsconfig@^4.7.5:
dependencies:
resolve-pkg-maps "^1.0.0"
-get-uri@^6.0.1:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7"
- integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==
- dependencies:
- basic-ftp "^5.0.2"
- data-uri-to-buffer "^6.0.2"
- debug "^4.3.4"
-
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -5548,14 +5326,6 @@ hosted-git-info@^7.0.0:
dependencies:
lru-cache "^10.0.1"
-http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
- integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
- dependencies:
- agent-base "^7.1.0"
- debug "^4.3.4"
-
http-shutdown@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f"
@@ -5578,14 +5348,6 @@ https-proxy-agent@5.0.0:
agent-base "6"
debug "4"
-https-proxy-agent@^7.0.6:
- version "7.0.6"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9"
- integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
- dependencies:
- agent-base "^7.1.2"
- debug "4"
-
human-signals@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
@@ -5621,14 +5383,6 @@ 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"
@@ -5686,14 +5440,6 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
-ip-address@^9.0.5:
- version "9.0.5"
- resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
- integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==
- dependencies:
- jsbn "1.1.0"
- sprintf-js "^1.1.3"
-
iron-webcrypto@^1.1.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f"
@@ -6039,7 +5785,7 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
-is-weakref@^1.1.0:
+is-weakref@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293"
integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
@@ -6083,7 +5829,7 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-isomorphic-fetch@^3.0.0, isomorphic-fetch@~3.0.0:
+isomorphic-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4"
integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==
@@ -6162,11 +5908,6 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
-jsbn@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
- integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==
-
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -6414,11 +6155,6 @@ lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
-lru-cache@^7.14.1:
- version "7.18.3"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89"
- integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
-
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
@@ -6457,6 +6193,11 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+mime-db@^1.54.0:
+ version "1.54.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
+
mime-types@^2.1.12, mime-types@~2.1.19:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -6464,6 +6205,13 @@ mime-types@^2.1.12, mime-types@~2.1.19:
dependencies:
mime-db "1.52.0"
+mime-types@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce"
+ integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
+ dependencies:
+ mime-db "^1.54.0"
+
mime@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
@@ -6520,11 +6268,6 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
-mitt@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
- integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
-
mixpanel-browser@2.49.0:
version "2.49.0"
resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz#de3f4f2d0f3a32b4babf6d827ef983a9fd48a711"
@@ -6606,11 +6349,6 @@ neo-async@^2.6.2:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-netmask@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
- integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
-
next@14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69"
@@ -6722,7 +6460,7 @@ object-inspect@^1.13.1:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
-object-inspect@^1.13.3:
+object-inspect@^1.13.3, object-inspect@^1.13.4:
version "1.13.4"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
@@ -6916,28 +6654,6 @@ p-locate@^6.0.0:
dependencies:
p-limit "^4.0.0"
-pac-proxy-agent@^7.1.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df"
- integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==
- dependencies:
- "@tootallnate/quickjs-emscripten" "^0.23.0"
- agent-base "^7.1.2"
- debug "^4.3.4"
- get-uri "^6.0.1"
- http-proxy-agent "^7.0.0"
- https-proxy-agent "^7.0.6"
- pac-resolver "^7.0.1"
- socks-proxy-agent "^8.0.5"
-
-pac-resolver@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6"
- integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
- dependencies:
- degenerator "^5.0.0"
- netmask "^2.0.2"
-
package-json-from-dist@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
@@ -6955,7 +6671,7 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-json@^5.0.0, parse-json@^5.2.0:
+parse-json@^5.0.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==
@@ -7024,11 +6740,6 @@ pathe@^1.1.1, pathe@^1.1.2:
resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
-
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -7197,11 +6908,6 @@ process-warning@^1.0.0:
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616"
integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==
-progress@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@@ -7211,20 +6917,6 @@ prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2,
object-assign "^4.1.1"
react-is "^16.13.1"
-proxy-agent@^6.5.0:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d"
- integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==
- dependencies:
- agent-base "^7.1.2"
- debug "^4.3.4"
- http-proxy-agent "^7.0.1"
- https-proxy-agent "^7.0.6"
- lru-cache "^7.14.1"
- pac-proxy-agent "^7.1.0"
- proxy-from-env "^1.1.0"
- socks-proxy-agent "^8.0.5"
-
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -7245,43 +6937,11 @@ pump@^2.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-pump@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
- integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
-puppeteer-core@24.6.1:
- version "24.6.1"
- resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.6.1.tgz#fc2ea21a49d6d8240cc959b729a12ba976ac140a"
- integrity sha512-sMCxsY+OPWO2fecBrhIeCeJbWWXJ6UaN997sTid6whY0YT9XM0RnxEwLeUibluIS5/fRmuxe1efjb5RMBsky7g==
- dependencies:
- "@puppeteer/browsers" "2.10.0"
- chromium-bidi "3.0.0"
- debug "^4.4.0"
- devtools-protocol "0.0.1425554"
- typed-query-selector "^2.12.0"
- ws "^8.18.1"
-
-puppeteer@^24.4.0:
- version "24.6.1"
- resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.6.1.tgz#828308e1e05654c4ca87399e677d10e3eeb32702"
- integrity sha512-/4ocGfu8LNvDbWUqJZV2VmwEWpbOdJa69y2Jivd213tV0ekAtUh/bgT1hhW63SDN/CtrEucOPwoomZ+9M+eBEg==
- dependencies:
- "@puppeteer/browsers" "2.10.0"
- chromium-bidi "3.0.0"
- cosmiconfig "^9.0.0"
- devtools-protocol "0.0.1425554"
- puppeteer-core "24.6.1"
- typed-query-selector "^2.12.0"
-
qs@6.14.0, qs@^6.7.0:
version "6.14.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
@@ -7331,13 +6991,6 @@ react-clientside-effect@^1.2.6:
dependencies:
"@babel/runtime" "^7.12.13"
-react-device-detect@2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-2.2.3.tgz#97a7ae767cdd004e7c3578260f48cf70c036e7ca"
- integrity sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==
- dependencies:
- ua-parser-js "^1.0.33"
-
react-dom@18:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
@@ -7547,12 +7200,12 @@ redeyed@~2.1.0:
esprima "~4.0.0"
redis@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/redis/-/redis-4.7.0.tgz#b401787514d25dd0cfc22406d767937ba3be55d6"
- integrity sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/redis/-/redis-4.7.1.tgz#08588a30936be0e7ad9c0f3e1ac6a85ccaf73e94"
+ integrity sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==
dependencies:
"@redis/bloom" "1.2.0"
- "@redis/client" "1.6.0"
+ "@redis/client" "1.6.1"
"@redis/graph" "1.1.1"
"@redis/json" "1.0.7"
"@redis/search" "1.2.0"
@@ -7600,7 +7253,7 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
es-errors "^1.3.0"
set-function-name "^2.0.1"
-regexp.prototype.flags@^1.5.3:
+regexp.prototype.flags@^1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
@@ -7782,11 +7435,6 @@ semver@^7.3.5, semver@^7.5.2, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-semver@^7.7.1:
- version "7.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
- integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
-
server-only@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/server-only/-/server-only-0.0.1.tgz#0f366bb6afb618c37c9255a314535dc412cd1c9e"
@@ -7936,28 +7584,6 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-smart-buffer@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
- integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-
-socks-proxy-agent@^8.0.5:
- version "8.0.5"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee"
- integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==
- dependencies:
- agent-base "^7.1.2"
- debug "^4.3.4"
- socks "^2.8.3"
-
-socks@^2.8.3:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc"
- integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==
- dependencies:
- ip-address "^9.0.5"
- smart-buffer "^4.2.0"
-
sonic-boom@^2.2.1:
version "2.8.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611"
@@ -7980,7 +7606,7 @@ source-map@^0.5.7:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -8021,11 +7647,6 @@ split2@^4.0.0:
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
-sprintf-js@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
- integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
-
sshpk@^1.18.0:
version "1.18.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
@@ -8075,7 +7696,7 @@ stacktrace-js@^2.0.2:
stack-generator "^2.0.5"
stacktrace-gps "^3.0.4"
-"starknet-types-07@npm:@starknet-io/types-js@^0.7.10", "starknet-types-07@npm:@starknet-io/types-js@^0.7.7":
+"starknet-types-07@npm:@starknet-io/types-js@^0.7.7":
version "0.7.10"
resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760"
integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==
@@ -8099,23 +7720,6 @@ starknet@6.11.0:
ts-mixer "^6.0.3"
url-join "^4.0.1"
-starknet@^6.11.0:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.24.1.tgz#87333339795038e93ef32a20726b5272ddb78fe1"
- integrity sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg==
- dependencies:
- "@noble/curves" "1.7.0"
- "@noble/hashes" "1.6.0"
- "@scure/base" "1.2.1"
- "@scure/starknet" "1.1.0"
- abi-wan-kanabi "^2.2.3"
- fetch-cookie "~3.0.0"
- isomorphic-fetch "~3.0.0"
- lossless-json "^4.0.1"
- pako "^2.0.4"
- starknet-types-07 "npm:@starknet-io/types-js@^0.7.10"
- ts-mixer "^6.0.3"
-
starknetkit@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/starknetkit/-/starknetkit-2.4.0.tgz#922dacd4686755bdabe2dc1825c990aa5bf0195a"
@@ -8152,6 +7756,14 @@ stop-iteration-iterator@^1.0.0:
dependencies:
internal-slot "^1.0.4"
+stop-iteration-iterator@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
+ dependencies:
+ es-errors "^1.3.0"
+ internal-slot "^1.1.0"
+
stream-shift@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
@@ -8162,16 +7774,6 @@ streamsearch@^1.1.0:
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
-streamx@^2.15.0, streamx@^2.21.0:
- version "2.22.0"
- resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7"
- integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==
- dependencies:
- fast-fifo "^1.3.2"
- text-decoder "^1.1.0"
- optionalDependencies:
- bare-events "^2.2.0"
-
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
@@ -8451,33 +8053,6 @@ tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-tar-fs@^3.0.8:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7"
- integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==
- dependencies:
- pump "^3.0.0"
- tar-stream "^3.1.5"
- optionalDependencies:
- bare-fs "^4.0.1"
- bare-path "^3.0.0"
-
-tar-stream@^3.1.5:
- version "3.1.7"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b"
- integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==
- dependencies:
- b4a "^1.6.4"
- fast-fifo "^1.2.0"
- streamx "^2.15.0"
-
-text-decoder@^1.1.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65"
- integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==
- dependencies:
- b4a "^1.6.4"
-
text-extensions@^2.0.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34"
@@ -8565,7 +8140,7 @@ toggle-selection@^1.0.6:
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
-tough-cookie@^4.0.0, tough-cookie@^4.1.3:
+tough-cookie@^4.1.3:
version "4.1.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
@@ -8644,11 +8219,6 @@ tslib@2.7.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
-tslib@^2.0.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
- integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
-
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -8777,21 +8347,11 @@ typed-array-length@^1.0.7:
possible-typed-array-names "^1.0.0"
reflect.getprototypeof "^1.0.6"
-typed-query-selector@^2.12.0:
- version "2.12.0"
- resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2"
- integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==
-
typescript@5:
version "5.6.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0"
integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==
-ua-parser-js@^1.0.33:
- version "1.0.39"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018"
- integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==
-
ufo@^1.5.3, ufo@^1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754"
@@ -8851,6 +8411,11 @@ undici-types@~6.21.0:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
+undici-types@~7.8.0:
+ version "7.8.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294"
+ integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==
+
unenv@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.10.0.tgz#c3394a6c6e4cfe68d699f87af456fe3f0db39571"
@@ -9099,7 +8664,7 @@ which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15:
gopd "^1.0.1"
has-tostringtag "^1.0.2"
-which-typed-array@^1.1.16, which-typed-array@^1.1.18:
+which-typed-array@^1.1.16, which-typed-array@^1.1.19:
version "1.1.19"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956"
integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
@@ -9206,7 +8771,7 @@ ws@8.17.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
-ws@8.18.1, ws@^8.18.1:
+ws@8.18.1:
version "8.18.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb"
integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==
@@ -9254,14 +8819,6 @@ yargs@^17.7.2:
y18n "^5.0.5"
yargs-parser "^21.1.1"
-yauzl@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
-
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
@@ -9294,11 +8851,6 @@ zod@^3.22.4:
resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
-zod@^3.24.1:
- version "3.24.2"
- resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3"
- integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==
-
zustand@^4.4.0:
version "4.5.6"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.6.tgz#6857d52af44874a79fb3408c9473f78367255c96"
| |