From aba38294ae416fd1b2ce2cada3e03878b5d6de37 Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 06:56:12 +0100 Subject: [PATCH 01/13] added the carmine options pool and now we can track these pools from the strkfarm dashboard --- src/store/carmine.store.ts | 97 ++++++++++++++++++++++++++++++++++++++ src/store/pools.ts | 67 ++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/store/carmine.store.ts diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts new file mode 100644 index 0000000..579f37e --- /dev/null +++ b/src/store/carmine.store.ts @@ -0,0 +1,97 @@ +import CONSTANTS from '@/constants'; +import { Category, PoolType } from './pools'; +import { atom } from 'jotai'; +import { PoolInfo, ProtocolAtoms, CarmineAtom } from './pools'; +import { Jediswap } from './jedi.store'; + +const poolConfigs = [ + { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'STRK/USDC Put Pool (USDC)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'ETH/STRK Call Pool (ETH)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/STRK Put Pool (STRK)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/USDC Call Pool (ETH)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'ETH/USDC Put Pool (USDC)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'wBTC/USDC Put Pool (USDC)', tokenA: 'WBTC', tokenB: 'USDC' }, + { name: 'wBTC/USDC Call Pool (wBTC)', tokenA: 'WBTC', tokenB: 'USDC' }, +]; + +export class Carmine extends Jediswap { + name = 'Carmine Options'; + link = 'https://app.carmine.finance/staking'; + logo = 'https://app.carmine.finance/logo.png'; + incentiveDataKey = 'isCarmine'; + + _computePoolsInfo(data: any) { + try { + const myData = data; + if (!myData) return []; + const pools: PoolInfo[] = []; + + poolConfigs.forEach((config) => { + const poolData = myData[config.name]; + if (!poolData || !poolData.data) return; + + const category = Category.Others; + const logo1 = CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; + const logo2 = CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; + + const baseApr = poolData.data.launch_annualized / 100 === 0 ? 0.0 : parseFloat(poolData.data.launch_annualized) / 100; + const rewardApr = parseFloat(poolData.rewardApr) || 0; + + const poolInfo: PoolInfo = { + pool: { + name: config.name, + logos: [logo1, logo2], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: baseApr + rewardApr, + tvl: poolData.tvl, + aprSplits: [ + { + apr: baseApr || baseApr.toString() === '' ? baseApr : 0, + title: 'Supply Apy', + description: '', + }, + { + apr: rewardApr ?? 0, + title: 'STRK DeFi Spring rewards', + description: '', + }, + ], + category, + type: PoolType.DEXV2, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } catch (err) { + console.error('Err fetching pools [2]', err); + throw err; + } + } +} + +export const carmine = new Carmine(); + +const CarmineAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(CarmineAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return carmine._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; + +export default CarmineAtoms; \ No newline at end of file diff --git a/src/store/pools.ts b/src/store/pools.ts index 20eddab..dda4d46 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -14,6 +14,7 @@ import SithswapAtoms, { sithswap } from './sithswap.store'; import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; import ZkLendAtoms, { zkLend } from './zklend.store'; +import CarmineAtoms, { Carmine } from './carmine.store'; export enum Category { Stable = 'Stable Pools', @@ -103,6 +104,11 @@ export const PROTOCOLS = [ class: nostraDegen, atoms: NostraDegenAtoms, }, + { + name: Carmine.name, + class: Carmine, + atoms: CarmineAtoms, + }, { name: starkDefi.name, class: starkDefi, @@ -179,6 +185,67 @@ export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ }, })); +const poolEndpoints = [ + { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, + { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, + { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, + { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, + { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, + { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, + { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, + { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, +]; + +const rewardAprEndpoint = 'https://api.carmine.finance/api/v1/mainnet/defispring'; + +export const CarmineAtom = atomWithQuery((get) => ({ + queryKey: ['isCarmine'], + queryFn: async ({ queryKey }) => { + const fetchPool = async (endpoint: any) => { + const res = await fetch(`https://api.carmine.finance/api/v2/mainnet/${endpoint}/apy`); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const fetchRewardApr = async () => { + const res = await fetch(`${rewardAprEndpoint}`); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const rewardAprData = await fetchRewardApr(); + const rewardApr = rewardAprData.data.apy; + const tvl = rewardAprData.data.tvl; + + const poolData = await Promise.all( + poolEndpoints.map(async (pool) => { + const data = await fetchPool(pool.endpoint); + return { name: pool.name, data }; + }) + ); + + const combinedData = poolData.reduce((acc, pool) => { + acc[pool.name] = { + ...pool.data, + rewardApr, + tvl, + }; + return acc; + }, {} as { [key: string]: any }); + + const specificPools = ['wBTC/USDC Call Pool (wBTC)', 'wBTC/USDC Put Pool (USDC)']; + specificPools.forEach(poolName => { + if (combinedData[poolName]) { + combinedData[poolName].rewardApr = 0.00; + } + }); + + return combinedData; + }, +})); + export const ALL_FILTER = 'All'; export const filters = { categories: [...Object.values(Category)], From 0f3d4994c8d66a751158dfcd4d09dd3cc649bdb1 Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 08:02:52 +0100 Subject: [PATCH 02/13] added the carmine url to the constants file --- src/constants.ts | 2 ++ src/store/carmine.store.ts | 21 +++++++++++-------- src/store/pools.ts | 41 +++++++++++++++++++++++--------------- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 2e77b7c..aa32593 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -14,6 +14,8 @@ export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; const CONSTANTS = { DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', + CARMINE_INCENTIVES_URL: 'https://api.carmine.finance/api/v1/mainnet/defispring', + CARMINE_URL: '', LENDING_INCENTIVES_URL: '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', LOGOS, diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index 579f37e..66f851d 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -26,16 +26,21 @@ export class Carmine extends Jediswap { const myData = data; if (!myData) return []; const pools: PoolInfo[] = []; - + poolConfigs.forEach((config) => { const poolData = myData[config.name]; if (!poolData || !poolData.data) return; - + const category = Category.Others; - const logo1 = CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; - const logo2 = CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; - - const baseApr = poolData.data.launch_annualized / 100 === 0 ? 0.0 : parseFloat(poolData.data.launch_annualized) / 100; + const logo1 = + CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; + const logo2 = + CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; + + const baseApr = + poolData.data.launch_annualized / 100 === 0 + ? 0.0 + : parseFloat(poolData.data.launch_annualized) / 100; const rewardApr = parseFloat(poolData.rewardApr) || 0; const poolInfo: PoolInfo = { @@ -49,7 +54,7 @@ export class Carmine extends Jediswap { logo: this.logo, }, apr: baseApr + rewardApr, - tvl: poolData.tvl, + tvl: poolData.tvl, aprSplits: [ { apr: baseApr || baseApr.toString() === '' ? baseApr : 0, @@ -94,4 +99,4 @@ const CarmineAtoms: ProtocolAtoms = { }), }; -export default CarmineAtoms; \ No newline at end of file +export default CarmineAtoms; diff --git a/src/store/pools.ts b/src/store/pools.ts index dda4d46..061cf7f 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -196,49 +196,58 @@ const poolEndpoints = [ { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, ]; -const rewardAprEndpoint = 'https://api.carmine.finance/api/v1/mainnet/defispring'; +const rewardAprEndpoint = + ''; export const CarmineAtom = atomWithQuery((get) => ({ queryKey: ['isCarmine'], queryFn: async ({ queryKey }) => { const fetchPool = async (endpoint: any) => { - const res = await fetch(`https://api.carmine.finance/api/v2/mainnet/${endpoint}/apy`); + const res = await fetch( + `${CONSTANTS.CARMINE_URL}/${endpoint}/apy`, + ); let data = await res.text(); data = data.replaceAll('NaN', '0'); return JSON.parse(data); }; const fetchRewardApr = async () => { - const res = await fetch(`${rewardAprEndpoint}`); + const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); let data = await res.text(); data = data.replaceAll('NaN', '0'); return JSON.parse(data); }; const rewardAprData = await fetchRewardApr(); - const rewardApr = rewardAprData.data.apy; + const rewardApr = rewardAprData.data.apy; const tvl = rewardAprData.data.tvl; const poolData = await Promise.all( poolEndpoints.map(async (pool) => { const data = await fetchPool(pool.endpoint); return { name: pool.name, data }; - }) + }), ); - const combinedData = poolData.reduce((acc, pool) => { - acc[pool.name] = { - ...pool.data, - rewardApr, - tvl, - }; - return acc; - }, {} as { [key: string]: any }); + const combinedData = poolData.reduce( + (acc, pool) => { + acc[pool.name] = { + ...pool.data, + rewardApr, + tvl, + }; + return acc; + }, + {} as { [key: string]: any }, + ); - const specificPools = ['wBTC/USDC Call Pool (wBTC)', 'wBTC/USDC Put Pool (USDC)']; - specificPools.forEach(poolName => { + const specificPools = [ + 'wBTC/USDC Call Pool (wBTC)', + 'wBTC/USDC Put Pool (USDC)', + ]; + specificPools.forEach((poolName) => { if (combinedData[poolName]) { - combinedData[poolName].rewardApr = 0.00; + combinedData[poolName].rewardApr = 0.0; } }); From 16dd1adac42b4cb26bac705aa465a75dec0d4634 Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 08:14:18 +0100 Subject: [PATCH 03/13] wrote a next rewrite for carmine --- next.config.mjs | 4 ++++ src/constants.ts | 5 +++-- src/store/pools.ts | 8 +------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 3197ac0..24bf0ef 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -33,6 +33,10 @@ const nextConfig = { source: '/nostra/:path*', destination: 'https://us-east-2.aws.data.mongodb-api.com/:path*', }, + { + source: '/carmine/:path*', + destination: 'https://api.carmine.finance/:path*', + }, { source: '/myswap/:path*', destination: 'https://myswap-cl-charts.s3.amazonaws.com/:path*', diff --git a/src/constants.ts b/src/constants.ts index aa32593..fb57612 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -14,8 +14,9 @@ export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; const CONSTANTS = { DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', - CARMINE_INCENTIVES_URL: 'https://api.carmine.finance/api/v1/mainnet/defispring', - CARMINE_URL: '', + CARMINE_INCENTIVES_URL: + '/carmine/api/v1/mainnet/defispring', + CARMINE_URL: '/carmine/api/v2/mainnet', LENDING_INCENTIVES_URL: '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', LOGOS, diff --git a/src/store/pools.ts b/src/store/pools.ts index 061cf7f..b66257e 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -195,17 +195,11 @@ const poolEndpoints = [ { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, ]; - -const rewardAprEndpoint = - ''; - export const CarmineAtom = atomWithQuery((get) => ({ queryKey: ['isCarmine'], queryFn: async ({ queryKey }) => { const fetchPool = async (endpoint: any) => { - const res = await fetch( - `${CONSTANTS.CARMINE_URL}/${endpoint}/apy`, - ); + const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); let data = await res.text(); data = data.replaceAll('NaN', '0'); return JSON.parse(data); From 076b1374025beb98f8778fea9e3a93421225da0a Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 08:31:50 +0100 Subject: [PATCH 04/13] added carmien options to the list --- src/constants.ts | 3 +-- src/store/pools.ts | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index fb57612..470b204 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -14,8 +14,7 @@ export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; const CONSTANTS = { DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', - CARMINE_INCENTIVES_URL: - '/carmine/api/v1/mainnet/defispring', + CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', CARMINE_URL: '/carmine/api/v2/mainnet', LENDING_INCENTIVES_URL: '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', diff --git a/src/store/pools.ts b/src/store/pools.ts index b66257e..1a86275 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -14,7 +14,7 @@ import SithswapAtoms, { sithswap } from './sithswap.store'; import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; import ZkLendAtoms, { zkLend } from './zklend.store'; -import CarmineAtoms, { Carmine } from './carmine.store'; +import CarmineAtoms, { carmine } from './carmine.store'; export enum Category { Stable = 'Stable Pools', @@ -105,8 +105,8 @@ export const PROTOCOLS = [ atoms: NostraDegenAtoms, }, { - name: Carmine.name, - class: Carmine, + name: carmine.name, + class: carmine, atoms: CarmineAtoms, }, { From c647628d65dd556d1506645b563c459533fb15ae Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 08:52:38 +0100 Subject: [PATCH 05/13] changed the pooltype and the icon url --- src/store/carmine.store.ts | 8 ++++---- src/store/pools.ts | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index 66f851d..bd37501 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -18,7 +18,7 @@ const poolConfigs = [ export class Carmine extends Jediswap { name = 'Carmine Options'; link = 'https://app.carmine.finance/staking'; - logo = 'https://app.carmine.finance/logo.png'; + logo = 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; incentiveDataKey = 'isCarmine'; _computePoolsInfo(data: any) { @@ -38,9 +38,9 @@ export class Carmine extends Jediswap { CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; const baseApr = - poolData.data.launch_annualized / 100 === 0 + poolData.data.week_annualized / 100 === 0 ? 0.0 - : parseFloat(poolData.data.launch_annualized) / 100; + : parseFloat(poolData.data.week_annualized) / 100; const rewardApr = parseFloat(poolData.rewardApr) || 0; const poolInfo: PoolInfo = { @@ -68,7 +68,7 @@ export class Carmine extends Jediswap { }, ], category, - type: PoolType.DEXV2, + type: PoolType.Derivatives, lending: { collateralFactor: 0, }, diff --git a/src/store/pools.ts b/src/store/pools.ts index 1a86275..26787d3 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -27,6 +27,7 @@ export enum PoolType { DEXV2 = 'V2 LP DEX', DEXV3 = 'Concentrated LP DEX', Lending = 'Lending', + Derivatives = 'Derivatives', } export interface APRSplit { From cf35c80b45d6f089753c26812613e78aa2a842fa Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Tue, 30 Jul 2024 08:53:42 +0100 Subject: [PATCH 06/13] changed the pooltype and the icon url --- src/store/carmine.store.ts | 5 +++-- src/store/pools.ts | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index bd37501..ec5e2cf 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -18,7 +18,8 @@ const poolConfigs = [ export class Carmine extends Jediswap { name = 'Carmine Options'; link = 'https://app.carmine.finance/staking'; - logo = 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; incentiveDataKey = 'isCarmine'; _computePoolsInfo(data: any) { @@ -31,7 +32,7 @@ export class Carmine extends Jediswap { const poolData = myData[config.name]; if (!poolData || !poolData.data) return; - const category = Category.Others; + const category = Category.Derivatives; const logo1 = CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; const logo2 = diff --git a/src/store/pools.ts b/src/store/pools.ts index 26787d3..e4ad63d 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -20,6 +20,7 @@ export enum Category { Stable = 'Stable Pools', STRK = 'STRK Pools', Degen = 'MetaStable Pools', + Derivatives = 'Derivatives', Others = 'Others', } From 36b97a75f9a628c231f1a42575a417bf9264eabe Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Thu, 1 Aug 2024 13:04:24 +0100 Subject: [PATCH 07/13] fixed the category issue --- src/store/carmine.store.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index ec5e2cf..952713a 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -32,7 +32,15 @@ export class Carmine extends Jediswap { const poolData = myData[config.name]; if (!poolData || !poolData.data) return; - const category = Category.Derivatives; + let category: Category; + if (config.name.endsWith('(USDC)')) { + category = Category.Stable; + } else if (config.name.endsWith('(STRK)')) { + category = Category.STRK; + } else { + category = Category.Others; + } + const logo1 = CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; const logo2 = From d6f886bccd934bdfc3a4ece0a454ba068cb184d1 Mon Sep 17 00:00:00 2001 From: Isaac Onyemaechi Date: Thu, 1 Aug 2024 13:15:52 +0100 Subject: [PATCH 08/13] removed derivatives from category list --- src/store/pools.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/store/pools.ts b/src/store/pools.ts index e4ad63d..26787d3 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -20,7 +20,6 @@ export enum Category { Stable = 'Stable Pools', STRK = 'STRK Pools', Degen = 'MetaStable Pools', - Derivatives = 'Derivatives', Others = 'Others', } From 99605b66bab5f84d292d4c3dca027eee791a1621 Mon Sep 17 00:00:00 2001 From: Akira <156126180+akiraonstarknet@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:10:35 +0530 Subject: [PATCH 09/13] remove CarmineAtom pools.ts --- src/store/pools.ts | 64 ---------------------------------------------- 1 file changed, 64 deletions(-) diff --git a/src/store/pools.ts b/src/store/pools.ts index 26787d3..9c9b5d3 100644 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -186,70 +186,6 @@ export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ }, })); -const poolEndpoints = [ - { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, - { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, - { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, - { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, - { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, - { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, - { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, - { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, -]; -export const CarmineAtom = atomWithQuery((get) => ({ - queryKey: ['isCarmine'], - queryFn: async ({ queryKey }) => { - const fetchPool = async (endpoint: any) => { - const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const fetchRewardApr = async () => { - const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const rewardAprData = await fetchRewardApr(); - const rewardApr = rewardAprData.data.apy; - const tvl = rewardAprData.data.tvl; - - const poolData = await Promise.all( - poolEndpoints.map(async (pool) => { - const data = await fetchPool(pool.endpoint); - return { name: pool.name, data }; - }), - ); - - const combinedData = poolData.reduce( - (acc, pool) => { - acc[pool.name] = { - ...pool.data, - rewardApr, - tvl, - }; - return acc; - }, - {} as { [key: string]: any }, - ); - - const specificPools = [ - 'wBTC/USDC Call Pool (wBTC)', - 'wBTC/USDC Put Pool (USDC)', - ]; - specificPools.forEach((poolName) => { - if (combinedData[poolName]) { - combinedData[poolName].rewardApr = 0.0; - } - }); - - return combinedData; - }, -})); - export const ALL_FILTER = 'All'; export const filters = { categories: [...Object.values(Category)], From 74dfd3f854036c61a79b36ac93e30c74e551ba1d Mon Sep 17 00:00:00 2001 From: Akira <156126180+akiraonstarknet@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:11:51 +0530 Subject: [PATCH 10/13] add CarmineAtom to carmine.store.ts --- src/store/carmine.store.ts | 69 +++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index 952713a..953b9f3 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -1,8 +1,9 @@ import CONSTANTS from '@/constants'; import { Category, PoolType } from './pools'; import { atom } from 'jotai'; -import { PoolInfo, ProtocolAtoms, CarmineAtom } from './pools'; +import { PoolInfo, ProtocolAtoms } from './pools'; import { Jediswap } from './jedi.store'; +import { atomWithQuery } from 'jotai-tanstack-query'; const poolConfigs = [ { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, @@ -99,6 +100,72 @@ export class Carmine extends Jediswap { export const carmine = new Carmine(); +const poolEndpoints = [ + { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, + { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, + { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, + { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, + { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, + { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, + { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, + { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, +]; + +export const CarmineAtom = atomWithQuery((get) => ({ + queryKey: ['isCarmine'], + queryFn: async ({ queryKey }) => { + const fetchPool = async (endpoint: any) => { + const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const fetchRewardApr = async () => { + const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const rewardAprData = await fetchRewardApr(); + const rewardApr = rewardAprData.data.apy; + const tvl = rewardAprData.data.tvl; + + const poolData = await Promise.all( + poolEndpoints.map(async (pool) => { + const data = await fetchPool(pool.endpoint); + return { name: pool.name, data }; + }), + ); + + const combinedData = poolData.reduce( + (acc, pool) => { + acc[pool.name] = { + ...pool.data, + rewardApr, + tvl, + }; + return acc; + }, + {} as { [key: string]: any }, + ); + + const specificPools = [ + 'wBTC/USDC Call Pool (wBTC)', + 'wBTC/USDC Put Pool (USDC)', + ]; + specificPools.forEach((poolName) => { + if (combinedData[poolName]) { + combinedData[poolName].rewardApr = 0.0; + } + }); + + return combinedData; + }, +})); + + const CarmineAtoms: ProtocolAtoms = { pools: atom((get) => { const poolsInfo = get(CarmineAtom); From fd659c3729a39fabd69058f52ae998a951960ad2 Mon Sep 17 00:00:00 2001 From: akira-zkdice Date: Tue, 6 Aug 2024 16:17:26 +0530 Subject: [PATCH 11/13] lint fix --- .husky/_/applypatch-msg | 0 .husky/_/commit-msg | 0 .husky/_/post-applypatch | 0 .husky/_/post-checkout | 0 .husky/_/post-commit | 0 .husky/_/post-merge | 0 .husky/_/post-rewrite | 0 .husky/_/pre-applypatch | 0 .husky/_/pre-auto-gc | 0 .husky/_/pre-commit | 0 .husky/_/pre-push | 0 .husky/_/pre-rebase | 0 .husky/_/prepare-commit-msg | 0 src/store/carmine.store.ts | 1 - src/utils/MyNumber.ts | 1 - 15 files changed, 2 deletions(-) mode change 100755 => 100644 .husky/_/applypatch-msg mode change 100755 => 100644 .husky/_/commit-msg mode change 100755 => 100644 .husky/_/post-applypatch mode change 100755 => 100644 .husky/_/post-checkout mode change 100755 => 100644 .husky/_/post-commit mode change 100755 => 100644 .husky/_/post-merge mode change 100755 => 100644 .husky/_/post-rewrite mode change 100755 => 100644 .husky/_/pre-applypatch mode change 100755 => 100644 .husky/_/pre-auto-gc mode change 100755 => 100644 .husky/_/pre-commit mode change 100755 => 100644 .husky/_/pre-push mode change 100755 => 100644 .husky/_/pre-rebase mode change 100755 => 100644 .husky/_/prepare-commit-msg diff --git a/.husky/_/applypatch-msg b/.husky/_/applypatch-msg old mode 100755 new mode 100644 diff --git a/.husky/_/commit-msg b/.husky/_/commit-msg old mode 100755 new mode 100644 diff --git a/.husky/_/post-applypatch b/.husky/_/post-applypatch old mode 100755 new mode 100644 diff --git a/.husky/_/post-checkout b/.husky/_/post-checkout old mode 100755 new mode 100644 diff --git a/.husky/_/post-commit b/.husky/_/post-commit old mode 100755 new mode 100644 diff --git a/.husky/_/post-merge b/.husky/_/post-merge old mode 100755 new mode 100644 diff --git a/.husky/_/post-rewrite b/.husky/_/post-rewrite old mode 100755 new mode 100644 diff --git a/.husky/_/pre-applypatch b/.husky/_/pre-applypatch old mode 100755 new mode 100644 diff --git a/.husky/_/pre-auto-gc b/.husky/_/pre-auto-gc old mode 100755 new mode 100644 diff --git a/.husky/_/pre-commit b/.husky/_/pre-commit old mode 100755 new mode 100644 diff --git a/.husky/_/pre-push b/.husky/_/pre-push old mode 100755 new mode 100644 diff --git a/.husky/_/pre-rebase b/.husky/_/pre-rebase old mode 100755 new mode 100644 diff --git a/.husky/_/prepare-commit-msg b/.husky/_/prepare-commit-msg old mode 100755 new mode 100644 diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index 953b9f3..afce7de 100644 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -165,7 +165,6 @@ export const CarmineAtom = atomWithQuery((get) => ({ }, })); - const CarmineAtoms: ProtocolAtoms = { pools: atom((get) => { const poolsInfo = get(CarmineAtom); diff --git a/src/utils/MyNumber.ts b/src/utils/MyNumber.ts index a109904..93edd5d 100644 --- a/src/utils/MyNumber.ts +++ b/src/utils/MyNumber.ts @@ -105,7 +105,6 @@ export default class MyNumber { bn.toString(), a.decimals > b.decimals ? a.decimals : b.decimals, ); - } [customInspectSymbol](depth: any, inspectOptions: any, inspect: any) { From 1c36f3c3017e4a0b132ecc608cb6a8b03de816e9 Mon Sep 17 00:00:00 2001 From: akira-zkdice Date: Tue, 6 Aug 2024 16:28:37 +0530 Subject: [PATCH 12/13] lintfix --- .all-contributorsrc | 226 +- .env.sample | 2 +- .eslintignore | 0 .eslintrc.json | 294 +- .github/ISSUE_TEMPLATE/bug.md | 0 .github/ISSUE_TEMPLATE/feature.md | 0 .github/pull_request_template.md | 0 .github/workflows/lint_and_build.yml | 0 .gitignore | 0 .husky/_/.gitignore | 0 .husky/_/applypatch-msg | 0 .husky/_/commit-msg | 0 .husky/_/h | 0 .husky/_/post-applypatch | 0 .husky/_/post-checkout | 0 .husky/_/post-commit | 0 .husky/_/post-merge | 0 .husky/_/post-rewrite | 0 .husky/_/pre-applypatch | 0 .husky/_/pre-auto-gc | 0 .husky/_/pre-commit | 0 .husky/_/pre-push | 0 .husky/_/pre-rebase | 0 .husky/_/prepare-commit-msg | 0 .husky/pre-commit | 4 +- .prettierignore | 0 .prettierrc | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 210 +- analysis/uniV3Math.ipynb | 280 +- analysis/v3IL.ipynb | 270 +- docs/add_new_protocol.md | 0 docs/vercel-deployment.md | 0 generateChangelog.js | 44 +- next.config.mjs | 0 package-lock.json | 0 package.json | 170 +- postcss.config.js | 0 public/banners/ognft.svg | 0 public/banners/ognft_small.svg | 0 public/banners/seed_grant.svg | 0 public/banners/seed_grant_small.jpg | Bin public/banners/seed_grant_small.svg | 0 public/fulllogo.png | Bin public/logo.png | Bin src/abi/autoStrk.abi.json | 0 src/abi/deltraNeutral.abi.json | 0 src/abi/erc20.abi.json | 0 src/abi/erc4626.abi.json | 0 src/abi/master.abi.json | 0 src/app/api/stats/[address]/route.ts | 80 +- src/app/api/stats/route.ts | 62 +- src/app/api/strategies/route.ts | 34 +- src/app/claims/components/ClaimInfoCard.tsx | 0 src/app/claims/layout.tsx | 0 src/app/claims/page.tsx | 0 src/app/favicon.ico | Bin src/app/globals.css | 0 src/app/layout.tsx | 90 +- src/app/page.tsx | 470 +- src/app/robots.txt | 0 src/app/sitemap.xml | 0 src/app/slinks/layout.tsx | 116 +- src/app/slinks/page.tsx | 278 +- src/app/slinks/template.tsx | 248 +- src/app/strategy/components/Strategy.tsx | 900 +- src/app/strategy/layout.tsx | 0 src/app/strategy/page.tsx | 78 +- src/app/template.tsx | 248 +- src/assets/tg.svg | 0 src/components/Deposit.tsx | 698 +- src/components/EmblaCarouselDotButton.tsx | 0 src/components/Filters.tsx | 0 src/components/LoadingWrap.tsx | 0 src/components/Navbar.tsx | 534 +- src/components/Pools.tsx | 0 src/components/Strategies.tsx | 686 +- src/components/TVL.tsx | 0 src/components/TxButton.tsx | 244 +- src/constants.ts | 336 +- src/hooks/useERC20Balance.ts | 0 src/hooks/useERC4626Value.ts | 0 src/store/IDapp.store.ts | 154 +- src/store/balance.atoms.ts | 384 +- src/store/carmine.store.ts | 354 +- src/store/claims.atoms.ts | 0 src/store/ekobu.store.ts | 802 +- src/store/haiko.store.ts | 0 src/store/hashstack.store.ts | 194 +- src/store/jedi.store.ts | 0 src/store/lending.base.ts | 328 +- src/store/myswap.store.ts | 0 src/store/nimbora.store.ts | 90 +- src/store/nostradegen.store.ts | 0 src/store/nostradex.store.ts | 0 src/store/nostralending.store.ts | 312 +- src/store/pools.ts | 542 +- src/store/sithswap.store.ts | 0 src/store/starkdefi.store.ts | 0 src/store/strategies.atoms.ts | 252 +- src/store/tenkswap.store.ts | 0 src/store/transactions.atom.ts | 0 src/store/utils.atoms.ts | 0 src/store/zklend.store.ts | 180 +- src/strategies/IStrategy.ts | 660 +- src/strategies/auto_strk.strat.ts | 618 +- src/strategies/delta_neutral_mm.ts | 796 +- src/strategies/simple.stable.strat.ts | 178 +- src/utils.ts | 0 src/utils/MyNumber.ts | 224 +- src/utils/useWindowSize.ts | 0 tailwind.config.ts | 0 tsconfig.json | 56 +- yarn.lock | 13182 +++++++++--------- 115 files changed, 12954 insertions(+), 12954 deletions(-) mode change 100644 => 100755 .all-contributorsrc mode change 100644 => 100755 .env.sample mode change 100644 => 100755 .eslintignore mode change 100644 => 100755 .eslintrc.json mode change 100644 => 100755 .github/ISSUE_TEMPLATE/bug.md mode change 100644 => 100755 .github/ISSUE_TEMPLATE/feature.md mode change 100644 => 100755 .github/pull_request_template.md mode change 100644 => 100755 .github/workflows/lint_and_build.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .husky/_/.gitignore mode change 100644 => 100755 .husky/_/applypatch-msg mode change 100644 => 100755 .husky/_/commit-msg mode change 100644 => 100755 .husky/_/h mode change 100644 => 100755 .husky/_/post-applypatch mode change 100644 => 100755 .husky/_/post-checkout mode change 100644 => 100755 .husky/_/post-commit mode change 100644 => 100755 .husky/_/post-merge mode change 100644 => 100755 .husky/_/post-rewrite mode change 100644 => 100755 .husky/_/pre-applypatch mode change 100644 => 100755 .husky/_/pre-auto-gc mode change 100644 => 100755 .husky/_/pre-commit mode change 100644 => 100755 .husky/_/pre-push mode change 100644 => 100755 .husky/_/pre-rebase mode change 100644 => 100755 .husky/_/prepare-commit-msg mode change 100644 => 100755 .husky/pre-commit mode change 100644 => 100755 .prettierignore mode change 100644 => 100755 .prettierrc mode change 100644 => 100755 CONTRIBUTING.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 analysis/uniV3Math.ipynb mode change 100644 => 100755 analysis/v3IL.ipynb mode change 100644 => 100755 docs/add_new_protocol.md mode change 100644 => 100755 docs/vercel-deployment.md mode change 100644 => 100755 generateChangelog.js mode change 100644 => 100755 next.config.mjs mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 package.json mode change 100644 => 100755 postcss.config.js mode change 100644 => 100755 public/banners/ognft.svg mode change 100644 => 100755 public/banners/ognft_small.svg mode change 100644 => 100755 public/banners/seed_grant.svg mode change 100644 => 100755 public/banners/seed_grant_small.jpg mode change 100644 => 100755 public/banners/seed_grant_small.svg mode change 100644 => 100755 public/fulllogo.png mode change 100644 => 100755 public/logo.png mode change 100644 => 100755 src/abi/autoStrk.abi.json mode change 100644 => 100755 src/abi/deltraNeutral.abi.json mode change 100644 => 100755 src/abi/erc20.abi.json mode change 100644 => 100755 src/abi/erc4626.abi.json mode change 100644 => 100755 src/abi/master.abi.json mode change 100644 => 100755 src/app/api/stats/[address]/route.ts mode change 100644 => 100755 src/app/api/stats/route.ts mode change 100644 => 100755 src/app/api/strategies/route.ts mode change 100644 => 100755 src/app/claims/components/ClaimInfoCard.tsx mode change 100644 => 100755 src/app/claims/layout.tsx mode change 100644 => 100755 src/app/claims/page.tsx mode change 100644 => 100755 src/app/favicon.ico mode change 100644 => 100755 src/app/globals.css mode change 100644 => 100755 src/app/layout.tsx mode change 100644 => 100755 src/app/page.tsx mode change 100644 => 100755 src/app/robots.txt mode change 100644 => 100755 src/app/sitemap.xml mode change 100644 => 100755 src/app/slinks/layout.tsx mode change 100644 => 100755 src/app/slinks/page.tsx mode change 100644 => 100755 src/app/slinks/template.tsx mode change 100644 => 100755 src/app/strategy/components/Strategy.tsx mode change 100644 => 100755 src/app/strategy/layout.tsx mode change 100644 => 100755 src/app/strategy/page.tsx mode change 100644 => 100755 src/app/template.tsx mode change 100644 => 100755 src/assets/tg.svg mode change 100644 => 100755 src/components/Deposit.tsx mode change 100644 => 100755 src/components/EmblaCarouselDotButton.tsx mode change 100644 => 100755 src/components/Filters.tsx mode change 100644 => 100755 src/components/LoadingWrap.tsx mode change 100644 => 100755 src/components/Navbar.tsx mode change 100644 => 100755 src/components/Pools.tsx mode change 100644 => 100755 src/components/Strategies.tsx mode change 100644 => 100755 src/components/TVL.tsx mode change 100644 => 100755 src/components/TxButton.tsx mode change 100644 => 100755 src/constants.ts mode change 100644 => 100755 src/hooks/useERC20Balance.ts mode change 100644 => 100755 src/hooks/useERC4626Value.ts mode change 100644 => 100755 src/store/IDapp.store.ts mode change 100644 => 100755 src/store/balance.atoms.ts mode change 100644 => 100755 src/store/carmine.store.ts mode change 100644 => 100755 src/store/claims.atoms.ts mode change 100644 => 100755 src/store/ekobu.store.ts mode change 100644 => 100755 src/store/haiko.store.ts mode change 100644 => 100755 src/store/hashstack.store.ts mode change 100644 => 100755 src/store/jedi.store.ts mode change 100644 => 100755 src/store/lending.base.ts mode change 100644 => 100755 src/store/myswap.store.ts mode change 100644 => 100755 src/store/nimbora.store.ts mode change 100644 => 100755 src/store/nostradegen.store.ts mode change 100644 => 100755 src/store/nostradex.store.ts mode change 100644 => 100755 src/store/nostralending.store.ts mode change 100644 => 100755 src/store/pools.ts mode change 100644 => 100755 src/store/sithswap.store.ts mode change 100644 => 100755 src/store/starkdefi.store.ts mode change 100644 => 100755 src/store/strategies.atoms.ts mode change 100644 => 100755 src/store/tenkswap.store.ts mode change 100644 => 100755 src/store/transactions.atom.ts mode change 100644 => 100755 src/store/utils.atoms.ts mode change 100644 => 100755 src/store/zklend.store.ts mode change 100644 => 100755 src/strategies/IStrategy.ts mode change 100644 => 100755 src/strategies/auto_strk.strat.ts mode change 100644 => 100755 src/strategies/delta_neutral_mm.ts mode change 100644 => 100755 src/strategies/simple.stable.strat.ts mode change 100644 => 100755 src/utils.ts mode change 100644 => 100755 src/utils/MyNumber.ts mode change 100644 => 100755 src/utils/useWindowSize.ts mode change 100644 => 100755 tailwind.config.ts mode change 100644 => 100755 tsconfig.json mode change 100644 => 100755 yarn.lock diff --git a/.all-contributorsrc b/.all-contributorsrc old mode 100644 new mode 100755 index 458d462..a88dfcc --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1,114 +1,114 @@ -{ - "projectName": "starkfarm-client", - "projectOwner": "strkfarm", - "files": [ - "README.md" - ], - "commitType": "docs", - "commitConvention": "angular", - "contributorsPerLine": 7, - "contributors": [ - { - "login": "akiraonstarknet", - "name": "Akira ", - "avatar_url": "https://avatars.githubusercontent.com/u/156126180?v=4", - "profile": "https://github.com/akiraonstarknet", - "contributions": [ - "ideas", - "code", - "infra" - ] - }, - { - "login": "hemantwasthere", - "name": "Hemant", - "avatar_url": "https://avatars.githubusercontent.com/u/85151171?v=4", - "profile": "https://hemant.lol", - "contributions": [ - "infra" - ] - }, - { - "login": "raizo07", - "name": "Wolf", - "avatar_url": "https://avatars.githubusercontent.com/u/81079370?v=4", - "profile": "https://github.com/raizo07", - "contributions": [ - "infra" - ] - }, - { - "login": "jedstroke", - "name": "Jed", - "avatar_url": "https://avatars.githubusercontent.com/u/86930056?v=4", - "profile": "https://github.com/jedstroke", - "contributions": [ - "code" - ] - }, - { - "login": "EjembiEmmanuel", - "name": "Emmaunuel Ejembi", - "avatar_url": "https://avatars.githubusercontent.com/u/83036156?v=4", - "profile": "https://github.com/EjembiEmmanuel", - "contributions": [ - "code", - "doc" - ] - }, - { - "login": "kateberryd", - "name": "Catherine Jonathan", - "avatar_url": "https://avatars.githubusercontent.com/u/35270183?v=4", - "profile": "https://github.com/kateberryd", - "contributions": [ - "code" - ] - }, - { - "login": "NeelkanthTandel", - "name": "Neelkanth Tandel", - "avatar_url": "https://avatars.githubusercontent.com/u/68822066?v=4", - "profile": "https://github.com/NeelkanthTandel", - "contributions": [ - "review" - ] - }, - { - "login": "Ugo-X", - "name": "Ugonna Paul Dike", - "avatar_url": "https://avatars.githubusercontent.com/u/133219527?v=4", - "profile": "https://github.com/Ugo-X", - "contributions": [ - "code" - ] - }, - { - "login": "fishonamos", - "name": "Fishon Amos", - "avatar_url": "https://avatars.githubusercontent.com/u/43862685?v=4", - "profile": "https://fishonsnote.medium.com/", - "contributions": [ - "code" - ] - }, - { - "login": "ooochoche", - "name": "Benedict Ejembi", - "avatar_url": "https://avatars.githubusercontent.com/u/101812348?v=4", - "profile": "https://github.com/ooochoche", - "contributions": [ - "infra" - ] - }, - { - "login": "Jemiiah", - "name": "Jemiiah", - "avatar_url": "https://avatars.githubusercontent.com/u/160767568?v=4", - "profile": "https://github.com/Jemiiah", - "contributions": [ - "code" - ] - } - ] +{ + "projectName": "starkfarm-client", + "projectOwner": "strkfarm", + "files": [ + "README.md" + ], + "commitType": "docs", + "commitConvention": "angular", + "contributorsPerLine": 7, + "contributors": [ + { + "login": "akiraonstarknet", + "name": "Akira ", + "avatar_url": "https://avatars.githubusercontent.com/u/156126180?v=4", + "profile": "https://github.com/akiraonstarknet", + "contributions": [ + "ideas", + "code", + "infra" + ] + }, + { + "login": "hemantwasthere", + "name": "Hemant", + "avatar_url": "https://avatars.githubusercontent.com/u/85151171?v=4", + "profile": "https://hemant.lol", + "contributions": [ + "infra" + ] + }, + { + "login": "raizo07", + "name": "Wolf", + "avatar_url": "https://avatars.githubusercontent.com/u/81079370?v=4", + "profile": "https://github.com/raizo07", + "contributions": [ + "infra" + ] + }, + { + "login": "jedstroke", + "name": "Jed", + "avatar_url": "https://avatars.githubusercontent.com/u/86930056?v=4", + "profile": "https://github.com/jedstroke", + "contributions": [ + "code" + ] + }, + { + "login": "EjembiEmmanuel", + "name": "Emmaunuel Ejembi", + "avatar_url": "https://avatars.githubusercontent.com/u/83036156?v=4", + "profile": "https://github.com/EjembiEmmanuel", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "kateberryd", + "name": "Catherine Jonathan", + "avatar_url": "https://avatars.githubusercontent.com/u/35270183?v=4", + "profile": "https://github.com/kateberryd", + "contributions": [ + "code" + ] + }, + { + "login": "NeelkanthTandel", + "name": "Neelkanth Tandel", + "avatar_url": "https://avatars.githubusercontent.com/u/68822066?v=4", + "profile": "https://github.com/NeelkanthTandel", + "contributions": [ + "review" + ] + }, + { + "login": "Ugo-X", + "name": "Ugonna Paul Dike", + "avatar_url": "https://avatars.githubusercontent.com/u/133219527?v=4", + "profile": "https://github.com/Ugo-X", + "contributions": [ + "code" + ] + }, + { + "login": "fishonamos", + "name": "Fishon Amos", + "avatar_url": "https://avatars.githubusercontent.com/u/43862685?v=4", + "profile": "https://fishonsnote.medium.com/", + "contributions": [ + "code" + ] + }, + { + "login": "ooochoche", + "name": "Benedict Ejembi", + "avatar_url": "https://avatars.githubusercontent.com/u/101812348?v=4", + "profile": "https://github.com/ooochoche", + "contributions": [ + "infra" + ] + }, + { + "login": "Jemiiah", + "name": "Jemiiah", + "avatar_url": "https://avatars.githubusercontent.com/u/160767568?v=4", + "profile": "https://github.com/Jemiiah", + "contributions": [ + "code" + ] + } + ] } \ No newline at end of file diff --git a/.env.sample b/.env.sample old mode 100644 new mode 100755 index efd7d26..bce35c4 --- a/.env.sample +++ b/.env.sample @@ -1,2 +1,2 @@ -NEXT_PUBLIC_RPC_URL= +NEXT_PUBLIC_RPC_URL= RPC_URL= \ No newline at end of file diff --git a/.eslintignore b/.eslintignore old mode 100644 new mode 100755 diff --git a/.eslintrc.json b/.eslintrc.json old mode 100644 new mode 100755 index e253f9b..4fd5089 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,147 +1,147 @@ -{ - "parser": "@typescript-eslint/parser", - "env": { - "browser": true, - "node": true, - "es6": true, - "jest": true, - "mocha": true - }, - "plugins": ["@typescript-eslint", "unused-imports"], - "extends": [ - "next/core-web-vitals", - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "parserOptions": { - "ecmaVersion": 2018 - }, - "rules": { - "no-unused-vars": "off", - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "warn", - { - "vars": "all", - "varsIgnorePattern": "^_", - "args": "after-used", - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-namespace": "off", - "strict": 0, - "no-underscore-dangle": 0, - "no-mixed-requires": 0, - "no-process-exit": 0, - "no-warning-comments": 0, - "no-use-before-define": 0, - "curly": 0, - "no-multi-spaces": 0, - "no-alert": 0, - "consistent-return": 0, - "consistent-this": [0, "self"], - "func-style": 0, - "max-nested-callbacks": 0, - "camelcase": 0, - "no-dupe-class-members": 0, - - // Warnings - "no-debugger": 1, - "no-empty": 1, - "no-invalid-regexp": 1, - "no-unused-expressions": 1, - "no-native-reassign": 1, - "no-fallthrough": 1, - - // Errors - "eqeqeq": ["warn"], - "no-undef": 2, - "no-dupe-keys": 2, - "no-empty-character-class": 2, - "no-self-compare": 2, - "valid-typeof": 2, - "handle-callback-err": 2, - "no-shadow-restricted-names": 2, - "no-new-require": 2, - "no-mixed-spaces-and-tabs": 2, - "block-scoped-var": 2, - "no-else-return": 2, - "no-throw-literal": 2, - "no-void": 2, - "radix": 2, - "wrap-iife": [2, "outside"], - "no-shadow": 0, - "no-path-concat": 2, - "valid-jsdoc": [ - 0, - { - "requireReturn": false, - "requireParamDescription": false, - "requireReturnDescription": false - } - ], - - // stylistic errors - "no-spaced-func": 2, - "semi-spacing": 2, - "key-spacing": [2, { "beforeColon": false, "afterColon": true }], - "no-lonely-if": 2, - "no-floating-decimal": 2, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - // "comma": [2, "last"], - "no-multiple-empty-lines": [2, { "max": 1 }], - // "no-nested-ternary": 2, - "operator-assignment": [2, "always"], - "padded-blocks": [2, "never"], - "quote-props": [2, "as-needed"], - "keyword-spacing": [2, { "before": true, "after": true, "overrides": {} }], - "space-before-blocks": [2, "always"], - "array-bracket-spacing": [2, "never"], - "computed-property-spacing": [2, "never"], - "space-in-parens": [2, "never"], - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "wrap-regex": 2, - "linebreak-style": 0, - "semi": [2, "always"], - "arrow-spacing": [2, { "before": true, "after": true }], - "no-class-assign": 2, - "no-const-assign": 2, - "no-this-before-super": 2, - "no-var": 2, - "object-shorthand": [2, "always"], - "prefer-arrow-callback": 2, - "prefer-const": 2, - "prefer-spread": 2, - "prefer-template": 2, - - // typescript - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-use-before-define": ["off"], - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-unnecessary-type-constraint": "off", - "@typescript-eslint/ban-types": "off" - }, - "overrides": [ - { - "files": [ - "test/**", - "*.spec.ts", - "*.test.ts", - "*.jsx", - "*.tsx", - "*.ts", - "*.js" - ], - "rules": { - "prefer-arrow-callback": 0, - "@typescript-eslint/no-non-null-assertion": 0, - "@typescript-eslint/no-unused-vars": 0 - } - } - ] -} +{ + "parser": "@typescript-eslint/parser", + "env": { + "browser": true, + "node": true, + "es6": true, + "jest": true, + "mocha": true + }, + "plugins": ["@typescript-eslint", "unused-imports"], + "extends": [ + "next/core-web-vitals", + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "no-unused-vars": "off", + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": [ + "warn", + { + "vars": "all", + "varsIgnorePattern": "^_", + "args": "after-used", + "argsIgnorePattern": "^_" + } + ], + "@typescript-eslint/no-namespace": "off", + "strict": 0, + "no-underscore-dangle": 0, + "no-mixed-requires": 0, + "no-process-exit": 0, + "no-warning-comments": 0, + "no-use-before-define": 0, + "curly": 0, + "no-multi-spaces": 0, + "no-alert": 0, + "consistent-return": 0, + "consistent-this": [0, "self"], + "func-style": 0, + "max-nested-callbacks": 0, + "camelcase": 0, + "no-dupe-class-members": 0, + + // Warnings + "no-debugger": 1, + "no-empty": 1, + "no-invalid-regexp": 1, + "no-unused-expressions": 1, + "no-native-reassign": 1, + "no-fallthrough": 1, + + // Errors + "eqeqeq": ["warn"], + "no-undef": 2, + "no-dupe-keys": 2, + "no-empty-character-class": 2, + "no-self-compare": 2, + "valid-typeof": 2, + "handle-callback-err": 2, + "no-shadow-restricted-names": 2, + "no-new-require": 2, + "no-mixed-spaces-and-tabs": 2, + "block-scoped-var": 2, + "no-else-return": 2, + "no-throw-literal": 2, + "no-void": 2, + "radix": 2, + "wrap-iife": [2, "outside"], + "no-shadow": 0, + "no-path-concat": 2, + "valid-jsdoc": [ + 0, + { + "requireReturn": false, + "requireParamDescription": false, + "requireReturnDescription": false + } + ], + + // stylistic errors + "no-spaced-func": 2, + "semi-spacing": 2, + "key-spacing": [2, { "beforeColon": false, "afterColon": true }], + "no-lonely-if": 2, + "no-floating-decimal": 2, + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + // "comma": [2, "last"], + "no-multiple-empty-lines": [2, { "max": 1 }], + // "no-nested-ternary": 2, + "operator-assignment": [2, "always"], + "padded-blocks": [2, "never"], + "quote-props": [2, "as-needed"], + "keyword-spacing": [2, { "before": true, "after": true, "overrides": {} }], + "space-before-blocks": [2, "always"], + "array-bracket-spacing": [2, "never"], + "computed-property-spacing": [2, "never"], + "space-in-parens": [2, "never"], + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "wrap-regex": 2, + "linebreak-style": 0, + "semi": [2, "always"], + "arrow-spacing": [2, { "before": true, "after": true }], + "no-class-assign": 2, + "no-const-assign": 2, + "no-this-before-super": 2, + "no-var": 2, + "object-shorthand": [2, "always"], + "prefer-arrow-callback": 2, + "prefer-const": 2, + "prefer-spread": 2, + "prefer-template": 2, + + // typescript + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-use-before-define": ["off"], + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-unnecessary-type-constraint": "off", + "@typescript-eslint/ban-types": "off" + }, + "overrides": [ + { + "files": [ + "test/**", + "*.spec.ts", + "*.test.ts", + "*.jsx", + "*.tsx", + "*.ts", + "*.js" + ], + "rules": { + "prefer-arrow-callback": 0, + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-unused-vars": 0 + } + } + ] +} diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md old mode 100644 new mode 100755 diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md old mode 100644 new mode 100755 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md old mode 100644 new mode 100755 diff --git a/.github/workflows/lint_and_build.yml b/.github/workflows/lint_and_build.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.husky/_/.gitignore b/.husky/_/.gitignore old mode 100644 new mode 100755 diff --git a/.husky/_/applypatch-msg b/.husky/_/applypatch-msg old mode 100644 new mode 100755 diff --git a/.husky/_/commit-msg b/.husky/_/commit-msg old mode 100644 new mode 100755 diff --git a/.husky/_/h b/.husky/_/h old mode 100644 new mode 100755 diff --git a/.husky/_/post-applypatch b/.husky/_/post-applypatch old mode 100644 new mode 100755 diff --git a/.husky/_/post-checkout b/.husky/_/post-checkout old mode 100644 new mode 100755 diff --git a/.husky/_/post-commit b/.husky/_/post-commit old mode 100644 new mode 100755 diff --git a/.husky/_/post-merge b/.husky/_/post-merge old mode 100644 new mode 100755 diff --git a/.husky/_/post-rewrite b/.husky/_/post-rewrite old mode 100644 new mode 100755 diff --git a/.husky/_/pre-applypatch b/.husky/_/pre-applypatch old mode 100644 new mode 100755 diff --git a/.husky/_/pre-auto-gc b/.husky/_/pre-auto-gc old mode 100644 new mode 100755 diff --git a/.husky/_/pre-commit b/.husky/_/pre-commit old mode 100644 new mode 100755 diff --git a/.husky/_/pre-push b/.husky/_/pre-push old mode 100644 new mode 100755 diff --git a/.husky/_/pre-rebase b/.husky/_/pre-rebase old mode 100644 new mode 100755 diff --git a/.husky/_/prepare-commit-msg b/.husky/_/prepare-commit-msg old mode 100644 new mode 100755 diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755 index 4c08af0..6c59a24 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1,2 @@ -yarn run lint:fix -yarn run format:fix +yarn run lint:fix +yarn run format:fix diff --git a/.prettierignore b/.prettierignore old mode 100644 new mode 100755 diff --git a/.prettierrc b/.prettierrc old mode 100644 new mode 100755 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index b497e04..79913f7 --- a/README.md +++ b/README.md @@ -1,105 +1,105 @@ - - -
- -
- - - -# STRKFarm - -STRKFarm is a platform that allows users to better navigate DeFi on Starknet. It has the following features: -1. Show top yield generating pools sorted by Protocols and various Categories. 10+ Protocols are integrated. ✅ -2. Customized strategies, providing one-click investment with automated risk-management ✅ (Adding more) -3. Concentrated Liquidity Impermanent calculator 🚧 -4. One click $STRK claim for DeFi spring users 🚧 - -## Project structure -The project is build using NextJS and Typescript. Below is the broad project structure: -1. Re-usable project wide components go into `src/components`. Page specific components go into their respective folder. (e.g. `src/app/claims/components`) -2. We use [Jotai](https://jotai.org/) for state management. Atoms are written in `src/store`. E.g. `src/store/strategies.atoms.ts`. - Most re-usable data is written into atoms, outside components so that data is eaily accessible across components without dumping custom logic into components. - Its suggested to keep view components low on business logic code. -3. All protocols have a class object (e.g. `src/store/ekubo.store.ts`). Where protocol specific custom logic is written, so that its get written to respective Atoms. -4. You can use `src/store/IDapp.store.ts` to define abstract class or type definitions that can be used within protocol class objects. -5. Custom re-usable hooks are written to `src/hooks`. - -## How to get started - -[![Pull Requests welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg?style=flat-square)](https://github.com/strkfarm/starkfarm-client/issues) -Requirements: -1. Node 20+ - -Clone the repository -```bash -git clone https://github.com/strkfarm/starkfarm-client.git -``` - -Install dependencies and run the development build - -```bash -yarn - -yarn run dev -``` - -You should see something like this: - -```sh -> starknet-id-website@0.1.0 dev -> next dev - - ▲ Next.js 14.1.0 - - Local: http://localhost:3000 - - Environments: .env - - ✓ Ready in 1431ms -``` - -## 🤝 Contribute - - -We're always looking for for stallions with great NextJS & Typescript skills to further this tool, to join our community and contribute to STRKFarm. Check out our [contributing guide](./CONTRIBUTING.md) -for more information on how to get started. - -To connect with us regarding any queries about contributing to the repo, feel free to join our telegram group [here](https://t.me/+HQ_eHaXmF-1lZDc1). Head to `dev` topic. - - -## References - -- [Telegram](https://t.me/+HQ_eHaXmF-1lZDc1) -- [OnlyDust](https://app.onlydust.com/p/strkfarm) -- [Website](https://www.strkfarm.xyz/) - -## Contributors ✨ -Thanks goes to these wonderful people. - - - - - - - - - - - - - - - - - - - - - - -
Akira
Akira

🤔 💻 🚇
Hemant
Hemant

🚇
Wolf
Wolf

🚇
Jed
Jed

💻
Emmaunuel Ejembi
Emmaunuel Ejembi

💻 📖
Catherine Jonathan
Catherine Jonathan

💻
Neelkanth Tandel
Neelkanth Tandel

👀
Ugonna Paul Dike
Ugonna Paul Dike

💻
Fishon Amos
Fishon Amos

💻
Benedict Ejembi
Benedict Ejembi

🚇
Jemiiah
Jemiiah

💻
- - - - - - -[![All Contributors](https://img.shields.io/github/all-contributors/akiraonstarknet/starkfarm-client?color=ee8449&style=flat-square)](#contributors) + + +
+ +
+ + + +# STRKFarm + +STRKFarm is a platform that allows users to better navigate DeFi on Starknet. It has the following features: +1. Show top yield generating pools sorted by Protocols and various Categories. 10+ Protocols are integrated. ✅ +2. Customized strategies, providing one-click investment with automated risk-management ✅ (Adding more) +3. Concentrated Liquidity Impermanent calculator 🚧 +4. One click $STRK claim for DeFi spring users 🚧 + +## Project structure +The project is build using NextJS and Typescript. Below is the broad project structure: +1. Re-usable project wide components go into `src/components`. Page specific components go into their respective folder. (e.g. `src/app/claims/components`) +2. We use [Jotai](https://jotai.org/) for state management. Atoms are written in `src/store`. E.g. `src/store/strategies.atoms.ts`. + Most re-usable data is written into atoms, outside components so that data is eaily accessible across components without dumping custom logic into components. + Its suggested to keep view components low on business logic code. +3. All protocols have a class object (e.g. `src/store/ekubo.store.ts`). Where protocol specific custom logic is written, so that its get written to respective Atoms. +4. You can use `src/store/IDapp.store.ts` to define abstract class or type definitions that can be used within protocol class objects. +5. Custom re-usable hooks are written to `src/hooks`. + +## How to get started + +[![Pull Requests welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg?style=flat-square)](https://github.com/strkfarm/starkfarm-client/issues) +Requirements: +1. Node 20+ + +Clone the repository +```bash +git clone https://github.com/strkfarm/starkfarm-client.git +``` + +Install dependencies and run the development build + +```bash +yarn + +yarn run dev +``` + +You should see something like this: + +```sh +> starknet-id-website@0.1.0 dev +> next dev + + ▲ Next.js 14.1.0 + - Local: http://localhost:3000 + - Environments: .env + + ✓ Ready in 1431ms +``` + +## 🤝 Contribute + + +We're always looking for for stallions with great NextJS & Typescript skills to further this tool, to join our community and contribute to STRKFarm. Check out our [contributing guide](./CONTRIBUTING.md) +for more information on how to get started. + +To connect with us regarding any queries about contributing to the repo, feel free to join our telegram group [here](https://t.me/+HQ_eHaXmF-1lZDc1). Head to `dev` topic. + + +## References + +- [Telegram](https://t.me/+HQ_eHaXmF-1lZDc1) +- [OnlyDust](https://app.onlydust.com/p/strkfarm) +- [Website](https://www.strkfarm.xyz/) + +## Contributors ✨ +Thanks goes to these wonderful people. + + + + + + + + + + + + + + + + + + + + + + +
Akira
Akira

🤔 💻 🚇
Hemant
Hemant

🚇
Wolf
Wolf

🚇
Jed
Jed

💻
Emmaunuel Ejembi
Emmaunuel Ejembi

💻 📖
Catherine Jonathan
Catherine Jonathan

💻
Neelkanth Tandel
Neelkanth Tandel

👀
Ugonna Paul Dike
Ugonna Paul Dike

💻
Fishon Amos
Fishon Amos

💻
Benedict Ejembi
Benedict Ejembi

🚇
Jemiiah
Jemiiah

💻
+ + + + + + +[![All Contributors](https://img.shields.io/github/all-contributors/akiraonstarknet/starkfarm-client?color=ee8449&style=flat-square)](#contributors) diff --git a/analysis/uniV3Math.ipynb b/analysis/uniV3Math.ipynb old mode 100644 new mode 100755 index 86caa6a..741d50e --- a/analysis/uniV3Math.ipynb +++ b/analysis/uniV3Math.ipynb @@ -1,140 +1,140 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Uniswap math functions\n", - "# https://youtu.be/_asFkMz4zhw?t=25 - Uniswap V3 - Liquidity | DeFi\n", - "\n", - "def get_liquidity_0(x, sp, sb):\n", - " return x * sp * sb / (sb - sp)\n", - "\n", - "def get_liquidity_1(y, sp, sa):\n", - " return y / (sp - sa)\n", - "\n", - "def get_liquidity(x, y, sp, sa, sb):\n", - " if sp <= sa:\n", - " liquidity = get_liquidity_0(x, sp, sb)\n", - " elif sp < sb:\n", - " liquidity0 = get_liquidity_0(x, sp, sb)\n", - " liquidity1 = get_liquidity_1(y, sp, sa)\n", - " liquidity = min(liquidity0, liquidity1)\n", - " else:\n", - " liquidity = get_liquidity_1(y, sp, sa)\n", - " return liquidity\n", - "\n", - "\n", - "#\n", - "# Calculate x and y given liquidity and price range\n", - "#\n", - "def calculate_x(L, sp, sa, sb):\n", - " sp = max(min(sp, sb), sa) # if the price is outside the range, use the range endpoints instead\n", - " return L * (sb - sp) / (sp * sb)\n", - "\n", - "def calculate_y(L, sp, sa, sb):\n", - " sp = max(min(sp, sb), sa) # if the price is outside the range, use the range endpoints instead\n", - " return L * (sp - sa)\n", - "\n", - "def calculate_a1(L, sp, sb, x, y):\n", - " # https://www.wolframalpha.com/input/?i=solve+L+%3D+y+%2F+%28sqrt%28P%29+-+a%29+for+a\n", - " # sqrt(a) = sqrt(P) - y / L\n", - " return (sp - y / L) ** 2\n", - "\n", - "def calculate_a2(sp, sb, x, y):\n", - " # https://www.wolframalpha.com/input/?i=solve+++x+sqrt%28P%29+sqrt%28b%29+%2F+%28sqrt%28b%29++-+sqrt%28P%29%29+%3D+y+%2F+%28sqrt%28P%29+-+a%29%2C+for+a\n", - " # sqrt(a) = (y/sqrt(b) + sqrt(P) x - y/sqrt(P))/x\n", - " # simplify:\n", - " # sqrt(a) = y/(sqrt(b) x) + sqrt(P) - y/(sqrt(P) x)\n", - " sa = y / (sb * x) + sp - y / (sp * x)\n", - " return sa ** 2\n", - "\n", - "#\n", - "# Two different ways how to calculate p_b. calculate_b1() uses liquidity as an input, calculate_b2() does not.\n", - "#\n", - "def calculate_b1(L, sp, sa, x, y):\n", - " # https://www.wolframalpha.com/input/?i=solve+L+%3D+x+sqrt%28P%29+sqrt%28b%29+%2F+%28sqrt%28b%29+-+sqrt%28P%29%29+for+b\n", - " # sqrt(b) = (L sqrt(P)) / (L - sqrt(P) x)\n", - " return ((L * sp) / (L - sp * x)) ** 2\n", - "\n", - "def calculate_b2(sp, sa, x, y):\n", - " # find the square root of b:\n", - " # https://www.wolframalpha.com/input/?i=solve+++x+sqrt%28P%29+b+%2F+%28b++-+sqrt%28P%29%29+%3D+y+%2F+%28sqrt%28P%29+-+sqrt%28a%29%29%2C+for+b\n", - " # sqrt(b) = (sqrt(P) y)/(sqrt(a) sqrt(P) x - P x + y)\n", - " P = sp ** 2\n", - " return (sp * y / ((sa * sp - P) * x + y)) ** 2\n", - "\n", - "\n", - "\n", - "def calculate_P(x,y,sa,sb):\n", - " p = sb*x\n", - " q = y-x*sa*sb\n", - " r = -sb*y\n", - " return (math.pow(-1*q+(q**2 - 4*p*r),0.5)/(2*p) )\n", - "\n", - "def tick_price(t):\n", - " return 1.0001**t\n", - "\n", - "def price_tick(p):\n", - " return math.log(p,1.0001)\n", - "\n", - "def getYFromX(x,sa,sb,sp):\n", - " return x * (sp - sa) * sp *sb /(sb - sp)\n", - "\n", - "# ? P is Y/X\n", - "def simulator_calc_L(x,pa,pb,p):\n", - " sa = pa ** 0.5\n", - " sb = pb ** 0.5\n", - " sp = p ** 0.5\n", - " if p >= pb:\n", - " y=x\n", - " x=0\n", - " L = get_liquidity(x, y, sp, sa, sb)\n", - " elif p <= pa:\n", - " y = 0\n", - " else:\n", - " print(\"sim2\", sa, sb, sp, x)\n", - " y = getYFromX(x, sa, sb, sp)\n", - " L = get_liquidity(x, y, sp, sa, sb)\n", - "\n", - " return L,y\n", - "\n", - "# ! Requires X token to be a stable token\n", - "def getXY(capitalDollar, token0Decimals, token1Decimals, Pxusd, Pyusd, sp, sa, sb):\n", - " # captal = x * Pxusd / xdecimals + y * Pyusd / yDecimals ----- eq1\n", - " # replace y with x from getYFromX\n", - "\n", - " factor1 = Pxusd / (10 ** token0Decimals)\n", - " factor2 = Pyusd / (10 ** token1Decimals)\n", - " factor3 = (sp - sa) * sp * sb / (sb - sp)\n", - "\n", - " x = capitalDollar / (factor1 + factor3 * factor2)\n", - " y = getYFromX(x, sa, sb, sp)\n", - " return x, y" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Uniswap math functions\n", + "# https://youtu.be/_asFkMz4zhw?t=25 - Uniswap V3 - Liquidity | DeFi\n", + "\n", + "def get_liquidity_0(x, sp, sb):\n", + " return x * sp * sb / (sb - sp)\n", + "\n", + "def get_liquidity_1(y, sp, sa):\n", + " return y / (sp - sa)\n", + "\n", + "def get_liquidity(x, y, sp, sa, sb):\n", + " if sp <= sa:\n", + " liquidity = get_liquidity_0(x, sp, sb)\n", + " elif sp < sb:\n", + " liquidity0 = get_liquidity_0(x, sp, sb)\n", + " liquidity1 = get_liquidity_1(y, sp, sa)\n", + " liquidity = min(liquidity0, liquidity1)\n", + " else:\n", + " liquidity = get_liquidity_1(y, sp, sa)\n", + " return liquidity\n", + "\n", + "\n", + "#\n", + "# Calculate x and y given liquidity and price range\n", + "#\n", + "def calculate_x(L, sp, sa, sb):\n", + " sp = max(min(sp, sb), sa) # if the price is outside the range, use the range endpoints instead\n", + " return L * (sb - sp) / (sp * sb)\n", + "\n", + "def calculate_y(L, sp, sa, sb):\n", + " sp = max(min(sp, sb), sa) # if the price is outside the range, use the range endpoints instead\n", + " return L * (sp - sa)\n", + "\n", + "def calculate_a1(L, sp, sb, x, y):\n", + " # https://www.wolframalpha.com/input/?i=solve+L+%3D+y+%2F+%28sqrt%28P%29+-+a%29+for+a\n", + " # sqrt(a) = sqrt(P) - y / L\n", + " return (sp - y / L) ** 2\n", + "\n", + "def calculate_a2(sp, sb, x, y):\n", + " # https://www.wolframalpha.com/input/?i=solve+++x+sqrt%28P%29+sqrt%28b%29+%2F+%28sqrt%28b%29++-+sqrt%28P%29%29+%3D+y+%2F+%28sqrt%28P%29+-+a%29%2C+for+a\n", + " # sqrt(a) = (y/sqrt(b) + sqrt(P) x - y/sqrt(P))/x\n", + " # simplify:\n", + " # sqrt(a) = y/(sqrt(b) x) + sqrt(P) - y/(sqrt(P) x)\n", + " sa = y / (sb * x) + sp - y / (sp * x)\n", + " return sa ** 2\n", + "\n", + "#\n", + "# Two different ways how to calculate p_b. calculate_b1() uses liquidity as an input, calculate_b2() does not.\n", + "#\n", + "def calculate_b1(L, sp, sa, x, y):\n", + " # https://www.wolframalpha.com/input/?i=solve+L+%3D+x+sqrt%28P%29+sqrt%28b%29+%2F+%28sqrt%28b%29+-+sqrt%28P%29%29+for+b\n", + " # sqrt(b) = (L sqrt(P)) / (L - sqrt(P) x)\n", + " return ((L * sp) / (L - sp * x)) ** 2\n", + "\n", + "def calculate_b2(sp, sa, x, y):\n", + " # find the square root of b:\n", + " # https://www.wolframalpha.com/input/?i=solve+++x+sqrt%28P%29+b+%2F+%28b++-+sqrt%28P%29%29+%3D+y+%2F+%28sqrt%28P%29+-+sqrt%28a%29%29%2C+for+b\n", + " # sqrt(b) = (sqrt(P) y)/(sqrt(a) sqrt(P) x - P x + y)\n", + " P = sp ** 2\n", + " return (sp * y / ((sa * sp - P) * x + y)) ** 2\n", + "\n", + "\n", + "\n", + "def calculate_P(x,y,sa,sb):\n", + " p = sb*x\n", + " q = y-x*sa*sb\n", + " r = -sb*y\n", + " return (math.pow(-1*q+(q**2 - 4*p*r),0.5)/(2*p) )\n", + "\n", + "def tick_price(t):\n", + " return 1.0001**t\n", + "\n", + "def price_tick(p):\n", + " return math.log(p,1.0001)\n", + "\n", + "def getYFromX(x,sa,sb,sp):\n", + " return x * (sp - sa) * sp *sb /(sb - sp)\n", + "\n", + "# ? P is Y/X\n", + "def simulator_calc_L(x,pa,pb,p):\n", + " sa = pa ** 0.5\n", + " sb = pb ** 0.5\n", + " sp = p ** 0.5\n", + " if p >= pb:\n", + " y=x\n", + " x=0\n", + " L = get_liquidity(x, y, sp, sa, sb)\n", + " elif p <= pa:\n", + " y = 0\n", + " else:\n", + " print(\"sim2\", sa, sb, sp, x)\n", + " y = getYFromX(x, sa, sb, sp)\n", + " L = get_liquidity(x, y, sp, sa, sb)\n", + "\n", + " return L,y\n", + "\n", + "# ! Requires X token to be a stable token\n", + "def getXY(capitalDollar, token0Decimals, token1Decimals, Pxusd, Pyusd, sp, sa, sb):\n", + " # captal = x * Pxusd / xdecimals + y * Pyusd / yDecimals ----- eq1\n", + " # replace y with x from getYFromX\n", + "\n", + " factor1 = Pxusd / (10 ** token0Decimals)\n", + " factor2 = Pyusd / (10 ** token1Decimals)\n", + " factor3 = (sp - sa) * sp * sb / (sb - sp)\n", + "\n", + " x = capitalDollar / (factor1 + factor3 * factor2)\n", + " y = getYFromX(x, sa, sb, sp)\n", + " return x, y" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/analysis/v3IL.ipynb b/analysis/v3IL.ipynb old mode 100644 new mode 100755 index ac6c8a9..2357670 --- a/analysis/v3IL.ipynb +++ b/analysis/v3IL.ipynb @@ -1,135 +1,135 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "import numpy as np\n", - "import pandas as pd\n", - "%run analysis/uniV3Math.ipynb\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Step: 4.0\n" - ] - } - ], - "source": [ - "# MySwap: https://starkscan.co/contract/0xfff107e2403123c7df78d91728a7ee5cfd557aec0fa2d2bdc5891c286bbfff#read-write-contract-sub-write\n", - "\n", - "# P is Y/X\n", - "def get_il(Pnow, Pstart, Pa, Pb):\n", - " k = Pnow / float(Pstart)\n", - " return (2 * math.sqrt(k) - 1 - k) / (1 + k - math.sqrt(Pa/float(Pstart)) - k * math.sqrt(Pstart / float(Pb)))\n", - "\n", - "# qtys are decimal adjusted. i.e. for 1.01 ETH as x, xQty is 1.01 and not (1.01 * 10**18)\n", - "# xPrice is price in USD (float)\n", - "def get_hodlings_usd(xQty: float, xPrice: float, yQty: float, yPrice: float):\n", - " return xQty * xPrice + yQty * yPrice\n", - "\n", - "# E.g. Pool STRK/ETH\n", - "# X is amount of ETH at a tick in pool\n", - "# Y is amount of STRK at a tick in pool\n", - "xDecimals = 18\n", - "yDecimals = 18\n", - "simulationPeriod = 90 # days\n", - "expectedYieldPercent = 100 # e.g. 100% percent\n", - "\n", - "Pa = 1500 # 1500 STRK per ETH\n", - "Pb = 1700 # 1700 STRK per ETH\n", - "P = 1600 # Current price\n", - "\n", - "x = 10**18 # initial ETH investment\n", - "y = getYFromX(x, Pa ** 0.5, Pb ** 0.5, P ** 0.5)\n", - "\n", - "Pdiff = Pb - Pa # Pb >= Pa always\n", - "# We vary Pnow from [Pa - (Pdiff / 2)] to [Pb + (Pdiff/2)]\n", - "step = (Pdiff * 2) / 100 # Divides total chart range in 100 points\n", - "\n", - "yPrice = 2.0 # STRK price USD\n", - "\n", - "i = 0\n", - "rows = []\n", - "for Pnow in np.arange(Pa - (Pdiff / 2), Pb + (Pdiff/2), step):\n", - " # We fix USD price of one token to get other token usd price\n", - " xPrice = yPrice * (Pnow * (10 ** (xDecimals - yDecimals)))\n", - " hdl = get_hodlings_usd(x / 10.0 ** xDecimals, xPrice, y / 10.0**yDecimals, yPrice)\n", - " il = get_il(Pnow, P, Pa, Pb)\n", - " valueWithIL = hdl * (1 + il)\n", - " expectedYield = hdl * (expectedYieldPercent / 100) * simulationPeriod / 365\n", - " netValue = valueWithIL + expectedYield\n", - " rows.append({\n", - " 'price': Pnow,\n", - " 'hodl': hdl,\n", - " 'ILValue': valueWithIL,\n", - " 'netValue': netValue\n", - " })\n", - " \n", - "df = pd.DataFrame(rows, columns=['price', 'hodl', 'ILValue', 'netValue'])\n", - "df.set_index('price', inplace=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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1f3+1gyMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt1OjANO8eXMsFst5y6RJkwAoKipi0qRJREREEBgYyMiRI8nIyHB6jtTUVEaMGIG/vz9RUVE8+OCDlJWVObVZvnw5PXr0wMfHh9atWzNv3ryfN0oRERFpUGoUYNauXUtaWppjWbJkCQC33HILAA888ABffvkl//rXv/j+++85fvw4N998s+Px5eXljBgxgpKSElauXMn8+fOZN28eTzzxhKPNwYMHGTFiBFdffTWbNm3i/vvv5+677+brr7+ujfGKiIhIA2AxDMO41Afff//9LFy4kL1792Kz2WjSpAkffPABv/71rwHYtWsXHTp0ICUlhSuvvJJFixZx/fXXc/z4caKjowGYM2cO06ZN48SJE3h7ezNt2jS++uortm3b5nid2267jezsbBYvXlztvtlsNkJCQsjJySE4OPhShygiIiJ1qLrf35d8DExJSQnvv/8+48aNw2KxsH79ekpLSxk6dKijTfv27UlISCAlJQWAlJQUunTp4ggvAMnJydhsNrZv3+5oc/ZzVLapfI4LKS4uxmazOS0iIiJSu07nl/DtjgxeXLyL9Jwil/XD81If+Nlnn5Gdnc2YMWMASE9Px9vbm9DQUKd20dHRpKenO9qcHV4qt1duu1gbm81GYWEhfn5+VfZn1qxZzJgx41KHIyIiIucotxvsychlQ2oWGw5nsyE1i4Mn8x3b28UEcWP3pi7p2yUHmL///e9cd911xMXF1WZ/Ltn06dOZOnWq477NZiM+Pt6FPRIREXEvOYWlbEzNYsPhLDakZrPpSDZ5xWXntWsdFUiPhFCahVU9qVAXLinAHD58mG+//ZZPPvnEsS4mJoaSkhKys7OdZmEyMjKIiYlxtFmzZo3Tc1WepXR2m3PPXMrIyCA4OPiCsy8APj4++Pj4XMpwREREGh27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PJkvvvjC0abOPo9GIwcYn3766Xnrjx49ajRt2tTYtm2bkZiYaLz66quObTt27DAAY+3atY51ixYtMiwWi3Hs2DHDMAzjrbfeMsLCwozi4mJHm2nTphnt2rW7bGO5kEsZo2EYVa47W30f4+jRo40bb7zxgo9pCO/jT43RMNz/fbz11luN3/72txd8THZ2tuHl5WX861//cqzbuXOnARgpKSmGYRjGf//7X8NqtRrp6emONm+//bYRHBzsNO66cCljNAzDGDRokPGHP/zhgtvr+xjPdeONNxrXXHON435D+Dye69wxGob7fx47depkPP30007revToYTz66KOGYdTt57FRzsD8FLvdzp133smDDz5Ip06dztuekpJCaGgovXr1cqwbOnQoVquV1atXO9oMHDgQb29vR5vk5GR2795NVlbW5R/ET/ipMVZ6/vnniYiIICkpiZdeeslpiq++jxFg+fLlREVF0a5dO+69915OnTrl2NYQ3ke4+Bgruev7aLfb+eqrr2jbti3JyclERUXRp08fp2nt9evXU1paytChQx3r2rdvT0JCAikpKYA5xi5duhAdHe1ok5ycjM1mY/v27XU2nqpUZ4yVFixYQGRkJJ07d2b69OkUFBQ4ttXnMZ4rIyODr776ivHjxzvWNZTPY6WqxljJXT+PAFdddRVffPEFx44dwzAMvvvuO/bs2cOwYcOAuv08NtiLOf4cL7zwAp6enkyZMqXK7enp6URFRTmt8/T0JDw8nPT0dEebFi1aOLWpfLPS09MJCwu7DD2vvp8aI8CUKVPo0aMH4eHhrFy5kunTp5OWlsYrr7wC1P8xDh8+nJtvvpkWLVqwf/9+HnnkEa677jpSUlLw8PBoEO/jT40R3Pt9zMzMJC8vj+eff56ZM2fywgsvsHjxYm6++Wa+++47Bg0aRHp6Ot7e3oSGhjo9Njo62ul9PPuXZeX2ym2uVJ0xAtxxxx0kJiYSFxfHli1bmDZtGrt37+aTTz4B6vcYzzV//nyCgoKcdis0hM/j2aoaI7j35xHgjTfeYOLEiTRr1gxPT0+sVit//etfGThwoKOPdfV5VIA5x/r163n99dfZsGEDFovF1d25LKo7xqlTpzp+7tq1K97e3vzud79j1qxZblEO+7bbbnP83KVLF7p27UqrVq1Yvnw5Q4YMcWHPak91xujO76Pdbgfgxhtv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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "df.plot.line()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "import numpy as np\n", + "import pandas as pd\n", + "%run analysis/uniV3Math.ipynb\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step: 4.0\n" + ] + } + ], + "source": [ + "# MySwap: https://starkscan.co/contract/0xfff107e2403123c7df78d91728a7ee5cfd557aec0fa2d2bdc5891c286bbfff#read-write-contract-sub-write\n", + "\n", + "# P is Y/X\n", + "def get_il(Pnow, Pstart, Pa, Pb):\n", + " k = Pnow / float(Pstart)\n", + " return (2 * math.sqrt(k) - 1 - k) / (1 + k - math.sqrt(Pa/float(Pstart)) - k * math.sqrt(Pstart / float(Pb)))\n", + "\n", + "# qtys are decimal adjusted. i.e. for 1.01 ETH as x, xQty is 1.01 and not (1.01 * 10**18)\n", + "# xPrice is price in USD (float)\n", + "def get_hodlings_usd(xQty: float, xPrice: float, yQty: float, yPrice: float):\n", + " return xQty * xPrice + yQty * yPrice\n", + "\n", + "# E.g. Pool STRK/ETH\n", + "# X is amount of ETH at a tick in pool\n", + "# Y is amount of STRK at a tick in pool\n", + "xDecimals = 18\n", + "yDecimals = 18\n", + "simulationPeriod = 90 # days\n", + "expectedYieldPercent = 100 # e.g. 100% percent\n", + "\n", + "Pa = 1500 # 1500 STRK per ETH\n", + "Pb = 1700 # 1700 STRK per ETH\n", + "P = 1600 # Current price\n", + "\n", + "x = 10**18 # initial ETH investment\n", + "y = getYFromX(x, Pa ** 0.5, Pb ** 0.5, P ** 0.5)\n", + "\n", + "Pdiff = Pb - Pa # Pb >= Pa always\n", + "# We vary Pnow from [Pa - (Pdiff / 2)] to [Pb + (Pdiff/2)]\n", + "step = (Pdiff * 2) / 100 # Divides total chart range in 100 points\n", + "\n", + "yPrice = 2.0 # STRK price USD\n", + "\n", + "i = 0\n", + "rows = []\n", + "for Pnow in np.arange(Pa - (Pdiff / 2), Pb + (Pdiff/2), step):\n", + " # We fix USD price of one token to get other token usd price\n", + " xPrice = yPrice * (Pnow * (10 ** (xDecimals - yDecimals)))\n", + " hdl = get_hodlings_usd(x / 10.0 ** xDecimals, xPrice, y / 10.0**yDecimals, yPrice)\n", + " il = get_il(Pnow, P, Pa, Pb)\n", + " valueWithIL = hdl * (1 + il)\n", + " expectedYield = hdl * (expectedYieldPercent / 100) * simulationPeriod / 365\n", + " netValue = valueWithIL + expectedYield\n", + " rows.append({\n", + " 'price': Pnow,\n", + " 'hodl': hdl,\n", + " 'ILValue': valueWithIL,\n", + " 'netValue': netValue\n", + " })\n", + " \n", + "df = pd.DataFrame(rows, columns=['price', 'hodl', 'ILValue', 'netValue'])\n", + "df.set_index('price', inplace=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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1f3+1gyMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt6MAIyIiIm5HAUZERETcjgKMiIiIuB0FGBEREXE7CjAiIiLidhRgRERExO0owIiIiIjbUYARERERt1OjANO8eXMsFst5y6RJkwAoKipi0qRJREREEBgYyMiRI8nIyHB6jtTUVEaMGIG/vz9RUVE8+OCDlJWVObVZvnw5PXr0wMfHh9atWzNv3ryfN0oRERFpUGoUYNauXUtaWppjWbJkCQC33HILAA888ABffvkl//rXv/j+++85fvw4N998s+Px5eXljBgxgpKSElauXMn8+fOZN28eTzzxhKPNwYMHGTFiBFdffTWbNm3i/vvv5+677+brr7+ujfGKiIhIA2AxDMO41Afff//9LFy4kL1792Kz2WjSpAkffPABv/71rwHYtWsXHTp0ICUlhSuvvJJFixZx/fXXc/z4caKjowGYM2cO06ZN48SJE3h7ezNt2jS++uortm3b5nid2267jezsbBYvXlztvtlsNkJCQsjJySE4OPhShygiIiJ1qLrf35d8DExJSQnvv/8+48aNw2KxsH79ekpLSxk6dKijTfv27UlISCAlJQWAlJQUunTp4ggvAMnJydhsNrZv3+5oc/ZzVLapfI4LKS4uxmazOS0iIiJSu07nl/DtjgxeXLyL9Jwil/XD81If+Nlnn5Gdnc2YMWMASE9Px9vbm9DQUKd20dHRpKenO9qcHV4qt1duu1gbm81GYWEhfn5+VfZn1qxZzJgx41KHIyIiIucotxvsychlQ2oWGw5nsyE1i4Mn8x3b28UEcWP3pi7p2yUHmL///e9cd911xMXF1WZ/Ltn06dOZOnWq477NZiM+Pt6FPRIREXEvOYWlbEzNYsPhLDakZrPpSDZ5xWXntWsdFUiPhFCahVU9qVAXLinAHD58mG+//ZZPPvnEsS4mJoaSkhKys7OdZmEyMjKIiYlxtFmzZo3Tc1WepXR2m3PPXMrIyCA4OPiCsy8APj4++Pj4XMpwREREGh27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PJkvvvjC0abOPo9GIwcYn3766Xnrjx49ajRt2tTYtm2bkZiYaLz66quObTt27DAAY+3atY51ixYtMiwWi3Hs2DHDMAzjrbfeMsLCwozi4mJHm2nTphnt2rW7bGO5kEsZo2EYVa47W30f4+jRo40bb7zxgo9pCO/jT43RMNz/fbz11luN3/72txd8THZ2tuHl5WX861//cqzbuXOnARgpKSmGYRjGf//7X8NqtRrp6emONm+//bYRHBzsNO66cCljNAzDGDRokPGHP/zhgtvr+xjPdeONNxrXXHON435D+Dye69wxGob7fx47depkPP30007revToYTz66KOGYdTt57FRzsD8FLvdzp133smDDz5Ip06dztuekpJCaGgovXr1cqwbOnQoVquV1atXO9oMHDgQb29vR5vk5GR2795NVlbW5R/ET/ipMVZ6/vnniYiIICkpiZdeeslpiq++jxFg+fLlREVF0a5dO+69915OnTrl2NYQ3ke4+Bgruev7aLfb+eqrr2jbti3JyclERUXRp08fp2nt9evXU1paytChQx3r2rdvT0JCAikpKYA5xi5duhAdHe1ok5ycjM1mY/v27XU2nqpUZ4yVFixYQGRkJJ07d2b69OkUFBQ4ttXnMZ4rIyODr776ivHjxzvWNZTPY6WqxljJXT+PAFdddRVffPEFx44dwzAMvvvuO/bs2cOwYcOAuv08NtiLOf4cL7zwAp6enkyZMqXK7enp6URFRTmt8/T0JDw8nPT0dEebFi1aOLWpfLPS09MJCwu7DD2vvp8aI8CUKVPo0aMH4eHhrFy5kunTp5OWlsYrr7wC1P8xDh8+nJtvvpkWLVqwf/9+HnnkEa677jpSUlLw8PBoEO/jT40R3Pt9zMzMJC8vj+eff56ZM2fywgsvsHjxYm6++Wa+++47Bg0aRHp6Ot7e3oSGhjo9Njo62ul9PPuXZeX2ym2uVJ0xAtxxxx0kJiYSFxfHli1bmDZtGrt37+aTTz4B6vcYzzV//nyCgoKcdis0hM/j2aoaI7j35xHgjTfeYOLEiTRr1gxPT0+sVit//etfGThwoKOPdfV5VIA5x/r163n99dfZsGEDFovF1d25LKo7xqlTpzp+7tq1K97e3vzud79j1qxZblEO+7bbbnP83KVLF7p27UqrVq1Yvnw5Q4YMcWHPak91xujO76Pdbgfgxhtv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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot.line()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/add_new_protocol.md b/docs/add_new_protocol.md old mode 100644 new mode 100755 diff --git a/docs/vercel-deployment.md b/docs/vercel-deployment.md old mode 100644 new mode 100755 diff --git a/generateChangelog.js b/generateChangelog.js old mode 100644 new mode 100755 index 717e5a5..e41862a --- a/generateChangelog.js +++ b/generateChangelog.js @@ -1,22 +1,22 @@ -import fs from "fs"; -import { version } from './package.json'; - -// write changelog to CHANGELOG.md -// fs.writeFileSync("CHANGELOG.md", changelogContent); - -// Update current version in README -fs.readFile("README.md", "utf8", (err, data) => { - if (err) { - console.error(err); - return; - } - - const updatedReadme = data.replace(/CURRENT_VERSION_PLACEHOLDER/g, version); - fs.writeFile("README.md", updatedReadme, "utf8", (err) => { - if (err) { - console.error(err); - return; - } - console.log("README updated with current version"); - }); -}); +import fs from "fs"; +import { version } from './package.json'; + +// write changelog to CHANGELOG.md +// fs.writeFileSync("CHANGELOG.md", changelogContent); + +// Update current version in README +fs.readFile("README.md", "utf8", (err, data) => { + if (err) { + console.error(err); + return; + } + + const updatedReadme = data.replace(/CURRENT_VERSION_PLACEHOLDER/g, version); + fs.writeFile("README.md", updatedReadme, "utf8", (err) => { + if (err) { + console.error(err); + return; + } + console.log("README updated with current version"); + }); +}); diff --git a/next.config.mjs b/next.config.mjs old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 10719e6..3d5e869 --- a/package.json +++ b/package.json @@ -1,85 +1,85 @@ -{ - "name": "strkfarm-client", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "start": "next start", - "lint": "next lint", - "build": "next build", - "lint:check": "eslint --config .eslintrc.json .", - "lint:fix": "eslint --config .eslintrc.json . --fix", - "format:check": "prettier --check \"**/*.{ts,tsx,json}\"", - "format:fix": "prettier --write \"**/*.{ts,tsx,json}\"", - "prepare": "husky" - }, - "files": [ - "CHANGELOG.md", - "dist" - ], - "dependencies": { - "@ajna/pagination": "1.4.19", - "@chakra-ui/icons": "2.1.1", - "@chakra-ui/react": "2.8.2", - "@emotion/react": "11.11.3", - "@emotion/styled": "11.11.0", - "@next/third-parties": "14.1.3", - "@nikolovlazar/chakra-ui-prose": "1.2.1", - "@starknet-react/chains": "0.1.7", - "@starknet-react/core": "2.8.0", - "@tanstack/query-core": "5.28.0", - "@types/mixpanel-browser": "2.49.0", - "@types/mustache": "4.2.5", - "@vercel/analytics": "1.2.2", - "@vercel/speed-insights": "^1.0.12", - "axios": "1.6.7", - "bignumber.js": "4.0.4", - "chroma.ts": "1.0.10", - "ethers": "6.11.1", - "framer-motion": "11.0.5", - "get-starknet": "3.0.1", - "get-starknet-core": "3.2.0", - "jotai": "2.6.4", - "jotai-tanstack-query": "0.8.5", - "mixpanel-browser": "2.49.0", - "mustache": "4.2.0", - "next": "14.1.0", - "react": "18", - "react-device-detect": "2.2.3", - "react-dom": "18", - "react-hot-toast": "2.4.1", - "react-mixpanel": "1.0.5", - "react-pro-sidebar": "1.1.0", - "react-responsive-carousel": "3.2.23", - "react-select": "5.8.0", - "react-share": "5.1.0", - "sharp": "0.33.4", - "starknet": "6.4.1", - "starknetkit": "1.1.9", - "swr": "2.2.5", - "wonka": "6.3.4" - }, - "devDependencies": { - "@types/node": "20", - "@types/react": "18", - "@types/react-dom": "18", - "@typescript-eslint/eslint-plugin": "7.7.0", - "@typescript-eslint/parser": "7.7.0", - "autoprefixer": "10.0.1", - "conventional-changelog": "5.1.0", - "conventional-commits-parser": "5.0.0", - "embla-carousel-autoplay": "8.1.6", - "embla-carousel-react": "8.1.6", - "eslint": "8", - "eslint-config-next": "14.1.0", - "eslint-plugin-unused-imports": "3.1.0", - "husky": "^9.1.1", - "postcss": "8", - "prettier": "3.3.3", - "tailwindcss": "3.3.0", - "typescript": "5" - }, - "engines": { - "node": "20.x" - } -} +{ + "name": "strkfarm-client", + "version": "0.1.1", + "private": true, + "scripts": { + "dev": "next dev", + "start": "next start", + "lint": "next lint", + "build": "next build", + "lint:check": "eslint --config .eslintrc.json .", + "lint:fix": "eslint --config .eslintrc.json . --fix", + "format:check": "prettier --check \"**/*.{ts,tsx,json}\"", + "format:fix": "prettier --write \"**/*.{ts,tsx,json}\"", + "prepare": "husky" + }, + "files": [ + "CHANGELOG.md", + "dist" + ], + "dependencies": { + "@ajna/pagination": "1.4.19", + "@chakra-ui/icons": "2.1.1", + "@chakra-ui/react": "2.8.2", + "@emotion/react": "11.11.3", + "@emotion/styled": "11.11.0", + "@next/third-parties": "14.1.3", + "@nikolovlazar/chakra-ui-prose": "1.2.1", + "@starknet-react/chains": "0.1.7", + "@starknet-react/core": "2.8.0", + "@tanstack/query-core": "5.28.0", + "@types/mixpanel-browser": "2.49.0", + "@types/mustache": "4.2.5", + "@vercel/analytics": "1.2.2", + "@vercel/speed-insights": "^1.0.12", + "axios": "1.6.7", + "bignumber.js": "4.0.4", + "chroma.ts": "1.0.10", + "ethers": "6.11.1", + "framer-motion": "11.0.5", + "get-starknet": "3.0.1", + "get-starknet-core": "3.2.0", + "jotai": "2.6.4", + "jotai-tanstack-query": "0.8.5", + "mixpanel-browser": "2.49.0", + "mustache": "4.2.0", + "next": "14.1.0", + "react": "18", + "react-device-detect": "2.2.3", + "react-dom": "18", + "react-hot-toast": "2.4.1", + "react-mixpanel": "1.0.5", + "react-pro-sidebar": "1.1.0", + "react-responsive-carousel": "3.2.23", + "react-select": "5.8.0", + "react-share": "5.1.0", + "sharp": "0.33.4", + "starknet": "6.4.1", + "starknetkit": "1.1.9", + "swr": "2.2.5", + "wonka": "6.3.4" + }, + "devDependencies": { + "@types/node": "20", + "@types/react": "18", + "@types/react-dom": "18", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", + "autoprefixer": "10.0.1", + "conventional-changelog": "5.1.0", + "conventional-commits-parser": "5.0.0", + "embla-carousel-autoplay": "8.1.6", + "embla-carousel-react": "8.1.6", + "eslint": "8", + "eslint-config-next": "14.1.0", + "eslint-plugin-unused-imports": "3.1.0", + "husky": "^9.1.1", + "postcss": "8", + "prettier": "3.3.3", + "tailwindcss": "3.3.0", + "typescript": "5" + }, + "engines": { + "node": "20.x" + } +} diff --git a/postcss.config.js b/postcss.config.js old mode 100644 new mode 100755 diff --git a/public/banners/ognft.svg b/public/banners/ognft.svg old mode 100644 new mode 100755 diff --git a/public/banners/ognft_small.svg b/public/banners/ognft_small.svg old mode 100644 new mode 100755 diff --git a/public/banners/seed_grant.svg b/public/banners/seed_grant.svg old mode 100644 new mode 100755 diff --git a/public/banners/seed_grant_small.jpg b/public/banners/seed_grant_small.jpg old mode 100644 new mode 100755 diff --git a/public/banners/seed_grant_small.svg b/public/banners/seed_grant_small.svg old mode 100644 new mode 100755 diff --git a/public/fulllogo.png b/public/fulllogo.png old mode 100644 new mode 100755 diff --git a/public/logo.png b/public/logo.png old mode 100644 new mode 100755 diff --git a/src/abi/autoStrk.abi.json b/src/abi/autoStrk.abi.json old mode 100644 new mode 100755 diff --git a/src/abi/deltraNeutral.abi.json b/src/abi/deltraNeutral.abi.json old mode 100644 new mode 100755 diff --git a/src/abi/erc20.abi.json b/src/abi/erc20.abi.json old mode 100644 new mode 100755 diff --git a/src/abi/erc4626.abi.json b/src/abi/erc4626.abi.json old mode 100644 new mode 100755 diff --git a/src/abi/master.abi.json b/src/abi/master.abi.json old mode 100644 new mode 100755 diff --git a/src/app/api/stats/[address]/route.ts b/src/app/api/stats/[address]/route.ts old mode 100644 new mode 100755 index c2786a3..b006ff1 --- a/src/app/api/stats/[address]/route.ts +++ b/src/app/api/stats/[address]/route.ts @@ -1,40 +1,40 @@ -import { NextResponse } from 'next/server'; -import { num } from 'starknet'; -import { getStrategies } from '@/store/strategies.atoms'; - -export const revalidate = 0; - -function standariseAddress(address: string | bigint) { - return num.getHexString(num.getDecimalString(address.toString())); -} - -export async function GET(req: Request, context: any) { - const { params } = context; - const addr = params.address; - - // standardised address - let pAddr = addr; - try { - pAddr = standariseAddress(addr); - } catch (e) { - throw new Error('Invalid address'); - } - - const strategies = getStrategies(); - const values = strategies.map(async (strategy) => { - const balanceInfo = await strategy.getUserTVL(pAddr); - return { - id: strategy.id, - usdValue: balanceInfo.usdValue, - amount: balanceInfo.amount.toEtherStr(), - }; - }); - - const result = await Promise.all(values); - const sum = result.reduce((acc, item) => acc + item.usdValue, 0); - console.log({ pAddr, sum }); - return NextResponse.json({ - holdingsUSD: sum, - strategyWise: result, - }); -} +import { NextResponse } from 'next/server'; +import { num } from 'starknet'; +import { getStrategies } from '@/store/strategies.atoms'; + +export const revalidate = 0; + +function standariseAddress(address: string | bigint) { + return num.getHexString(num.getDecimalString(address.toString())); +} + +export async function GET(req: Request, context: any) { + const { params } = context; + const addr = params.address; + + // standardised address + let pAddr = addr; + try { + pAddr = standariseAddress(addr); + } catch (e) { + throw new Error('Invalid address'); + } + + const strategies = getStrategies(); + const values = strategies.map(async (strategy) => { + const balanceInfo = await strategy.getUserTVL(pAddr); + return { + id: strategy.id, + usdValue: balanceInfo.usdValue, + amount: balanceInfo.amount.toEtherStr(), + }; + }); + + const result = await Promise.all(values); + const sum = result.reduce((acc, item) => acc + item.usdValue, 0); + console.log({ pAddr, sum }); + return NextResponse.json({ + holdingsUSD: sum, + strategyWise: result, + }); +} diff --git a/src/app/api/stats/route.ts b/src/app/api/stats/route.ts old mode 100644 new mode 100755 index 65396f1..751b63c --- a/src/app/api/stats/route.ts +++ b/src/app/api/stats/route.ts @@ -1,31 +1,31 @@ -import { NextResponse } from 'next/server'; -import { getStrategies } from '@/store/strategies.atoms'; - -export const revalidate = 60; - -export async function GET(req: Request) { - const strategies = getStrategies(); - console.log('strategies', strategies.length); - const values = strategies.map(async (strategy, index) => { - let retry = 0; - while (retry < 3) { - try { - const tvlInfo = await strategy.getTVL(); - console.log('tvlInfo', index, tvlInfo); - return tvlInfo.usdValue; - } catch (e) { - console.log(e); - if (retry < 3) { - await new Promise((resolve) => setTimeout(resolve, 1000)); - retry++; - } - } - } - throw new Error('Failed to fetch data'); - }); - - const result = await Promise.all(values); - return NextResponse.json({ - tvl: result.reduce((a, b) => a + b, 0), - }); -} +import { NextResponse } from 'next/server'; +import { getStrategies } from '@/store/strategies.atoms'; + +export const revalidate = 60; + +export async function GET(req: Request) { + const strategies = getStrategies(); + console.log('strategies', strategies.length); + const values = strategies.map(async (strategy, index) => { + let retry = 0; + while (retry < 3) { + try { + const tvlInfo = await strategy.getTVL(); + console.log('tvlInfo', index, tvlInfo); + return tvlInfo.usdValue; + } catch (e) { + console.log(e); + if (retry < 3) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + retry++; + } + } + } + throw new Error('Failed to fetch data'); + }); + + const result = await Promise.all(values); + return NextResponse.json({ + tvl: result.reduce((a, b) => a + b, 0), + }); +} diff --git a/src/app/api/strategies/route.ts b/src/app/api/strategies/route.ts old mode 100644 new mode 100755 index 06c3463..73e2654 --- a/src/app/api/strategies/route.ts +++ b/src/app/api/strategies/route.ts @@ -1,17 +1,17 @@ -import { NextResponse } from 'next/server'; - -export const revalidate = 3600; // 1 hr - -export async function GET(req: Request) { - try { - return NextResponse.json({ - status: true, - }); - } catch (err) { - console.error('Error /api/strategies', err); - return NextResponse.json({ - status: false, - strategies: [], - }); - } -} +import { NextResponse } from 'next/server'; + +export const revalidate = 3600; // 1 hr + +export async function GET(req: Request) { + try { + return NextResponse.json({ + status: true, + }); + } catch (err) { + console.error('Error /api/strategies', err); + return NextResponse.json({ + status: false, + strategies: [], + }); + } +} diff --git a/src/app/claims/components/ClaimInfoCard.tsx b/src/app/claims/components/ClaimInfoCard.tsx old mode 100644 new mode 100755 diff --git a/src/app/claims/layout.tsx b/src/app/claims/layout.tsx old mode 100644 new mode 100755 diff --git a/src/app/claims/page.tsx b/src/app/claims/page.tsx old mode 100644 new mode 100755 diff --git a/src/app/favicon.ico b/src/app/favicon.ico old mode 100644 new mode 100755 diff --git a/src/app/globals.css b/src/app/globals.css old mode 100644 new mode 100755 diff --git a/src/app/layout.tsx b/src/app/layout.tsx old mode 100644 new mode 100755 index 6b9a104..165532d --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,45 +1,45 @@ -import { GoogleAnalytics } from '@next/third-parties/google'; -import { Analytics } from '@vercel/analytics/react'; -import type { Metadata } from 'next'; -import React from 'react'; - -import './globals.css'; - -export const metadata: Metadata = { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - openGraph: { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], - }, - twitter: { - creator: '@akiraonstarknet', - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - card: 'player', - images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], - }, -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - - - {children} - - - - - ); -} +import { GoogleAnalytics } from '@next/third-parties/google'; +import { Analytics } from '@vercel/analytics/react'; +import type { Metadata } from 'next'; +import React from 'react'; + +import './globals.css'; + +export const metadata: Metadata = { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + openGraph: { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], + }, + twitter: { + creator: '@akiraonstarknet', + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + card: 'player', + images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + + {children} + + + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx old mode 100644 new mode 100755 index 80c19b5..51f457d --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,235 +1,235 @@ -'use client'; - -import tg from '@/assets/tg.svg'; -import { useDotButton } from '@/components/EmblaCarouselDotButton'; -import Pools from '@/components/Pools'; -import Strategies from '@/components/Strategies'; -import CONSTANTS from '@/constants'; -import { useWindowSize } from '@/utils/useWindowSize'; - -import { - Box, - Center, - Image as ChakraImage, - Container, - Link, - Tab, - TabIndicator, - TabList, - TabPanel, - TabPanels, - Tabs, - Text, -} from '@chakra-ui/react'; -import Autoplay from 'embla-carousel-autoplay'; -import useEmblaCarousel from 'embla-carousel-react'; -import mixpanel from 'mixpanel-browser'; -import { useRouter, useSearchParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; -import { isMobile } from 'react-device-detect'; - -export default function Home() { - useEffect(() => { - mixpanel.track('Page open'); - }, []); - - const searchParams = useSearchParams(); - const [tabIndex, setTabIndex] = useState(0); - const size = useWindowSize(); - - useEffect(() => { - const tab = searchParams.get('tab'); - console.log('tab', tab); - if (tab === 'pools') { - setTabIndex(1); - } else { - setTabIndex(0); - } - }, [searchParams]); - - const router = useRouter(); - - function setRoute(value: string) { - router.push(`?tab=${value}`); - } - - function handleTabsChange(index: number) { - if (index === 1) { - setRoute('pools'); - } else { - setRoute('strategies'); - } - } - - const [emblaRef, emblaApi] = useEmblaCarousel( - { - loop: true, - }, - [Autoplay({ playOnInit: true, delay: 8000 })], - ); - - const { selectedIndex, scrollSnaps, onDotButtonClick } = - useDotButton(emblaApi); - - const banner_images = [ - { - desktop: '/banners/ognft.svg', - mobile: '/banners/ognft_small.svg', - link: 'https://x.com/strkfarm/status/1788558092109775029', - }, - { - desktop: '/banners/seed_grant.svg', - mobile: '/banners/seed_grant_small.jpg', - link: 'https://x.com/strkfarm/status/1787783906982260881', - }, - ]; - - return ( - - - - {"Starknet's"} Yield Powerhouse🚀 - - - Identify & Invest in the best $STRK rewarding pools and maximize your - rewards - - - - - - {banner_images.map((banner, index) => ( - - - 450) || size.width == 0 - ? banner.desktop - : banner.mobile - } - height={'auto'} - boxShadow={'0px 0px 2px #484848'} - width="100%" - alt="Banner" - style={{ objectFit: 'cover', borderRadius: '10px' }} - /> - - - ))} - - - - - - {scrollSnaps.map((_, index) => ( - onDotButtonClick(index)} - width="0.8rem" - height="0.8rem" - borderRadius="50%" - display="flex" - alignItems="center" - justifyContent="center" - cursor="pointer" - backgroundColor={index === selectedIndex ? '#4D59E8' : 'black'} - padding="0" - margin="0" - border="1px solid #373A5D" - textDecoration="none" - appearance="none" - /> - ))} - - - - - - { - mixpanel.track('Strategies opened'); - }} - > - Strategies✨ - - { - mixpanel.track('All pools clicked'); - }} - > - Find yields - - - - - - - - - - - - - {/*
*/} -
- - - -
-
- - Made with ❤️ on Starknet - -
-
- ); -} +'use client'; + +import tg from '@/assets/tg.svg'; +import { useDotButton } from '@/components/EmblaCarouselDotButton'; +import Pools from '@/components/Pools'; +import Strategies from '@/components/Strategies'; +import CONSTANTS from '@/constants'; +import { useWindowSize } from '@/utils/useWindowSize'; + +import { + Box, + Center, + Image as ChakraImage, + Container, + Link, + Tab, + TabIndicator, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, +} from '@chakra-ui/react'; +import Autoplay from 'embla-carousel-autoplay'; +import useEmblaCarousel from 'embla-carousel-react'; +import mixpanel from 'mixpanel-browser'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { isMobile } from 'react-device-detect'; + +export default function Home() { + useEffect(() => { + mixpanel.track('Page open'); + }, []); + + const searchParams = useSearchParams(); + const [tabIndex, setTabIndex] = useState(0); + const size = useWindowSize(); + + useEffect(() => { + const tab = searchParams.get('tab'); + console.log('tab', tab); + if (tab === 'pools') { + setTabIndex(1); + } else { + setTabIndex(0); + } + }, [searchParams]); + + const router = useRouter(); + + function setRoute(value: string) { + router.push(`?tab=${value}`); + } + + function handleTabsChange(index: number) { + if (index === 1) { + setRoute('pools'); + } else { + setRoute('strategies'); + } + } + + const [emblaRef, emblaApi] = useEmblaCarousel( + { + loop: true, + }, + [Autoplay({ playOnInit: true, delay: 8000 })], + ); + + const { selectedIndex, scrollSnaps, onDotButtonClick } = + useDotButton(emblaApi); + + const banner_images = [ + { + desktop: '/banners/ognft.svg', + mobile: '/banners/ognft_small.svg', + link: 'https://x.com/strkfarm/status/1788558092109775029', + }, + { + desktop: '/banners/seed_grant.svg', + mobile: '/banners/seed_grant_small.jpg', + link: 'https://x.com/strkfarm/status/1787783906982260881', + }, + ]; + + return ( + + + + {"Starknet's"} Yield Powerhouse🚀 + + + Identify & Invest in the best $STRK rewarding pools and maximize your + rewards + + + + + + {banner_images.map((banner, index) => ( + + + 450) || size.width == 0 + ? banner.desktop + : banner.mobile + } + height={'auto'} + boxShadow={'0px 0px 2px #484848'} + width="100%" + alt="Banner" + style={{ objectFit: 'cover', borderRadius: '10px' }} + /> + + + ))} + + + + + + {scrollSnaps.map((_, index) => ( + onDotButtonClick(index)} + width="0.8rem" + height="0.8rem" + borderRadius="50%" + display="flex" + alignItems="center" + justifyContent="center" + cursor="pointer" + backgroundColor={index === selectedIndex ? '#4D59E8' : 'black'} + padding="0" + margin="0" + border="1px solid #373A5D" + textDecoration="none" + appearance="none" + /> + ))} + + + + + + { + mixpanel.track('Strategies opened'); + }} + > + Strategies✨ + + { + mixpanel.track('All pools clicked'); + }} + > + Find yields + + + + + + + + + + + + + {/*
*/} +
+ + + +
+
+ + Made with ❤️ on Starknet + +
+
+ ); +} diff --git a/src/app/robots.txt b/src/app/robots.txt old mode 100644 new mode 100755 diff --git a/src/app/sitemap.xml b/src/app/sitemap.xml old mode 100644 new mode 100755 diff --git a/src/app/slinks/layout.tsx b/src/app/slinks/layout.tsx old mode 100644 new mode 100755 index f47aaad..44f92a2 --- a/src/app/slinks/layout.tsx +++ b/src/app/slinks/layout.tsx @@ -1,58 +1,58 @@ -import { GoogleAnalytics } from '@next/third-parties/google'; -import { Analytics } from '@vercel/analytics/react'; -import React from 'react'; - -import '../globals.css'; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - - - - - - - - - - - - - - - - {children} - - - - - ); -} +import { GoogleAnalytics } from '@next/third-parties/google'; +import { Analytics } from '@vercel/analytics/react'; +import React from 'react'; + +import '../globals.css'; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + + + + + + + + + + + + + + + {children} + + + + + ); +} diff --git a/src/app/slinks/page.tsx b/src/app/slinks/page.tsx old mode 100644 new mode 100755 index c4267f7..70663ec --- a/src/app/slinks/page.tsx +++ b/src/app/slinks/page.tsx @@ -1,139 +1,139 @@ -'use client'; -import TxButton from '@/components/TxButton'; -import { addressAtom } from '@/store/claims.atoms'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { StrategyTxProps } from '@/store/transactions.atom'; -import MyNumber from '@/utils/MyNumber'; -import { - Avatar, - Box, - Button, - Card, - Link, - Container, - Flex, - Input, - Text, - Center, -} from '@chakra-ui/react'; -import { useProvider } from '@starknet-react/core'; -import { useAtomValue } from 'jotai'; -import { Metadata } from 'next'; -import { useMemo, useState } from 'react'; - -const metadata: Metadata = { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', -}; - -function GetCardSimple(strat: StrategyInfo) { - const [amount, setAmount] = useState(MyNumber.fromZero()); - const address = useAtomValue(addressAtom); - const { provider } = useProvider(); - const depositMethods = strat.depositMethods(amount, address || '', provider); - - const balData = useAtomValue(depositMethods[0].balanceAtom); - - const balance = useMemo(() => { - return balData.data?.amount || MyNumber.fromZero(); - }, [balData]); - - const txInfo: StrategyTxProps = useMemo(() => { - return { - strategyId: strat.id, - actionType: 'deposit', - amount, - tokenAddr: depositMethods[0].tokenInfo.token, - }; - }, [amount, balData]); - - const maxAmount: MyNumber = useMemo(() => { - return balance; - }, [balance]); - - return ( - - - - - {strat.name}{' '} - - {(strat.netYield * 100).toFixed(2)}% APY - - - - Bal: {balance.toEtherToFixedDecimals(2)}{' '} - {depositMethods[0].tokenInfo.name} - - - - { - const value = event.target.value; - if (value && Number(value) > 0) - setAmount( - MyNumber.fromEther(value, depositMethods[0].tokenInfo.decimals), - ); - else { - setAmount( - new MyNumber('0', depositMethods[0].tokenInfo.decimals), - ); - } - }} - width={'40%'} - /> - - - - - - ); -} - -export default function Slinks() { - const strategies = useAtomValue(strategiesAtom); - return ( - - Choose a strategy and invest - {strategies - .filter((s) => s.isLive()) - .map((strat) => GetCardSimple(strat))} - - -
- -
- -
- ); -} +'use client'; +import TxButton from '@/components/TxButton'; +import { addressAtom } from '@/store/claims.atoms'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { StrategyTxProps } from '@/store/transactions.atom'; +import MyNumber from '@/utils/MyNumber'; +import { + Avatar, + Box, + Button, + Card, + Link, + Container, + Flex, + Input, + Text, + Center, +} from '@chakra-ui/react'; +import { useProvider } from '@starknet-react/core'; +import { useAtomValue } from 'jotai'; +import { Metadata } from 'next'; +import { useMemo, useState } from 'react'; + +const metadata: Metadata = { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', +}; + +function GetCardSimple(strat: StrategyInfo) { + const [amount, setAmount] = useState(MyNumber.fromZero()); + const address = useAtomValue(addressAtom); + const { provider } = useProvider(); + const depositMethods = strat.depositMethods(amount, address || '', provider); + + const balData = useAtomValue(depositMethods[0].balanceAtom); + + const balance = useMemo(() => { + return balData.data?.amount || MyNumber.fromZero(); + }, [balData]); + + const txInfo: StrategyTxProps = useMemo(() => { + return { + strategyId: strat.id, + actionType: 'deposit', + amount, + tokenAddr: depositMethods[0].tokenInfo.token, + }; + }, [amount, balData]); + + const maxAmount: MyNumber = useMemo(() => { + return balance; + }, [balance]); + + return ( + + + + + {strat.name}{' '} + + {(strat.netYield * 100).toFixed(2)}% APY + + + + Bal: {balance.toEtherToFixedDecimals(2)}{' '} + {depositMethods[0].tokenInfo.name} + + + + { + const value = event.target.value; + if (value && Number(value) > 0) + setAmount( + MyNumber.fromEther(value, depositMethods[0].tokenInfo.decimals), + ); + else { + setAmount( + new MyNumber('0', depositMethods[0].tokenInfo.decimals), + ); + } + }} + width={'40%'} + /> + + + + + + ); +} + +export default function Slinks() { + const strategies = useAtomValue(strategiesAtom); + return ( + + Choose a strategy and invest + {strategies + .filter((s) => s.isLive()) + .map((strat) => GetCardSimple(strat))} + + +
+ +
+ +
+ ); +} diff --git a/src/app/slinks/template.tsx b/src/app/slinks/template.tsx old mode 100644 new mode 100755 index 6fa8e5b..3cb7fef --- a/src/app/slinks/template.tsx +++ b/src/app/slinks/template.tsx @@ -1,124 +1,124 @@ -'use client'; - -import { - Center, - ChakraBaseProvider, - Container, - Flex, - extendTheme, -} from '@chakra-ui/react'; -import { mainnet } from '@starknet-react/chains'; -import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; -import { Provider as JotaiProvider } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import Image from 'next/image'; -import * as React from 'react'; -import { RpcProviderOptions, constants } from 'starknet'; -import { ArgentMobileConnector } from 'starknetkit/argentMobile'; -import { InjectedConnector } from 'starknetkit/injected'; -import Navbar from '@/components/Navbar'; -import { Toaster } from 'react-hot-toast'; -import { usePathname } from 'next/navigation'; - -// ! make page view more dynamic -mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); - -const theme = extendTheme({ - colors: { - transparent: 'rgba(0, 0, 0, 0)', - opacity_50p: 'rgba(0, 0, 0, 0.5)', - color1: 'rgba(86, 118, 254, 1)', - color1_65p: 'rgba(86, 118, 254, 0.65)', - color1_50p: 'rgba(86, 118, 254, 0.5)', - color1_35p: 'rgba(86, 118, 254, 0.35)', - color1_light: '#bcc9ff80', - color2: 'rgb(127 73 229)', - color2Text: 'rgb(165 118 255)', - color2_65p: 'rgba(104, 51, 205, 0.65)', - color2_50p: 'rgba(104, 51, 205, 0.5)', - highlight: '#272932', // light grey - light_grey: '#9d9d9d', - disabled_text: '#818181', - disabled_bg: '#5f5f5f', - purple: '#6F4FF2', - cyan: '#22F3DF', - bg: '#1A1C26', // dark blue - }, - fontSizes: { - large: '50px', - }, - space: { - large: '50px', - }, - sizes: { - prose: '100%', - }, - components: { - MenuItem: { - bg: 'highlight', - }, - }, - fonts: { - heading: `'Courier New', Courier, monospace`, - body: `'Courier New', Courier, monospace`, - }, -}); - -// @ts-ignore -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; -export const MYCONNECTORS = [ - new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), - new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), - new ArgentMobileConnector(), - // new WebWalletConnector({ url: 'https://web.argent.xyz' }), -]; - -export default function Template({ children }: { children: React.ReactNode }) { - const chains = [mainnet]; - const provider = jsonRpcProvider({ - rpc: (chain) => { - const args: RpcProviderOptions = { - nodeUrl: - 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', - chainId: constants.StarknetChainId.SN_MAIN, - }; - return args; - }, - }); - const pathname = usePathname(); - - function getIconNode(icon: typeof import('*.svg'), alt: string) { - return ( -
- {alt} -
- ); - } - - return ( - - - - - - - {children} - - - - - - - ); -} +'use client'; + +import { + Center, + ChakraBaseProvider, + Container, + Flex, + extendTheme, +} from '@chakra-ui/react'; +import { mainnet } from '@starknet-react/chains'; +import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; +import { Provider as JotaiProvider } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import Image from 'next/image'; +import * as React from 'react'; +import { RpcProviderOptions, constants } from 'starknet'; +import { ArgentMobileConnector } from 'starknetkit/argentMobile'; +import { InjectedConnector } from 'starknetkit/injected'; +import Navbar from '@/components/Navbar'; +import { Toaster } from 'react-hot-toast'; +import { usePathname } from 'next/navigation'; + +// ! make page view more dynamic +mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); + +const theme = extendTheme({ + colors: { + transparent: 'rgba(0, 0, 0, 0)', + opacity_50p: 'rgba(0, 0, 0, 0.5)', + color1: 'rgba(86, 118, 254, 1)', + color1_65p: 'rgba(86, 118, 254, 0.65)', + color1_50p: 'rgba(86, 118, 254, 0.5)', + color1_35p: 'rgba(86, 118, 254, 0.35)', + color1_light: '#bcc9ff80', + color2: 'rgb(127 73 229)', + color2Text: 'rgb(165 118 255)', + color2_65p: 'rgba(104, 51, 205, 0.65)', + color2_50p: 'rgba(104, 51, 205, 0.5)', + highlight: '#272932', // light grey + light_grey: '#9d9d9d', + disabled_text: '#818181', + disabled_bg: '#5f5f5f', + purple: '#6F4FF2', + cyan: '#22F3DF', + bg: '#1A1C26', // dark blue + }, + fontSizes: { + large: '50px', + }, + space: { + large: '50px', + }, + sizes: { + prose: '100%', + }, + components: { + MenuItem: { + bg: 'highlight', + }, + }, + fonts: { + heading: `'Courier New', Courier, monospace`, + body: `'Courier New', Courier, monospace`, + }, +}); + +// @ts-ignore +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; +export const MYCONNECTORS = [ + new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), + new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), + new ArgentMobileConnector(), + // new WebWalletConnector({ url: 'https://web.argent.xyz' }), +]; + +export default function Template({ children }: { children: React.ReactNode }) { + const chains = [mainnet]; + const provider = jsonRpcProvider({ + rpc: (chain) => { + const args: RpcProviderOptions = { + nodeUrl: + 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', + chainId: constants.StarknetChainId.SN_MAIN, + }; + return args; + }, + }); + const pathname = usePathname(); + + function getIconNode(icon: typeof import('*.svg'), alt: string) { + return ( +
+ {alt} +
+ ); + } + + return ( + + + + + + + {children} + + + + + + + ); +} diff --git a/src/app/strategy/components/Strategy.tsx b/src/app/strategy/components/Strategy.tsx old mode 100644 new mode 100755 index 25de8d5..36188aa --- a/src/app/strategy/components/Strategy.tsx +++ b/src/app/strategy/components/Strategy.tsx @@ -1,450 +1,450 @@ -'use client'; - -import { - Avatar, - Box, - Card, - Center, - Flex, - Grid, - GridItem, - Link, - ListItem, - OrderedList, - Spinner, - Stat, - StatHelpText, - StatLabel, - StatNumber, - Tab, - TabIndicator, - TabList, - TabPanel, - TabPanels, - Tabs, - Text, - VStack, - Wrap, - WrapItem, -} from '@chakra-ui/react'; -import { useAccount } from '@starknet-react/core'; -import { atom, useAtomValue, useSetAtom } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import { useSearchParams } from 'next/navigation'; -import { useEffect, useMemo } from 'react'; -import { isMobile } from 'react-device-detect'; - -import Deposit from '@/components/Deposit'; -import CONSTANTS from '@/constants'; -import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { - StrategyTxPropsToMessageWithStrategies, - transactionsAtom, -} from '@/store/transactions.atom'; -import { getUniqueById, shortAddress } from '@/utils'; - -const Strategy = () => { - const { address } = useAccount(); - const searchParams = useSearchParams(); - const strategies = useAtomValue(strategiesAtom); - const transactions = useAtomValue(transactionsAtom); - - useEffect(() => { - console.log('txs', transactions); - }, [transactions]); - const strategy: StrategyInfo | undefined = useMemo(() => { - const id = searchParams.get('id'); - console.log('id', id); - return strategies.find((s) => s.id === id); - }, [searchParams, strategies]); - - const setBalQueryEnable = useSetAtom(strategy?.balEnabled || atom(false)); - useEffect(() => { - setBalQueryEnable(true); - }, []); - - // const balAtom = getBalanceAtom(strategy?.holdingTokens[0]); - const balData = useAtomValue(strategy?.balanceAtom || DUMMY_BAL_ATOM); - // cons{ balance, underlyingTokenInfo, isLoading, isError } - useEffect(() => { - console.log( - 'balData', - balData.isError, - balData.isLoading, - balData.isPending, - balData.data, - balData.error, - ); - }, [balData]); - - useEffect(() => { - mixpanel.track('Strategy page open', { name: searchParams.get('name') }); - }, [searchParams]); - - const colSpan1: any = { base: '5', md: '3' }; - const colSpan2: any = { base: '5', md: '2' }; - return ( - <> - - - - {strategy ? strategy.name : 'Strategy Not found'} - - - {strategy && ( - - - - - - - - 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} -
-
- ))} -
-
- - - - APY - - - {(strategy.netYield * 100).toFixed(2)}% - - - {strategy.leverage.toFixed(2)}x boosted - - - -
- - {!balData.isLoading && - !balData.isError && - !balData.isPending && - balData.data && - balData.data.tokenInfo && ( - - Your Holdings: - {address - ? `${balData.data.amount.toEtherToFixedDecimals(4)} ${balData.data.tokenInfo?.name}` - : isMobile - ? CONSTANTS.MOBILE_MSG - : 'Connect wallet'} - - )} - {(balData.isLoading || - balData.isPending || - !balData.data?.tokenInfo) && ( - - Your Holdings: - {address ? ( - - ) : isMobile ? ( - CONSTANTS.MOBILE_MSG - ) : ( - 'Connect wallet' - )} - - )} - {balData.isError && ( - - Your Holdings: Error - - )} - -
-
- - - - - { - // mixpanel.track('All pools clicked') - }} - > - Deposit - - { - // mixpanel.track('Strategies opened') - }} - > - Withdraw - - - - - - - - - - - - - - -
- - - Behind the scenes - - - Actions done automatically by the strategy (smart-contract) with - an investment of $1000 - - - - Action - - - Protocol - - - Amount - - - Yield - - - {strategy.actions.map((action, index) => ( - - - {index + 1} - {')'} {action.name} - - - {' '} - {action.pool.pool.name} on - {' '} - {action.pool.protocol.name} - - - ${Number(action.amount).toLocaleString()} yields{' '} - {action.isDeposit - ? (action.pool.apr * 100).toFixed(2) - : -(action.pool.borrow.apr * 100).toFixed(2)} - % - - - ${Number(action.amount).toLocaleString()} - - - {action.isDeposit - ? (action.pool.apr * 100).toFixed(2) - : -(action.pool.borrow.apr * 100).toFixed(2)} - % - - - ))} - - - {/* Risks card */} - - - Risks - - - {strategy.risks.map((r) => ( - - {r} - - ))} - - - - {/* Transaction history card */} - - - Transaction history - - - {/* If more than 1 filtered tx */} - {transactions.filter((tx) => tx.info.strategyId == strategy.id) - .length > 0 && ( - <> - - Note: This feature saves and shows transactions made on this - device since it was added. Clearing your browser cache will - remove this data. - - - {transactions - .filter((tx) => tx.info.strategyId == strategy.id) - .map((tx, index) => { - return ( - - - {/* The default msg contains strategy name, since this for a specific strategy, replace it */} - {index + 1}){' '} - {StrategyTxPropsToMessageWithStrategies( - tx.info, - strategies, - ).replace(` in ${strategy.name}`, '')} - - - {/* The default msg contains strategy name, since this for a specific strategy, replace it */} - Transacted on {tx.createdAt.toLocaleDateString()} [ - - {shortAddress(tx.txHash)} - - ] - - - ); - })} - - )} - - {/* If no filtered tx */} - {transactions.filter((tx) => tx.info.strategyId == strategy.id) - .length == 0 && ( - - No transactions recorded since this feature was added. We use - your {"browser's"} storage to save your transaction history. - Make a deposit or withdrawal to see your transactions here. - Clearning browser cache will remove this data. - - )} - -
- )} - - ); -}; - -export default Strategy; +'use client'; + +import { + Avatar, + Box, + Card, + Center, + Flex, + Grid, + GridItem, + Link, + ListItem, + OrderedList, + Spinner, + Stat, + StatHelpText, + StatLabel, + StatNumber, + Tab, + TabIndicator, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, + VStack, + Wrap, + WrapItem, +} from '@chakra-ui/react'; +import { useAccount } from '@starknet-react/core'; +import { atom, useAtomValue, useSetAtom } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import { useSearchParams } from 'next/navigation'; +import { useEffect, useMemo } from 'react'; +import { isMobile } from 'react-device-detect'; + +import Deposit from '@/components/Deposit'; +import CONSTANTS from '@/constants'; +import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { + StrategyTxPropsToMessageWithStrategies, + transactionsAtom, +} from '@/store/transactions.atom'; +import { getUniqueById, shortAddress } from '@/utils'; + +const Strategy = () => { + const { address } = useAccount(); + const searchParams = useSearchParams(); + const strategies = useAtomValue(strategiesAtom); + const transactions = useAtomValue(transactionsAtom); + + useEffect(() => { + console.log('txs', transactions); + }, [transactions]); + const strategy: StrategyInfo | undefined = useMemo(() => { + const id = searchParams.get('id'); + console.log('id', id); + return strategies.find((s) => s.id === id); + }, [searchParams, strategies]); + + const setBalQueryEnable = useSetAtom(strategy?.balEnabled || atom(false)); + useEffect(() => { + setBalQueryEnable(true); + }, []); + + // const balAtom = getBalanceAtom(strategy?.holdingTokens[0]); + const balData = useAtomValue(strategy?.balanceAtom || DUMMY_BAL_ATOM); + // cons{ balance, underlyingTokenInfo, isLoading, isError } + useEffect(() => { + console.log( + 'balData', + balData.isError, + balData.isLoading, + balData.isPending, + balData.data, + balData.error, + ); + }, [balData]); + + useEffect(() => { + mixpanel.track('Strategy page open', { name: searchParams.get('name') }); + }, [searchParams]); + + const colSpan1: any = { base: '5', md: '3' }; + const colSpan2: any = { base: '5', md: '2' }; + return ( + <> + + + + {strategy ? strategy.name : 'Strategy Not found'} + + + {strategy && ( + + + + + + + + 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} +
+
+ ))} +
+
+ + + + APY + + + {(strategy.netYield * 100).toFixed(2)}% + + + {strategy.leverage.toFixed(2)}x boosted + + + +
+ + {!balData.isLoading && + !balData.isError && + !balData.isPending && + balData.data && + balData.data.tokenInfo && ( + + Your Holdings: + {address + ? `${balData.data.amount.toEtherToFixedDecimals(4)} ${balData.data.tokenInfo?.name}` + : isMobile + ? CONSTANTS.MOBILE_MSG + : 'Connect wallet'} + + )} + {(balData.isLoading || + balData.isPending || + !balData.data?.tokenInfo) && ( + + Your Holdings: + {address ? ( + + ) : isMobile ? ( + CONSTANTS.MOBILE_MSG + ) : ( + 'Connect wallet' + )} + + )} + {balData.isError && ( + + Your Holdings: Error + + )} + +
+
+ + + + + { + // mixpanel.track('All pools clicked') + }} + > + Deposit + + { + // mixpanel.track('Strategies opened') + }} + > + Withdraw + + + + + + + + + + + + + + +
+ + + Behind the scenes + + + Actions done automatically by the strategy (smart-contract) with + an investment of $1000 + + + + Action + + + Protocol + + + Amount + + + Yield + + + {strategy.actions.map((action, index) => ( + + + {index + 1} + {')'} {action.name} + + + {' '} + {action.pool.pool.name} on + {' '} + {action.pool.protocol.name} + + + ${Number(action.amount).toLocaleString()} yields{' '} + {action.isDeposit + ? (action.pool.apr * 100).toFixed(2) + : -(action.pool.borrow.apr * 100).toFixed(2)} + % + + + ${Number(action.amount).toLocaleString()} + + + {action.isDeposit + ? (action.pool.apr * 100).toFixed(2) + : -(action.pool.borrow.apr * 100).toFixed(2)} + % + + + ))} + + + {/* Risks card */} + + + Risks + + + {strategy.risks.map((r) => ( + + {r} + + ))} + + + + {/* Transaction history card */} + + + Transaction history + + + {/* If more than 1 filtered tx */} + {transactions.filter((tx) => tx.info.strategyId == strategy.id) + .length > 0 && ( + <> + + Note: This feature saves and shows transactions made on this + device since it was added. Clearing your browser cache will + remove this data. + + + {transactions + .filter((tx) => tx.info.strategyId == strategy.id) + .map((tx, index) => { + return ( + + + {/* The default msg contains strategy name, since this for a specific strategy, replace it */} + {index + 1}){' '} + {StrategyTxPropsToMessageWithStrategies( + tx.info, + strategies, + ).replace(` in ${strategy.name}`, '')} + + + {/* The default msg contains strategy name, since this for a specific strategy, replace it */} + Transacted on {tx.createdAt.toLocaleDateString()} [ + + {shortAddress(tx.txHash)} + + ] + + + ); + })} + + )} + + {/* If no filtered tx */} + {transactions.filter((tx) => tx.info.strategyId == strategy.id) + .length == 0 && ( + + No transactions recorded since this feature was added. We use + your {"browser's"} storage to save your transaction history. + Make a deposit or withdrawal to see your transactions here. + Clearning browser cache will remove this data. + + )} + +
+ )} + + ); +}; + +export default Strategy; diff --git a/src/app/strategy/layout.tsx b/src/app/strategy/layout.tsx old mode 100644 new mode 100755 diff --git a/src/app/strategy/page.tsx b/src/app/strategy/page.tsx old mode 100644 new mode 100755 index 6d09a27..c2edd54 --- a/src/app/strategy/page.tsx +++ b/src/app/strategy/page.tsx @@ -1,39 +1,39 @@ -import { Container } from '@chakra-ui/react'; - -import Strategy from './components/Strategy'; -import { getStrategies } from '@/store/strategies.atoms'; - -type Props = { - params: { name: string }; - searchParams?: { [key: string]: string | string[] | undefined }; -}; - -export async function generateMetadata({ searchParams }: Props) { - const strategies = getStrategies(); - const strategy = strategies.find((s) => s.id === searchParams?.id); - if (strategy) { - return { - title: `${strategy.name} | STRKFarm`, - description: strategy.description, - }; - } - - return { - title: 'Yield Strategy | STRKFarm', - 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.", - }; -} - -export default function StrategyPage() { - return ( - - - - ); -} +import { Container } from '@chakra-ui/react'; + +import Strategy from './components/Strategy'; +import { getStrategies } from '@/store/strategies.atoms'; + +type Props = { + params: { name: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}; + +export async function generateMetadata({ searchParams }: Props) { + const strategies = getStrategies(); + const strategy = strategies.find((s) => s.id === searchParams?.id); + if (strategy) { + return { + title: `${strategy.name} | STRKFarm`, + description: strategy.description, + }; + } + + return { + title: 'Yield Strategy | STRKFarm', + 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.", + }; +} + +export default function StrategyPage() { + return ( + + + + ); +} diff --git a/src/app/template.tsx b/src/app/template.tsx old mode 100644 new mode 100755 index 6fa8e5b..3cb7fef --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -1,124 +1,124 @@ -'use client'; - -import { - Center, - ChakraBaseProvider, - Container, - Flex, - extendTheme, -} from '@chakra-ui/react'; -import { mainnet } from '@starknet-react/chains'; -import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; -import { Provider as JotaiProvider } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import Image from 'next/image'; -import * as React from 'react'; -import { RpcProviderOptions, constants } from 'starknet'; -import { ArgentMobileConnector } from 'starknetkit/argentMobile'; -import { InjectedConnector } from 'starknetkit/injected'; -import Navbar from '@/components/Navbar'; -import { Toaster } from 'react-hot-toast'; -import { usePathname } from 'next/navigation'; - -// ! make page view more dynamic -mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); - -const theme = extendTheme({ - colors: { - transparent: 'rgba(0, 0, 0, 0)', - opacity_50p: 'rgba(0, 0, 0, 0.5)', - color1: 'rgba(86, 118, 254, 1)', - color1_65p: 'rgba(86, 118, 254, 0.65)', - color1_50p: 'rgba(86, 118, 254, 0.5)', - color1_35p: 'rgba(86, 118, 254, 0.35)', - color1_light: '#bcc9ff80', - color2: 'rgb(127 73 229)', - color2Text: 'rgb(165 118 255)', - color2_65p: 'rgba(104, 51, 205, 0.65)', - color2_50p: 'rgba(104, 51, 205, 0.5)', - highlight: '#272932', // light grey - light_grey: '#9d9d9d', - disabled_text: '#818181', - disabled_bg: '#5f5f5f', - purple: '#6F4FF2', - cyan: '#22F3DF', - bg: '#1A1C26', // dark blue - }, - fontSizes: { - large: '50px', - }, - space: { - large: '50px', - }, - sizes: { - prose: '100%', - }, - components: { - MenuItem: { - bg: 'highlight', - }, - }, - fonts: { - heading: `'Courier New', Courier, monospace`, - body: `'Courier New', Courier, monospace`, - }, -}); - -// @ts-ignore -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; -export const MYCONNECTORS = [ - new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), - new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), - new ArgentMobileConnector(), - // new WebWalletConnector({ url: 'https://web.argent.xyz' }), -]; - -export default function Template({ children }: { children: React.ReactNode }) { - const chains = [mainnet]; - const provider = jsonRpcProvider({ - rpc: (chain) => { - const args: RpcProviderOptions = { - nodeUrl: - 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', - chainId: constants.StarknetChainId.SN_MAIN, - }; - return args; - }, - }); - const pathname = usePathname(); - - function getIconNode(icon: typeof import('*.svg'), alt: string) { - return ( -
- {alt} -
- ); - } - - return ( - - - - - - - {children} - - - - - - - ); -} +'use client'; + +import { + Center, + ChakraBaseProvider, + Container, + Flex, + extendTheme, +} from '@chakra-ui/react'; +import { mainnet } from '@starknet-react/chains'; +import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; +import { Provider as JotaiProvider } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import Image from 'next/image'; +import * as React from 'react'; +import { RpcProviderOptions, constants } from 'starknet'; +import { ArgentMobileConnector } from 'starknetkit/argentMobile'; +import { InjectedConnector } from 'starknetkit/injected'; +import Navbar from '@/components/Navbar'; +import { Toaster } from 'react-hot-toast'; +import { usePathname } from 'next/navigation'; + +// ! make page view more dynamic +mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); + +const theme = extendTheme({ + colors: { + transparent: 'rgba(0, 0, 0, 0)', + opacity_50p: 'rgba(0, 0, 0, 0.5)', + color1: 'rgba(86, 118, 254, 1)', + color1_65p: 'rgba(86, 118, 254, 0.65)', + color1_50p: 'rgba(86, 118, 254, 0.5)', + color1_35p: 'rgba(86, 118, 254, 0.35)', + color1_light: '#bcc9ff80', + color2: 'rgb(127 73 229)', + color2Text: 'rgb(165 118 255)', + color2_65p: 'rgba(104, 51, 205, 0.65)', + color2_50p: 'rgba(104, 51, 205, 0.5)', + highlight: '#272932', // light grey + light_grey: '#9d9d9d', + disabled_text: '#818181', + disabled_bg: '#5f5f5f', + purple: '#6F4FF2', + cyan: '#22F3DF', + bg: '#1A1C26', // dark blue + }, + fontSizes: { + large: '50px', + }, + space: { + large: '50px', + }, + sizes: { + prose: '100%', + }, + components: { + MenuItem: { + bg: 'highlight', + }, + }, + fonts: { + heading: `'Courier New', Courier, monospace`, + body: `'Courier New', Courier, monospace`, + }, +}); + +// @ts-ignore +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; +export const MYCONNECTORS = [ + new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), + new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), + new ArgentMobileConnector(), + // new WebWalletConnector({ url: 'https://web.argent.xyz' }), +]; + +export default function Template({ children }: { children: React.ReactNode }) { + const chains = [mainnet]; + const provider = jsonRpcProvider({ + rpc: (chain) => { + const args: RpcProviderOptions = { + nodeUrl: + 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', + chainId: constants.StarknetChainId.SN_MAIN, + }; + return args; + }, + }); + const pathname = usePathname(); + + function getIconNode(icon: typeof import('*.svg'), alt: string) { + return ( +
+ {alt} +
+ ); + } + + return ( + + + + + + + {children} + + + + + + + ); +} diff --git a/src/assets/tg.svg b/src/assets/tg.svg old mode 100644 new mode 100755 diff --git a/src/components/Deposit.tsx b/src/components/Deposit.tsx old mode 100644 new mode 100755 index bb3297b..be11dbf --- a/src/components/Deposit.tsx +++ b/src/components/Deposit.tsx @@ -1,349 +1,349 @@ -import { ChevronDownIcon } from '@chakra-ui/icons'; -import { - Box, - Button, - Center, - Flex, - Grid, - GridItem, - Image as ImageC, - Menu, - MenuButton, - MenuItem, - MenuList, - NumberDecrementStepper, - NumberIncrementStepper, - NumberInput, - NumberInputField, - NumberInputStepper, - Progress, - Spinner, - Text, - Tooltip, -} from '@chakra-ui/react'; -import LoadingWrap from './LoadingWrap'; -import { IStrategyActionHook, TokenInfo } from '@/strategies/IStrategy'; -import { StrategyInfo } from '@/store/strategies.atoms'; -import { useMemo, useState } from 'react'; -import MyNumber from '@/utils/MyNumber'; -import TxButton from './TxButton'; -import { MyMenuItemProps, MyMenuListProps } from '@/utils'; -import { useAccount, useProvider } from '@starknet-react/core'; -import { ProviderInterface } from 'starknet'; -import mixpanel from 'mixpanel-browser'; -import { StrategyTxProps } from '@/store/transactions.atom'; -import { useAtomValue } from 'jotai'; -import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; - -interface DepositProps { - strategy: StrategyInfo; - // ? If you want to add more button text, you can add here - // ? @dev ensure below actionType is updated accordingly - buttonText: 'Deposit' | 'Redeem'; - callsInfo: ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => IStrategyActionHook[]; -} - -export default function Deposit(props: DepositProps) { - const { address } = useAccount(); - const { provider } = useProvider(); - const [dirty, setDirty] = useState(false); - - const tvlInfo = useAtomValue(props.strategy.tvlAtom); - - // This is the selected market token - const [selectedMarket, setSelectedMarket] = useState( - props.callsInfo(MyNumber.fromZero(), address || '0x0', provider)[0] - .tokenInfo, - ); - - // This is processed amount stored in MyNumber format and meant for sending tx - const [amount, setAmount] = useState( - MyNumber.fromEther('0', selectedMarket.decimals), - ); - - // This is used to store the raw amount entered by the user - const [rawAmount, setRawAmount] = useState(''); - - // use to maintain tx history and show toasts - const txInfo: StrategyTxProps = useMemo(() => { - return { - strategyId: props.strategy.id, - actionType: props.buttonText == 'Deposit' ? 'deposit' : 'withdraw', - amount, - tokenAddr: selectedMarket.token, - }; - }, [amount, props]); - - // constructs tx calls - const { calls, actions } = useMemo(() => { - const actions = props.callsInfo(amount, address || '0x0', provider); - const hook = actions.find((a) => a.tokenInfo.name === selectedMarket.name); - if (!hook) return { calls: [], actions }; - return { calls: hook.calls, actions }; - }, [selectedMarket, amount, address, provider]); - - const balData = useAtomValue( - actions.find((a) => a.tokenInfo.name === selectedMarket.name) - ?.balanceAtom || DUMMY_BAL_ATOM, - ); - const balance = useMemo(() => { - return balData.data?.amount || MyNumber.fromZero(); - }, [balData]); - // const { balance, isLoading, isError } = useERC20Balance(selectedMarket); - const maxAmount: MyNumber = useMemo(() => { - const currentTVl = tvlInfo.data?.amount || MyNumber.fromZero(); - const maxAllowed = - props.strategy.settings.maxTVL - Number(currentTVl.toEtherStr()); - const adjustedMaxAllowed = MyNumber.fromEther( - maxAllowed.toFixed(6), - selectedMarket.decimals, - ); - let reducedBalance = balance; - - if (selectedMarket.name === 'STRK') { - reducedBalance = balance.subtract( - MyNumber.fromEther('1.5', selectedMarket.decimals), - ); - } else if (selectedMarket.name === 'ETH') { - reducedBalance = balance.subtract( - MyNumber.fromEther('0.001', selectedMarket.decimals), - ); - } - console.log('Deposit:: reducedBalance2', reducedBalance.toEtherStr()); - const min = MyNumber.min(reducedBalance, adjustedMaxAllowed); - return MyNumber.max(min, MyNumber.fromEther('0', selectedMarket.decimals)); - }, [balance, props.strategy, selectedMarket]); - - function BalanceComponent(props: { - token: TokenInfo; - strategy: StrategyInfo; - buttonText: string; - }) { - return ( - - Available balance - - - - {balance.toEtherToFixedDecimals(4)} - - - - - - ); - } - - return ( - - - - - } - bgColor={'highlight'} - borderColor={'bg'} - borderWidth={'1px'} - color="color2Text" - _hover={{ - bg: 'bg', - }} - > -
- {/* */} - {balData.data && balData.data.tokenInfo - ? balData.data.tokenInfo.name - : '-'} -
-
- - {actions.map((dep) => ( - { - if (selectedMarket.name != dep.tokenInfo.name) { - setSelectedMarket(dep.tokenInfo); - setAmount(new MyNumber('0', dep.tokenInfo.decimals)); - setDirty(false); - setRawAmount(''); - } - }} - > -
- {' '} - {dep.tokenInfo.name} -
-
- ))} -
-
-
- - - -
- - {/* add min max validations and show err */} - { - if (value && Number(value) > 0) - setAmount(MyNumber.fromEther(value, selectedMarket.decimals)); - else { - setAmount(new MyNumber('0', selectedMarket.decimals)); - } - setRawAmount(value); - setDirty(true); - mixpanel.track('Enter amount', { - strategy: props.strategy.name, - buttonText: props.buttonText, - amount: amount.toEtherStr(), - token: selectedMarket.name, - maxAmount: maxAmount.toEtherStr(), - address, - }); - }} - marginTop={'10px'} - keepWithinRange={false} - clampValueOnBlur={false} - value={rawAmount} - isDisabled={maxAmount.isZero()} - > - - - - - - - {amount.isZero() && dirty && ( - - Require amount {'>'} 0 - - )} - {amount.compare(maxAmount.toEtherStr(), 'gt') && ( - - Amount to be less than {maxAmount.toEtherToFixedDecimals(2)} - - )} - -
- -
- - - No additional fees by STRKFarm - - - - - - Current TVL Limit: - - - {!tvlInfo || !tvlInfo?.data ? ( - - ) : ( - Number(tvlInfo.data?.amount.toFixedStr(0)).toLocaleString() - )} - {' / '} - {props.strategy.settings.maxTVL.toLocaleString()}{' '} - {selectedMarket.name} - - - - {/* {tvlInfo.isError ? 1 : 0}{tvlInfo.isLoading ? 1 : 0} {JSON.stringify(tvlInfo.error)} */} - -
- ); -} +import { ChevronDownIcon } from '@chakra-ui/icons'; +import { + Box, + Button, + Center, + Flex, + Grid, + GridItem, + Image as ImageC, + Menu, + MenuButton, + MenuItem, + MenuList, + NumberDecrementStepper, + NumberIncrementStepper, + NumberInput, + NumberInputField, + NumberInputStepper, + Progress, + Spinner, + Text, + Tooltip, +} from '@chakra-ui/react'; +import LoadingWrap from './LoadingWrap'; +import { IStrategyActionHook, TokenInfo } from '@/strategies/IStrategy'; +import { StrategyInfo } from '@/store/strategies.atoms'; +import { useMemo, useState } from 'react'; +import MyNumber from '@/utils/MyNumber'; +import TxButton from './TxButton'; +import { MyMenuItemProps, MyMenuListProps } from '@/utils'; +import { useAccount, useProvider } from '@starknet-react/core'; +import { ProviderInterface } from 'starknet'; +import mixpanel from 'mixpanel-browser'; +import { StrategyTxProps } from '@/store/transactions.atom'; +import { useAtomValue } from 'jotai'; +import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; + +interface DepositProps { + strategy: StrategyInfo; + // ? If you want to add more button text, you can add here + // ? @dev ensure below actionType is updated accordingly + buttonText: 'Deposit' | 'Redeem'; + callsInfo: ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => IStrategyActionHook[]; +} + +export default function Deposit(props: DepositProps) { + const { address } = useAccount(); + const { provider } = useProvider(); + const [dirty, setDirty] = useState(false); + + const tvlInfo = useAtomValue(props.strategy.tvlAtom); + + // This is the selected market token + const [selectedMarket, setSelectedMarket] = useState( + props.callsInfo(MyNumber.fromZero(), address || '0x0', provider)[0] + .tokenInfo, + ); + + // This is processed amount stored in MyNumber format and meant for sending tx + const [amount, setAmount] = useState( + MyNumber.fromEther('0', selectedMarket.decimals), + ); + + // This is used to store the raw amount entered by the user + const [rawAmount, setRawAmount] = useState(''); + + // use to maintain tx history and show toasts + const txInfo: StrategyTxProps = useMemo(() => { + return { + strategyId: props.strategy.id, + actionType: props.buttonText == 'Deposit' ? 'deposit' : 'withdraw', + amount, + tokenAddr: selectedMarket.token, + }; + }, [amount, props]); + + // constructs tx calls + const { calls, actions } = useMemo(() => { + const actions = props.callsInfo(amount, address || '0x0', provider); + const hook = actions.find((a) => a.tokenInfo.name === selectedMarket.name); + if (!hook) return { calls: [], actions }; + return { calls: hook.calls, actions }; + }, [selectedMarket, amount, address, provider]); + + const balData = useAtomValue( + actions.find((a) => a.tokenInfo.name === selectedMarket.name) + ?.balanceAtom || DUMMY_BAL_ATOM, + ); + const balance = useMemo(() => { + return balData.data?.amount || MyNumber.fromZero(); + }, [balData]); + // const { balance, isLoading, isError } = useERC20Balance(selectedMarket); + const maxAmount: MyNumber = useMemo(() => { + const currentTVl = tvlInfo.data?.amount || MyNumber.fromZero(); + const maxAllowed = + props.strategy.settings.maxTVL - Number(currentTVl.toEtherStr()); + const adjustedMaxAllowed = MyNumber.fromEther( + maxAllowed.toFixed(6), + selectedMarket.decimals, + ); + let reducedBalance = balance; + + if (selectedMarket.name === 'STRK') { + reducedBalance = balance.subtract( + MyNumber.fromEther('1.5', selectedMarket.decimals), + ); + } else if (selectedMarket.name === 'ETH') { + reducedBalance = balance.subtract( + MyNumber.fromEther('0.001', selectedMarket.decimals), + ); + } + console.log('Deposit:: reducedBalance2', reducedBalance.toEtherStr()); + const min = MyNumber.min(reducedBalance, adjustedMaxAllowed); + return MyNumber.max(min, MyNumber.fromEther('0', selectedMarket.decimals)); + }, [balance, props.strategy, selectedMarket]); + + function BalanceComponent(props: { + token: TokenInfo; + strategy: StrategyInfo; + buttonText: string; + }) { + return ( + + Available balance + + + + {balance.toEtherToFixedDecimals(4)} + + + + + + ); + } + + return ( + + + + + } + bgColor={'highlight'} + borderColor={'bg'} + borderWidth={'1px'} + color="color2Text" + _hover={{ + bg: 'bg', + }} + > +
+ {/* */} + {balData.data && balData.data.tokenInfo + ? balData.data.tokenInfo.name + : '-'} +
+
+ + {actions.map((dep) => ( + { + if (selectedMarket.name != dep.tokenInfo.name) { + setSelectedMarket(dep.tokenInfo); + setAmount(new MyNumber('0', dep.tokenInfo.decimals)); + setDirty(false); + setRawAmount(''); + } + }} + > +
+ {' '} + {dep.tokenInfo.name} +
+
+ ))} +
+
+
+ + + +
+ + {/* add min max validations and show err */} + { + if (value && Number(value) > 0) + setAmount(MyNumber.fromEther(value, selectedMarket.decimals)); + else { + setAmount(new MyNumber('0', selectedMarket.decimals)); + } + setRawAmount(value); + setDirty(true); + mixpanel.track('Enter amount', { + strategy: props.strategy.name, + buttonText: props.buttonText, + amount: amount.toEtherStr(), + token: selectedMarket.name, + maxAmount: maxAmount.toEtherStr(), + address, + }); + }} + marginTop={'10px'} + keepWithinRange={false} + clampValueOnBlur={false} + value={rawAmount} + isDisabled={maxAmount.isZero()} + > + + + + + + + {amount.isZero() && dirty && ( + + Require amount {'>'} 0 + + )} + {amount.compare(maxAmount.toEtherStr(), 'gt') && ( + + Amount to be less than {maxAmount.toEtherToFixedDecimals(2)} + + )} + +
+ +
+ + + No additional fees by STRKFarm + + + + + + Current TVL Limit: + + + {!tvlInfo || !tvlInfo?.data ? ( + + ) : ( + Number(tvlInfo.data?.amount.toFixedStr(0)).toLocaleString() + )} + {' / '} + {props.strategy.settings.maxTVL.toLocaleString()}{' '} + {selectedMarket.name} + + + + {/* {tvlInfo.isError ? 1 : 0}{tvlInfo.isLoading ? 1 : 0} {JSON.stringify(tvlInfo.error)} */} + +
+ ); +} diff --git a/src/components/EmblaCarouselDotButton.tsx b/src/components/EmblaCarouselDotButton.tsx old mode 100644 new mode 100755 diff --git a/src/components/Filters.tsx b/src/components/Filters.tsx old mode 100644 new mode 100755 diff --git a/src/components/LoadingWrap.tsx b/src/components/LoadingWrap.tsx old mode 100644 new mode 100755 diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx old mode 100644 new mode 100755 index b9a5410..e9e54b5 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,267 +1,267 @@ -import { ChevronDownIcon } from '@chakra-ui/icons'; -import { - Avatar, - Box, - Button, - Center, - Container, - Flex, - IconButton, - Image, - Link, - Menu, - MenuButton, - MenuItem, - MenuList, - Text, -} from '@chakra-ui/react'; -import { useAtom, useSetAtom } from 'jotai'; -import { useStarknetkitConnectModal } from 'starknetkit'; - -import tg from '@/assets/tg.svg'; -import fulllogo from '@public/fulllogo.png'; -import CONSTANTS from '@/constants'; -import { addressAtom } from '@/store/claims.atoms'; -import { MyMenuItemProps, MyMenuListProps, shortAddress } from '@/utils'; -import { useEffect } from 'react'; -import { lastWalletAtom } from '@/store/utils.atoms'; -import { useAccount, useConnect, useDisconnect } from '@starknet-react/core'; -import { CONNECTOR_NAMES, MYCONNECTORS } from '@/app/template'; -import { isMobile } from 'react-device-detect'; - -interface NavbarProps { - hideTg?: boolean; - forceShowConnect?: boolean; -} - -export default function Navbar(props: NavbarProps) { - const { address, connector } = useAccount(); - const { connect, connectors } = useConnect(); - const { disconnectAsync } = useDisconnect(); - const setAddress = useSetAtom(addressAtom); - const [lastWallet, setLastWallet] = useAtom(lastWalletAtom); - const { starknetkitConnectModal: starknetkitConnectModal1 } = - useStarknetkitConnectModal({ - modalMode: 'canAsk', - modalTheme: 'dark', - connectors: MYCONNECTORS, - }); - - // backup - const { starknetkitConnectModal: starknetkitConnectModal2 } = - useStarknetkitConnectModal({ - modalMode: 'alwaysAsk', - modalTheme: 'dark', - connectors: MYCONNECTORS, - }); - - // Connect wallet using starknetkit - const connectWallet = async () => { - try { - const result = await starknetkitConnectModal1(); - await connect({ connector: result.connector }); - } catch (error) { - console.warn('connectWallet error', error); - try { - const result = await starknetkitConnectModal2(); - await connect({ connector: result.connector }); - } catch (error) { - console.error('connectWallet error', error); - alert('Error connecting wallet'); - } - } - }; - - function autoConnect(retry = 0) { - console.log('lastWallet', lastWallet, connectors); - try { - if (!address && lastWallet) { - const connectorIndex = CONNECTOR_NAMES.findIndex( - (name) => name === lastWallet, - ); - if (connectorIndex >= 0) { - connect({ connector: MYCONNECTORS[connectorIndex] }); - } - } - } catch (error) { - console.error('lastWallet error', error); - if (retry < 10) { - setTimeout(() => { - autoConnect(retry + 1); - }, 1000); - } - } - } - // Auto-connects to last wallet - useEffect(() => { - autoConnect(); - }, [lastWallet]); - - // Set last wallet when a new wallet is connected - useEffect(() => { - console.log('lastWallet connector', connector?.name); - if (connector) { - const name: string = connector.name; - setLastWallet(name); - } - }, [connector]); - - // set address atom - useEffect(() => { - setAddress(address); - }, [address]); - - return ( - -
- - {''} - Report bugs & share feedback in our Telegram group. - {''} - -
- - - - logo - - {/* - - */} - {!props.hideTg && ( - - - - } - /> - - )} - {(!isMobile || props.forceShowConnect) && ( - - : <>} - iconSpacing={{ base: '1px', sm: '5px' }} - bgColor={'purple'} - color="white" - borderColor={'purple'} - borderWidth="1px" - _hover={{ - bg: 'bg', - borderColor: 'purple', - borderWidth: '1px', - color: 'purple', - }} - _active={{ - bg: 'bg', - borderColor: 'purple', - color: 'purple', - }} - marginLeft={'10px'} - display={{ base: 'flex' }} - height={{ base: '2rem', sm: '2.5rem' }} - my={{ base: 'auto', sm: 'initial' }} - paddingX={{ base: '0.5rem', sm: '1rem' }} - fontSize={{ base: '0.8rem', sm: '1rem' }} - onClick={address ? undefined : connectWallet} - size="xs" - > -
{address ? shortAddress(address) : 'Connect'}
-
- - {address && ( - { - disconnectAsync().then((data) => { - console.log('wallet disconnected'); - setLastWallet(null); - }); - }} - > - Disconnect - - )} - -
- )} -
-
-
- ); -} +import { ChevronDownIcon } from '@chakra-ui/icons'; +import { + Avatar, + Box, + Button, + Center, + Container, + Flex, + IconButton, + Image, + Link, + Menu, + MenuButton, + MenuItem, + MenuList, + Text, +} from '@chakra-ui/react'; +import { useAtom, useSetAtom } from 'jotai'; +import { useStarknetkitConnectModal } from 'starknetkit'; + +import tg from '@/assets/tg.svg'; +import fulllogo from '@public/fulllogo.png'; +import CONSTANTS from '@/constants'; +import { addressAtom } from '@/store/claims.atoms'; +import { MyMenuItemProps, MyMenuListProps, shortAddress } from '@/utils'; +import { useEffect } from 'react'; +import { lastWalletAtom } from '@/store/utils.atoms'; +import { useAccount, useConnect, useDisconnect } from '@starknet-react/core'; +import { CONNECTOR_NAMES, MYCONNECTORS } from '@/app/template'; +import { isMobile } from 'react-device-detect'; + +interface NavbarProps { + hideTg?: boolean; + forceShowConnect?: boolean; +} + +export default function Navbar(props: NavbarProps) { + const { address, connector } = useAccount(); + const { connect, connectors } = useConnect(); + const { disconnectAsync } = useDisconnect(); + const setAddress = useSetAtom(addressAtom); + const [lastWallet, setLastWallet] = useAtom(lastWalletAtom); + const { starknetkitConnectModal: starknetkitConnectModal1 } = + useStarknetkitConnectModal({ + modalMode: 'canAsk', + modalTheme: 'dark', + connectors: MYCONNECTORS, + }); + + // backup + const { starknetkitConnectModal: starknetkitConnectModal2 } = + useStarknetkitConnectModal({ + modalMode: 'alwaysAsk', + modalTheme: 'dark', + connectors: MYCONNECTORS, + }); + + // Connect wallet using starknetkit + const connectWallet = async () => { + try { + const result = await starknetkitConnectModal1(); + await connect({ connector: result.connector }); + } catch (error) { + console.warn('connectWallet error', error); + try { + const result = await starknetkitConnectModal2(); + await connect({ connector: result.connector }); + } catch (error) { + console.error('connectWallet error', error); + alert('Error connecting wallet'); + } + } + }; + + function autoConnect(retry = 0) { + console.log('lastWallet', lastWallet, connectors); + try { + if (!address && lastWallet) { + const connectorIndex = CONNECTOR_NAMES.findIndex( + (name) => name === lastWallet, + ); + if (connectorIndex >= 0) { + connect({ connector: MYCONNECTORS[connectorIndex] }); + } + } + } catch (error) { + console.error('lastWallet error', error); + if (retry < 10) { + setTimeout(() => { + autoConnect(retry + 1); + }, 1000); + } + } + } + // Auto-connects to last wallet + useEffect(() => { + autoConnect(); + }, [lastWallet]); + + // Set last wallet when a new wallet is connected + useEffect(() => { + console.log('lastWallet connector', connector?.name); + if (connector) { + const name: string = connector.name; + setLastWallet(name); + } + }, [connector]); + + // set address atom + useEffect(() => { + setAddress(address); + }, [address]); + + return ( + +
+ + {''} + Report bugs & share feedback in our Telegram group. + {''} + +
+ + + + logo + + {/* + + */} + {!props.hideTg && ( + + + + } + /> + + )} + {(!isMobile || props.forceShowConnect) && ( + + : <>} + iconSpacing={{ base: '1px', sm: '5px' }} + bgColor={'purple'} + color="white" + borderColor={'purple'} + borderWidth="1px" + _hover={{ + bg: 'bg', + borderColor: 'purple', + borderWidth: '1px', + color: 'purple', + }} + _active={{ + bg: 'bg', + borderColor: 'purple', + color: 'purple', + }} + marginLeft={'10px'} + display={{ base: 'flex' }} + height={{ base: '2rem', sm: '2.5rem' }} + my={{ base: 'auto', sm: 'initial' }} + paddingX={{ base: '0.5rem', sm: '1rem' }} + fontSize={{ base: '0.8rem', sm: '1rem' }} + onClick={address ? undefined : connectWallet} + size="xs" + > +
{address ? shortAddress(address) : 'Connect'}
+
+ + {address && ( + { + disconnectAsync().then((data) => { + console.log('wallet disconnected'); + setLastWallet(null); + }); + }} + > + Disconnect + + )} + +
+ )} +
+
+
+ ); +} diff --git a/src/components/Pools.tsx b/src/components/Pools.tsx old mode 100644 new mode 100755 diff --git a/src/components/Strategies.tsx b/src/components/Strategies.tsx old mode 100644 new mode 100755 index e620db2..15757b6 --- a/src/components/Strategies.tsx +++ b/src/components/Strategies.tsx @@ -1,343 +1,343 @@ -import { allPoolsAtomUnSorted } from '@/store/pools'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { getUniqueById } from '@/utils'; -import { AddIcon } from '@chakra-ui/icons'; -import { - Avatar, - AvatarGroup, - Badge, - Box, - Button, - Card, - CardBody, - Center, - Container, - HStack, - Heading, - Link, - LinkBox, - LinkOverlay, - Popover, - PopoverArrow, - PopoverBody, - PopoverCloseButton, - PopoverContent, - PopoverTrigger, - Skeleton, - Stack, - Text, - Tooltip, - Wrap, - WrapItem, -} from '@chakra-ui/react'; -import { useAtomValue } from 'jotai'; -import React from 'react'; -import mixpanel from 'mixpanel-browser'; -import TVL from './TVL'; -import CONSTANTS from '@/constants'; -import { IStrategyProps, StrategyLiveStatus } from '@/strategies/IStrategy'; - -export default function Strategies() { - const allPools = useAtomValue(allPoolsAtomUnSorted); - const strategies = useAtomValue(strategiesAtom); - - function getStratCardBg(strat: IStrategyProps, index: number) { - if ( - strat.liveStatus == StrategyLiveStatus.ACTIVE || - strat.liveStatus == StrategyLiveStatus.NEW - ) { - return index % 2 === 0 ? 'color1_50p' : 'color2_50p'; - } - return 'bg'; - } - - function getStratCardBgHover(strat: IStrategyProps, index: number) { - if (strat.liveStatus == StrategyLiveStatus.ACTIVE) { - return index % 2 === 0 ? 'color1_65p' : 'color2_65p'; - } - return 'bg'; - } - - function DepositButton(strat: StrategyInfo) { - // const { isOpen, onOpen, onClose } = useDisclosure() - return ( - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.pool.name, - logo: p.pool.pool.logos[0], - })), - ).map((p: any) => ( - - ))} - - - {strat.description} - - - - - - - - - - - Thanks for showing interest in{' '} - `One Click Deposit` feature. We are developing this as - you read this message and will be available soon. The button is - to let you know that we will be supporting this soon. 😎 - - - - - Join our Telegram group to get instant updates. Link on the - top. - - - - - - - ); - } - - function isLive(strat: StrategyInfo) { - return ( - strat.liveStatus == StrategyLiveStatus.ACTIVE || - strat.liveStatus == StrategyLiveStatus.NEW - ); - } - - function getStratCard(strat: StrategyInfo) { - return ( - - { - mixpanel.track('Strategy expanded', { name: strat.name }); - }} - > - - - - - - {strat.name} - - {strat.liveStatus != StrategyLiveStatus.ACTIVE && ( - - {strat.liveStatus.valueOf()} - - )} - - - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.protocol.name, - logo: p.pool.protocol.logo, - })), - ).map((p) => ( - -
- - {p.id} -
-
- ))} -
-
-
-
-
- - - - - {(strat.netYield * 100).toFixed(2)}% - - - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.pool.name, - logo: p.pool.pool.logos[0], - })), - ).map((p: any) => ( - - ))} - - - - - {strat.leverage.toFixed(1)}x - - - - {/* - {getAPRWithToolTip(pool)} - ${Math.round(pool.tvl).toLocaleString()} - */} -
- ); - } - - return ( - - - - What are strategies? Strategies are combination of investment - steps that combine various pools and risk combinations to maximize - yield. We currently have one High yield low risk strategy, and adding - more as you read this. - - - - - - Strategy - - - - APR(%)/Leverage - - - - - - {allPools.length && strategies.length > 0 && ( - - {strategies.map((strat, index) => ( - - - - {getStratCard(strat)} - - {/* {DepositButton(strat)} */} - - - ))} - - )} - {allPools.length > 0 && strategies.length === 0 && ( - - - No strategies. Check back soon. - - - )} - {allPools.length === 0 && ( - - - - - - - )} - - More strategies coming soon. Join our{' '} - - Telegram channel - {' '} - to stay upto date. - - - ); -} +import { allPoolsAtomUnSorted } from '@/store/pools'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { getUniqueById } from '@/utils'; +import { AddIcon } from '@chakra-ui/icons'; +import { + Avatar, + AvatarGroup, + Badge, + Box, + Button, + Card, + CardBody, + Center, + Container, + HStack, + Heading, + Link, + LinkBox, + LinkOverlay, + Popover, + PopoverArrow, + PopoverBody, + PopoverCloseButton, + PopoverContent, + PopoverTrigger, + Skeleton, + Stack, + Text, + Tooltip, + Wrap, + WrapItem, +} from '@chakra-ui/react'; +import { useAtomValue } from 'jotai'; +import React from 'react'; +import mixpanel from 'mixpanel-browser'; +import TVL from './TVL'; +import CONSTANTS from '@/constants'; +import { IStrategyProps, StrategyLiveStatus } from '@/strategies/IStrategy'; + +export default function Strategies() { + const allPools = useAtomValue(allPoolsAtomUnSorted); + const strategies = useAtomValue(strategiesAtom); + + function getStratCardBg(strat: IStrategyProps, index: number) { + if ( + strat.liveStatus == StrategyLiveStatus.ACTIVE || + strat.liveStatus == StrategyLiveStatus.NEW + ) { + return index % 2 === 0 ? 'color1_50p' : 'color2_50p'; + } + return 'bg'; + } + + function getStratCardBgHover(strat: IStrategyProps, index: number) { + if (strat.liveStatus == StrategyLiveStatus.ACTIVE) { + return index % 2 === 0 ? 'color1_65p' : 'color2_65p'; + } + return 'bg'; + } + + function DepositButton(strat: StrategyInfo) { + // const { isOpen, onOpen, onClose } = useDisclosure() + return ( + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.pool.name, + logo: p.pool.pool.logos[0], + })), + ).map((p: any) => ( + + ))} + + + {strat.description} + + + + + + + + + + + Thanks for showing interest in{' '} + `One Click Deposit` feature. We are developing this as + you read this message and will be available soon. The button is + to let you know that we will be supporting this soon. 😎 + + + + + Join our Telegram group to get instant updates. Link on the + top. + + + + + + + ); + } + + function isLive(strat: StrategyInfo) { + return ( + strat.liveStatus == StrategyLiveStatus.ACTIVE || + strat.liveStatus == StrategyLiveStatus.NEW + ); + } + + function getStratCard(strat: StrategyInfo) { + return ( + + { + mixpanel.track('Strategy expanded', { name: strat.name }); + }} + > + + + + + + {strat.name} + + {strat.liveStatus != StrategyLiveStatus.ACTIVE && ( + + {strat.liveStatus.valueOf()} + + )} + + + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.protocol.name, + logo: p.pool.protocol.logo, + })), + ).map((p) => ( + +
+ + {p.id} +
+
+ ))} +
+
+
+
+
+ + + + + {(strat.netYield * 100).toFixed(2)}% + + + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.pool.name, + logo: p.pool.pool.logos[0], + })), + ).map((p: any) => ( + + ))} + + + + + {strat.leverage.toFixed(1)}x + + + + {/* + {getAPRWithToolTip(pool)} + ${Math.round(pool.tvl).toLocaleString()} + */} +
+ ); + } + + return ( + + + + What are strategies? Strategies are combination of investment + steps that combine various pools and risk combinations to maximize + yield. We currently have one High yield low risk strategy, and adding + more as you read this. + + + + + + Strategy + + + + APR(%)/Leverage + + + + + + {allPools.length && strategies.length > 0 && ( + + {strategies.map((strat, index) => ( + + + + {getStratCard(strat)} + + {/* {DepositButton(strat)} */} + + + ))} + + )} + {allPools.length > 0 && strategies.length === 0 && ( + + + No strategies. Check back soon. + + + )} + {allPools.length === 0 && ( + + + + + + + )} + + More strategies coming soon. Join our{' '} + + Telegram channel + {' '} + to stay upto date. + + + ); +} diff --git a/src/components/TVL.tsx b/src/components/TVL.tsx old mode 100644 new mode 100755 diff --git a/src/components/TxButton.tsx b/src/components/TxButton.tsx old mode 100644 new mode 100755 index 8e6cef9..72fa8ab --- a/src/components/TxButton.tsx +++ b/src/components/TxButton.tsx @@ -1,122 +1,122 @@ -import CONSTANTS from '@/constants'; -import { StrategyTxProps, monitorNewTxAtom } from '@/store/transactions.atom'; -import { Box, Button, ButtonProps, Spinner } from '@chakra-ui/react'; -import { useAccount, useContractWrite } from '@starknet-react/core'; -import { useSetAtom } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import { useEffect, useMemo } from 'react'; -import { isMobile } from 'react-device-detect'; -import { Call } from 'starknet'; - -interface TxButtonProps { - txInfo: StrategyTxProps; - text: string; - calls: Call[]; - buttonProps: ButtonProps; - justDisableIfNoWalletConnect?: boolean; -} - -export default function TxButton(props: TxButtonProps) { - const { address } = useAccount(); - const monitorNewTx = useSetAtom(monitorNewTxAtom); - const disabledStyle = { - bg: 'var(--chakra-colors-disabled_bg)', - color: 'var(--chakra-colors-disabled_text)', - borderColor: 'var(--chakra-colors-disabled_bg)', - borderWidth: '1px', - }; - - const { writeAsync, data, status, isSuccess, isPending, error, isError } = - useContractWrite({ - calls: props.calls, - }); - - useEffect(() => { - console.log( - 'TxButton status', - isPending, - status, - isSuccess, - data, - error, - isError, - ); - if (data && data.transaction_hash) { - console.log('TxButton txHash', data.transaction_hash); - // initiates a toast and adds the tx to tx history if successful - monitorNewTx({ - txHash: data.transaction_hash, - info: props.txInfo, - status: 'pending', // 'success' | 'failed' - createdAt: new Date(), - }); - } - }, [status, data]); - - // useEffect(() => { - // console.log('TxButton props calls', props.calls); - // }, [props]) - - const disabledText = useMemo(() => { - if (props.justDisableIfNoWalletConnect) { - if (!address) return props.text; - return ''; - } - if (isMobile) return CONSTANTS.MOBILE_MSG; - if (!address) return 'Wallet not connected'; - return ''; - }, [isMobile, address, props]); - - if (disabledText) { - return ( - - ); - } - - return ( - - - - ); -} +import CONSTANTS from '@/constants'; +import { StrategyTxProps, monitorNewTxAtom } from '@/store/transactions.atom'; +import { Box, Button, ButtonProps, Spinner } from '@chakra-ui/react'; +import { useAccount, useContractWrite } from '@starknet-react/core'; +import { useSetAtom } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import { useEffect, useMemo } from 'react'; +import { isMobile } from 'react-device-detect'; +import { Call } from 'starknet'; + +interface TxButtonProps { + txInfo: StrategyTxProps; + text: string; + calls: Call[]; + buttonProps: ButtonProps; + justDisableIfNoWalletConnect?: boolean; +} + +export default function TxButton(props: TxButtonProps) { + const { address } = useAccount(); + const monitorNewTx = useSetAtom(monitorNewTxAtom); + const disabledStyle = { + bg: 'var(--chakra-colors-disabled_bg)', + color: 'var(--chakra-colors-disabled_text)', + borderColor: 'var(--chakra-colors-disabled_bg)', + borderWidth: '1px', + }; + + const { writeAsync, data, status, isSuccess, isPending, error, isError } = + useContractWrite({ + calls: props.calls, + }); + + useEffect(() => { + console.log( + 'TxButton status', + isPending, + status, + isSuccess, + data, + error, + isError, + ); + if (data && data.transaction_hash) { + console.log('TxButton txHash', data.transaction_hash); + // initiates a toast and adds the tx to tx history if successful + monitorNewTx({ + txHash: data.transaction_hash, + info: props.txInfo, + status: 'pending', // 'success' | 'failed' + createdAt: new Date(), + }); + } + }, [status, data]); + + // useEffect(() => { + // console.log('TxButton props calls', props.calls); + // }, [props]) + + const disabledText = useMemo(() => { + if (props.justDisableIfNoWalletConnect) { + if (!address) return props.text; + return ''; + } + if (isMobile) return CONSTANTS.MOBILE_MSG; + if (!address) return 'Wallet not connected'; + return ''; + }, [isMobile, address, props]); + + if (disabledText) { + return ( + + ); + } + + return ( + + + + ); +} diff --git a/src/constants.ts b/src/constants.ts old mode 100644 new mode 100755 index 470b204..fcad544 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,168 +1,168 @@ -import { NFTInfo, TokenInfo } from './strategies/IStrategy'; -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', -}; - -export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; -const CONSTANTS = { - DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', - NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', - CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', - CARMINE_URL: '/carmine/api/v2/mainnet', - LENDING_INCENTIVES_URL: - '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', - LOGOS, - COMMUNITY_TG: 'https://t.me/+HQ_eHaXmF-1lZDc1', - NOSTRA: { - LENDING_GRAPH_URL: '/nostra/app/data-yqlpb/endpoint/data/v1/action/find', - }, - ZKLEND: { - BASE_APR_API: '/zklend/api/pools', - }, - JEDI: { - BASE_API: '/jediswap/graphql', - }, - EKUBO: { - CLAIMS_URL: - '/ekubo/airdrops/{{address}}?token=0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - BASE_API: '/ekubo', - }, - HAIKO: { - BASE_APR_API: 'haiko/markets?network=mainnet', - }, - MY_SWAP: { - POOLS_API: '/myswap/data/pools/all.json', - BASE_APR_API: '/myswap/data/pools', - }, - CONTRACTS: { - Master: '0x50314707690c31597849ed66a494fb4279dc060f8805f21593f52906846e28e', - AutoStrkFarm: - '0x541681b9ad63dff1b35f79c78d8477f64857de29a27902f7298f7b620838ea', - AutoUsdcFarm: - '0x16912b22d5696e95ffde888ede4bd69fbbc60c5f873082857a47c543172694f', - DeltaNeutralMMUSDCETH: - '0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422', - DeltaNeutralMMSTRKETH: - '0x20d5fc4c9df4f943ebb36078e703369c04176ed00accf290e8295b659d2cea6', - }, - MOBILE_MSG: 'Desktop/Tablet only', -}; - -export const TOKENS: TokenInfo[] = [ - { - token: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', - name: 'ETH', - decimals: 18, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.ETH, - minAmount: MyNumber.fromEther('10', 18), - maxAmount: MyNumber.fromEther('10000', 18), - stepAmount: MyNumber.fromEther('10', 18), - isERC4626: false, - }, - { - token: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - name: 'STRK', - 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, - }, - { - token: '0x06d8fa671ef84f791b7f601fa79fea8f6ceb70b5fa84189e3159d532162efc21', - name: 'zSTRK', - 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, - }, - { - token: CONSTANTS.CONTRACTS.AutoStrkFarm, - name: 'frmzSTRK', - decimals: 18, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.STRK, - minAmount: MyNumber.fromEther('10', 18), - maxAmount: MyNumber.fromEther('10000', 18), - stepAmount: MyNumber.fromEther('10', 18), - isERC4626: true, - }, - { - token: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', - name: 'USDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', - name: 'USDT', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDT, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: '0x047ad51726d891f972e74e4ad858a261b43869f7126ce7436ee0b2529a98f486', - name: 'zUSDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: CONSTANTS.CONTRACTS.AutoUsdcFarm, - name: 'frmzUSDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: true, - }, -]; - -export const NFTS: NFTInfo[] = [ - { - name: 'frmDNMMUSDCETH', - address: CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - logo: CONSTANTS.LOGOS.USDC, - config: { - mainTokenName: 'USDC', - }, - }, - { - name: 'frmDNMMSTRKETH', - address: CONSTANTS.CONTRACTS.DeltaNeutralMMSTRKETH, - logo: CONSTANTS.LOGOS.STRK, - config: { - mainTokenName: 'STRK', - }, - }, -]; - -export default CONSTANTS; +import { NFTInfo, TokenInfo } from './strategies/IStrategy'; +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', +}; + +export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; +const CONSTANTS = { + DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', + NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', + CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', + CARMINE_URL: '/carmine/api/v2/mainnet', + LENDING_INCENTIVES_URL: + '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', + LOGOS, + COMMUNITY_TG: 'https://t.me/+HQ_eHaXmF-1lZDc1', + NOSTRA: { + LENDING_GRAPH_URL: '/nostra/app/data-yqlpb/endpoint/data/v1/action/find', + }, + ZKLEND: { + BASE_APR_API: '/zklend/api/pools', + }, + JEDI: { + BASE_API: '/jediswap/graphql', + }, + EKUBO: { + CLAIMS_URL: + '/ekubo/airdrops/{{address}}?token=0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + BASE_API: '/ekubo', + }, + HAIKO: { + BASE_APR_API: 'haiko/markets?network=mainnet', + }, + MY_SWAP: { + POOLS_API: '/myswap/data/pools/all.json', + BASE_APR_API: '/myswap/data/pools', + }, + CONTRACTS: { + Master: '0x50314707690c31597849ed66a494fb4279dc060f8805f21593f52906846e28e', + AutoStrkFarm: + '0x541681b9ad63dff1b35f79c78d8477f64857de29a27902f7298f7b620838ea', + AutoUsdcFarm: + '0x16912b22d5696e95ffde888ede4bd69fbbc60c5f873082857a47c543172694f', + DeltaNeutralMMUSDCETH: + '0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422', + DeltaNeutralMMSTRKETH: + '0x20d5fc4c9df4f943ebb36078e703369c04176ed00accf290e8295b659d2cea6', + }, + MOBILE_MSG: 'Desktop/Tablet only', +}; + +export const TOKENS: TokenInfo[] = [ + { + token: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', + name: 'ETH', + decimals: 18, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.ETH, + minAmount: MyNumber.fromEther('10', 18), + maxAmount: MyNumber.fromEther('10000', 18), + stepAmount: MyNumber.fromEther('10', 18), + isERC4626: false, + }, + { + token: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + name: 'STRK', + 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, + }, + { + token: '0x06d8fa671ef84f791b7f601fa79fea8f6ceb70b5fa84189e3159d532162efc21', + name: 'zSTRK', + 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, + }, + { + token: CONSTANTS.CONTRACTS.AutoStrkFarm, + name: 'frmzSTRK', + decimals: 18, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.STRK, + minAmount: MyNumber.fromEther('10', 18), + maxAmount: MyNumber.fromEther('10000', 18), + stepAmount: MyNumber.fromEther('10', 18), + isERC4626: true, + }, + { + token: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', + name: 'USDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', + name: 'USDT', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDT, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: '0x047ad51726d891f972e74e4ad858a261b43869f7126ce7436ee0b2529a98f486', + name: 'zUSDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: CONSTANTS.CONTRACTS.AutoUsdcFarm, + name: 'frmzUSDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: true, + }, +]; + +export const NFTS: NFTInfo[] = [ + { + name: 'frmDNMMUSDCETH', + address: CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + logo: CONSTANTS.LOGOS.USDC, + config: { + mainTokenName: 'USDC', + }, + }, + { + name: 'frmDNMMSTRKETH', + address: CONSTANTS.CONTRACTS.DeltaNeutralMMSTRKETH, + logo: CONSTANTS.LOGOS.STRK, + config: { + mainTokenName: 'STRK', + }, + }, +]; + +export default CONSTANTS; diff --git a/src/hooks/useERC20Balance.ts b/src/hooks/useERC20Balance.ts old mode 100644 new mode 100755 diff --git a/src/hooks/useERC4626Value.ts b/src/hooks/useERC4626Value.ts old mode 100644 new mode 100755 diff --git a/src/store/IDapp.store.ts b/src/store/IDapp.store.ts old mode 100644 new mode 100755 index f9b7e02..bec38b9 --- a/src/store/IDapp.store.ts +++ b/src/store/IDapp.store.ts @@ -1,77 +1,77 @@ -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { APRSplit, PoolInfo, PoolMetadata } from './pools'; -import { TokenName } from '@/constants'; -import { StrategyAction } from '@/strategies/IStrategy'; - -export interface APRInfo { - asset: TokenName; - apr: number; -} - -export class IDapp { - name: string = ''; - link: string = ''; - logo: string = ''; - - incentiveDataKey: string = ''; - _computePoolsInfo(data: any): PoolInfo[] { - throw new Error('not implemented: _computePoolsInfo'); - } - - addBaseAPYs( - pools: PoolInfo[], - data: AtomWithQueryResult, - ): PoolInfo[] { - console.log(`lending: ${this.name}`, data); - if (data.isError) { - console.error('Error fetching lending base', data.error); - } - return pools.map((p) => { - const { baseAPY, splitApr, metadata } = this.getBaseAPY(p, data); - const aprSplits = p.aprSplits; - if (splitApr) p.aprSplits.unshift(splitApr); - return { - ...p, - isLoading: data.isLoading, - aprSplits, - apr: baseAPY !== 'Err' ? p.apr + baseAPY : p.apr, - ...metadata, - }; - }); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ): { - baseAPY: number | 'Err'; - splitApr: APRSplit | null; - metadata: PoolMetadata | null; - } { - throw new Error('not implemented: getBaseAPY'); - } - - getHF(positions: StrategyAction[]): { hf: number; isLiquidable: boolean } { - throw new Error('not implemented: getHF'); - } - - getMaxFactoredOut(positions: StrategyAction[], minHf: number): number { - throw new Error('not implemented: getMaxFactoredOut'); - } - - commonVaultFilter(poolName: string) { - const supportedPools = [ - 'ETH/USDC', - 'STRK/USDC', - 'STRK/ETH', - 'USDC/USDT', - 'USDC', - 'USDT', - 'ETH', - 'STRK', - ]; - console.log('filter', poolName, supportedPools.includes(poolName)); - // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); - return supportedPools.includes(poolName); - } -} +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { APRSplit, PoolInfo, PoolMetadata } from './pools'; +import { TokenName } from '@/constants'; +import { StrategyAction } from '@/strategies/IStrategy'; + +export interface APRInfo { + asset: TokenName; + apr: number; +} + +export class IDapp { + name: string = ''; + link: string = ''; + logo: string = ''; + + incentiveDataKey: string = ''; + _computePoolsInfo(data: any): PoolInfo[] { + throw new Error('not implemented: _computePoolsInfo'); + } + + addBaseAPYs( + pools: PoolInfo[], + data: AtomWithQueryResult, + ): PoolInfo[] { + console.log(`lending: ${this.name}`, data); + if (data.isError) { + console.error('Error fetching lending base', data.error); + } + return pools.map((p) => { + const { baseAPY, splitApr, metadata } = this.getBaseAPY(p, data); + const aprSplits = p.aprSplits; + if (splitApr) p.aprSplits.unshift(splitApr); + return { + ...p, + isLoading: data.isLoading, + aprSplits, + apr: baseAPY !== 'Err' ? p.apr + baseAPY : p.apr, + ...metadata, + }; + }); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ): { + baseAPY: number | 'Err'; + splitApr: APRSplit | null; + metadata: PoolMetadata | null; + } { + throw new Error('not implemented: getBaseAPY'); + } + + getHF(positions: StrategyAction[]): { hf: number; isLiquidable: boolean } { + throw new Error('not implemented: getHF'); + } + + getMaxFactoredOut(positions: StrategyAction[], minHf: number): number { + throw new Error('not implemented: getMaxFactoredOut'); + } + + commonVaultFilter(poolName: string) { + const supportedPools = [ + 'ETH/USDC', + 'STRK/USDC', + 'STRK/ETH', + 'USDC/USDT', + 'USDC', + 'USDT', + 'ETH', + 'STRK', + ]; + console.log('filter', poolName, supportedPools.includes(poolName)); + // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); + return supportedPools.includes(poolName); + } +} diff --git a/src/store/balance.atoms.ts b/src/store/balance.atoms.ts old mode 100644 new mode 100755 index e794d48..6317b03 --- a/src/store/balance.atoms.ts +++ b/src/store/balance.atoms.ts @@ -1,192 +1,192 @@ -import ERC4626Abi from '@/abi/erc4626.abi.json'; -import { NFTInfo, TokenInfo } from '@/strategies/IStrategy'; -import MyNumber from '@/utils/MyNumber'; -import { NFTS } from '@/constants'; -import { Contract, RpcProvider, num, uint256 } from 'starknet'; -import { atomWithQuery } from 'jotai-tanstack-query'; -import { addressAtom } from '@/store/claims.atoms'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; -import { Atom } from 'jotai'; -import { - getTokenInfoFromAddr, - getTokenInfoFromName, - standariseAddress, -} from '@/utils'; - -export interface BalanceResult { - amount: MyNumber; - tokenInfo: TokenInfo | undefined; -} - -function returnEmptyBal(): BalanceResult { - return { - amount: MyNumber.fromZero(), - tokenInfo: undefined, - }; -} - -export async function getERC20Balance( - token: TokenInfo | undefined, - address: string | undefined, -) { - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc20Contract = new Contract(ERC20Abi, token.token, provider); - const balance = await erc20Contract.call('balanceOf', [address]); - console.log('erc20 balData', token.token, balance.toString()); - return { - amount: new MyNumber(balance.toString(), token.decimals), - tokenInfo: token, - }; -} - -export async function getERC4626Balance( - token: TokenInfo | undefined, - address: string | undefined, -) { - console.log('balData isERC4626', token?.token); - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const bal = await getERC20Balance(token, address); - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc4626Contract = new Contract(ERC4626Abi, token.token, provider); - const balance = await erc4626Contract.call('convert_to_assets', [ - uint256.bnToUint256(bal.amount.toString()), - ]); - - const asset = await erc4626Contract.call('asset', []); - console.log( - 'erc4626 balData', - token.token, - balance, - standariseAddress(asset as string), - ); - const assetInfo = getTokenInfoFromAddr(standariseAddress(asset as string)); - if (!assetInfo) { - throw new Error('ERC4626: Asset not found'); - } - return { - amount: new MyNumber(balance.toString(), token.decimals), - tokenInfo: assetInfo, - }; -} - -export async function getERC721PositionValue( - token: NFTInfo | undefined, - address: string | undefined, -) { - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc721Contract = new Contract(DeltaNeutralAbi, token.address, provider); - const tokenId = num.getDecimalString(address); - const result: any = await erc721Contract.call('describe_position', [tokenId]); - console.log('erc721 position balData', token.address, result[1]); - const tokenInfo = getTokenInfoFromName(token.config.mainTokenName); - return { - amount: new MyNumber( - uint256.uint256ToBN(result[1].estimated_size).toString(), - tokenInfo.decimals, - ), - tokenInfo, - }; -} - -export function getERC20BalanceAtom(token: TokenInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC20Balance', token?.token], - queryFn: async ({ queryKey }: any): Promise => { - return getERC20Balance(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -function getERC4626BalanceAtom(token: TokenInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC4626Balance', token?.token], - queryFn: async ({ queryKey }: any): Promise => { - return getERC4626Balance(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -function getERC721PositionValueAtom(token: NFTInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC721PositionValue', token?.address], - queryFn: async ({ queryKey }: any): Promise => { - return getERC721PositionValue(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -export async function getBalance( - token: TokenInfo | NFTInfo | undefined, - address: string, -) { - if (token) { - console.log('token getBalance', token); - if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { - const _token = token; - console.log('token getBalance isERC4626', _token.isERC4626); - if (_token.isERC4626) return getERC4626Balance(_token, address); - } else { - const _token = token; - const isNFT = NFTS.find((nft) => nft.address === _token.address); - if (isNFT) return getERC721PositionValue(_token, address); - } - return getERC20Balance(token, address); - } - - return returnEmptyBal(); -} - -export function getBalanceAtom( - token: TokenInfo | NFTInfo | undefined, - enabledAtom: Atom, -) { - if (token) { - console.log('token getBalanceAtom', token); - if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { - const _token = token; - console.log('token getBalanceAtom isERC4626', _token.isERC4626); - if (_token.isERC4626) return getERC4626BalanceAtom(_token); - } else { - const _token = token; - const isNFT = NFTS.find((nft) => nft.address === _token.address); - if (isNFT) return getERC721PositionValueAtom(_token); - } - } - - // fallback option for now. if token is undefined, this will return 0 anyways - return getERC20BalanceAtom(token); -} - -export const DUMMY_BAL_ATOM = atomWithQuery((get) => { - return { - queryKey: ['DUMMY_BAL_ATOM'], - queryFn: async ({ queryKey }: any): Promise => { - return returnEmptyBal(); - }, - refetchInterval: 100000000, - }; -}); +import ERC4626Abi from '@/abi/erc4626.abi.json'; +import { NFTInfo, TokenInfo } from '@/strategies/IStrategy'; +import MyNumber from '@/utils/MyNumber'; +import { NFTS } from '@/constants'; +import { Contract, RpcProvider, num, uint256 } from 'starknet'; +import { atomWithQuery } from 'jotai-tanstack-query'; +import { addressAtom } from '@/store/claims.atoms'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; +import { Atom } from 'jotai'; +import { + getTokenInfoFromAddr, + getTokenInfoFromName, + standariseAddress, +} from '@/utils'; + +export interface BalanceResult { + amount: MyNumber; + tokenInfo: TokenInfo | undefined; +} + +function returnEmptyBal(): BalanceResult { + return { + amount: MyNumber.fromZero(), + tokenInfo: undefined, + }; +} + +export async function getERC20Balance( + token: TokenInfo | undefined, + address: string | undefined, +) { + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc20Contract = new Contract(ERC20Abi, token.token, provider); + const balance = await erc20Contract.call('balanceOf', [address]); + console.log('erc20 balData', token.token, balance.toString()); + return { + amount: new MyNumber(balance.toString(), token.decimals), + tokenInfo: token, + }; +} + +export async function getERC4626Balance( + token: TokenInfo | undefined, + address: string | undefined, +) { + console.log('balData isERC4626', token?.token); + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const bal = await getERC20Balance(token, address); + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc4626Contract = new Contract(ERC4626Abi, token.token, provider); + const balance = await erc4626Contract.call('convert_to_assets', [ + uint256.bnToUint256(bal.amount.toString()), + ]); + + const asset = await erc4626Contract.call('asset', []); + console.log( + 'erc4626 balData', + token.token, + balance, + standariseAddress(asset as string), + ); + const assetInfo = getTokenInfoFromAddr(standariseAddress(asset as string)); + if (!assetInfo) { + throw new Error('ERC4626: Asset not found'); + } + return { + amount: new MyNumber(balance.toString(), token.decimals), + tokenInfo: assetInfo, + }; +} + +export async function getERC721PositionValue( + token: NFTInfo | undefined, + address: string | undefined, +) { + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc721Contract = new Contract(DeltaNeutralAbi, token.address, provider); + const tokenId = num.getDecimalString(address); + const result: any = await erc721Contract.call('describe_position', [tokenId]); + console.log('erc721 position balData', token.address, result[1]); + const tokenInfo = getTokenInfoFromName(token.config.mainTokenName); + return { + amount: new MyNumber( + uint256.uint256ToBN(result[1].estimated_size).toString(), + tokenInfo.decimals, + ), + tokenInfo, + }; +} + +export function getERC20BalanceAtom(token: TokenInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC20Balance', token?.token], + queryFn: async ({ queryKey }: any): Promise => { + return getERC20Balance(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +function getERC4626BalanceAtom(token: TokenInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC4626Balance', token?.token], + queryFn: async ({ queryKey }: any): Promise => { + return getERC4626Balance(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +function getERC721PositionValueAtom(token: NFTInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC721PositionValue', token?.address], + queryFn: async ({ queryKey }: any): Promise => { + return getERC721PositionValue(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +export async function getBalance( + token: TokenInfo | NFTInfo | undefined, + address: string, +) { + if (token) { + console.log('token getBalance', token); + if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { + const _token = token; + console.log('token getBalance isERC4626', _token.isERC4626); + if (_token.isERC4626) return getERC4626Balance(_token, address); + } else { + const _token = token; + const isNFT = NFTS.find((nft) => nft.address === _token.address); + if (isNFT) return getERC721PositionValue(_token, address); + } + return getERC20Balance(token, address); + } + + return returnEmptyBal(); +} + +export function getBalanceAtom( + token: TokenInfo | NFTInfo | undefined, + enabledAtom: Atom, +) { + if (token) { + console.log('token getBalanceAtom', token); + if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { + const _token = token; + console.log('token getBalanceAtom isERC4626', _token.isERC4626); + if (_token.isERC4626) return getERC4626BalanceAtom(_token); + } else { + const _token = token; + const isNFT = NFTS.find((nft) => nft.address === _token.address); + if (isNFT) return getERC721PositionValueAtom(_token); + } + } + + // fallback option for now. if token is undefined, this will return 0 anyways + return getERC20BalanceAtom(token); +} + +export const DUMMY_BAL_ATOM = atomWithQuery((get) => { + return { + queryKey: ['DUMMY_BAL_ATOM'], + queryFn: async ({ queryKey }: any): Promise => { + return returnEmptyBal(); + }, + refetchInterval: 100000000, + }; +}); diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts old mode 100644 new mode 100755 index afce7de..684b47c --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -1,177 +1,177 @@ -import CONSTANTS from '@/constants'; -import { Category, PoolType } from './pools'; -import { atom } from 'jotai'; -import { PoolInfo, ProtocolAtoms } from './pools'; -import { Jediswap } from './jedi.store'; -import { atomWithQuery } from 'jotai-tanstack-query'; - -const poolConfigs = [ - { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, - { name: 'STRK/USDC Put Pool (USDC)', tokenA: 'STRK', tokenB: 'USDC' }, - { name: 'ETH/STRK Call Pool (ETH)', tokenA: 'ETH', tokenB: 'STRK' }, - { name: 'ETH/STRK Put Pool (STRK)', tokenA: 'ETH', tokenB: 'STRK' }, - { name: 'ETH/USDC Call Pool (ETH)', tokenA: 'ETH', tokenB: 'USDC' }, - { name: 'ETH/USDC Put Pool (USDC)', tokenA: 'ETH', tokenB: 'USDC' }, - { name: 'wBTC/USDC Put Pool (USDC)', tokenA: 'WBTC', tokenB: 'USDC' }, - { name: 'wBTC/USDC Call Pool (wBTC)', tokenA: 'WBTC', tokenB: 'USDC' }, -]; - -export class Carmine extends Jediswap { - name = 'Carmine Options'; - link = 'https://app.carmine.finance/staking'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; - incentiveDataKey = 'isCarmine'; - - _computePoolsInfo(data: any) { - try { - const myData = data; - if (!myData) return []; - const pools: PoolInfo[] = []; - - poolConfigs.forEach((config) => { - const poolData = myData[config.name]; - if (!poolData || !poolData.data) return; - - let category: Category; - if (config.name.endsWith('(USDC)')) { - category = Category.Stable; - } else if (config.name.endsWith('(STRK)')) { - category = Category.STRK; - } else { - category = Category.Others; - } - - const logo1 = - CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; - const logo2 = - CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; - - const baseApr = - poolData.data.week_annualized / 100 === 0 - ? 0.0 - : parseFloat(poolData.data.week_annualized) / 100; - const rewardApr = parseFloat(poolData.rewardApr) || 0; - - const poolInfo: PoolInfo = { - pool: { - name: config.name, - logos: [logo1, logo2], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: baseApr + rewardApr, - tvl: poolData.tvl, - aprSplits: [ - { - apr: baseApr || baseApr.toString() === '' ? baseApr : 0, - title: 'Supply Apy', - description: '', - }, - { - apr: rewardApr ?? 0, - title: 'STRK DeFi Spring rewards', - description: '', - }, - ], - category, - type: PoolType.Derivatives, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } catch (err) { - console.error('Err fetching pools [2]', err); - throw err; - } - } -} - -export const carmine = new Carmine(); - -const poolEndpoints = [ - { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, - { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, - { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, - { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, - { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, - { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, - { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, - { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, -]; - -export const CarmineAtom = atomWithQuery((get) => ({ - queryKey: ['isCarmine'], - queryFn: async ({ queryKey }) => { - const fetchPool = async (endpoint: any) => { - const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const fetchRewardApr = async () => { - const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const rewardAprData = await fetchRewardApr(); - const rewardApr = rewardAprData.data.apy; - const tvl = rewardAprData.data.tvl; - - const poolData = await Promise.all( - poolEndpoints.map(async (pool) => { - const data = await fetchPool(pool.endpoint); - return { name: pool.name, data }; - }), - ); - - const combinedData = poolData.reduce( - (acc, pool) => { - acc[pool.name] = { - ...pool.data, - rewardApr, - tvl, - }; - return acc; - }, - {} as { [key: string]: any }, - ); - - const specificPools = [ - 'wBTC/USDC Call Pool (wBTC)', - 'wBTC/USDC Put Pool (USDC)', - ]; - specificPools.forEach((poolName) => { - if (combinedData[poolName]) { - combinedData[poolName].rewardApr = 0.0; - } - }); - - return combinedData; - }, -})); - -const CarmineAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(CarmineAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return carmine._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; - -export default CarmineAtoms; +import CONSTANTS from '@/constants'; +import { Category, PoolType } from './pools'; +import { atom } from 'jotai'; +import { PoolInfo, ProtocolAtoms } from './pools'; +import { Jediswap } from './jedi.store'; +import { atomWithQuery } from 'jotai-tanstack-query'; + +const poolConfigs = [ + { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'STRK/USDC Put Pool (USDC)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'ETH/STRK Call Pool (ETH)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/STRK Put Pool (STRK)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/USDC Call Pool (ETH)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'ETH/USDC Put Pool (USDC)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'wBTC/USDC Put Pool (USDC)', tokenA: 'WBTC', tokenB: 'USDC' }, + { name: 'wBTC/USDC Call Pool (wBTC)', tokenA: 'WBTC', tokenB: 'USDC' }, +]; + +export class Carmine extends Jediswap { + name = 'Carmine Options'; + link = 'https://app.carmine.finance/staking'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; + incentiveDataKey = 'isCarmine'; + + _computePoolsInfo(data: any) { + try { + const myData = data; + if (!myData) return []; + const pools: PoolInfo[] = []; + + poolConfigs.forEach((config) => { + const poolData = myData[config.name]; + if (!poolData || !poolData.data) return; + + let category: Category; + if (config.name.endsWith('(USDC)')) { + category = Category.Stable; + } else if (config.name.endsWith('(STRK)')) { + category = Category.STRK; + } else { + category = Category.Others; + } + + const logo1 = + CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; + const logo2 = + CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; + + const baseApr = + poolData.data.week_annualized / 100 === 0 + ? 0.0 + : parseFloat(poolData.data.week_annualized) / 100; + const rewardApr = parseFloat(poolData.rewardApr) || 0; + + const poolInfo: PoolInfo = { + pool: { + name: config.name, + logos: [logo1, logo2], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: baseApr + rewardApr, + tvl: poolData.tvl, + aprSplits: [ + { + apr: baseApr || baseApr.toString() === '' ? baseApr : 0, + title: 'Supply Apy', + description: '', + }, + { + apr: rewardApr ?? 0, + title: 'STRK DeFi Spring rewards', + description: '', + }, + ], + category, + type: PoolType.Derivatives, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } catch (err) { + console.error('Err fetching pools [2]', err); + throw err; + } + } +} + +export const carmine = new Carmine(); + +const poolEndpoints = [ + { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, + { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, + { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, + { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, + { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, + { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, + { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, + { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, +]; + +export const CarmineAtom = atomWithQuery((get) => ({ + queryKey: ['isCarmine'], + queryFn: async ({ queryKey }) => { + const fetchPool = async (endpoint: any) => { + const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const fetchRewardApr = async () => { + const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const rewardAprData = await fetchRewardApr(); + const rewardApr = rewardAprData.data.apy; + const tvl = rewardAprData.data.tvl; + + const poolData = await Promise.all( + poolEndpoints.map(async (pool) => { + const data = await fetchPool(pool.endpoint); + return { name: pool.name, data }; + }), + ); + + const combinedData = poolData.reduce( + (acc, pool) => { + acc[pool.name] = { + ...pool.data, + rewardApr, + tvl, + }; + return acc; + }, + {} as { [key: string]: any }, + ); + + const specificPools = [ + 'wBTC/USDC Call Pool (wBTC)', + 'wBTC/USDC Put Pool (USDC)', + ]; + specificPools.forEach((poolName) => { + if (combinedData[poolName]) { + combinedData[poolName].rewardApr = 0.0; + } + }); + + return combinedData; + }, +})); + +const CarmineAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(CarmineAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return carmine._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; + +export default CarmineAtoms; diff --git a/src/store/claims.atoms.ts b/src/store/claims.atoms.ts old mode 100644 new mode 100755 diff --git a/src/store/ekobu.store.ts b/src/store/ekobu.store.ts old mode 100644 new mode 100755 index 67d7b48..d8a844f --- a/src/store/ekobu.store.ts +++ b/src/store/ekobu.store.ts @@ -1,401 +1,401 @@ -'use client'; - -import CONSTANTS, { TokenName } from '@/constants'; -import { - APRSplit, - Category, - PoolInfo, - PoolMetadata, - PoolType, - ProtocolAtoms, - StrkDexIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { IDapp } from './IDapp.store'; -const fetcher = (...args: any[]) => { - return fetch(args[0], args[1]).then((res) => res.json()); -}; - -interface EkuboBaseAprDoc { - tokens: Token[]; - defiSpringData: DefiSpringData; - pairData: PairData; - pricesETH: PricesOfToken; - pricesSTRK: PricesOfToken; - pricesUSDC: PricesOfToken; - priceOfStrk: PriceOfToken; - priceOfEth: PriceOfToken; -} - -type Token = { - name: string; - symbol: string; - decimals: number; - l2_token_address: string; - sort_order: number; - total_supply: number; - hidden?: boolean; - logo_url: string; -}; - -type DefiSpringData = { - strkPrice: number; - totalStrk: number; - pairs: [ - { - token0: Token; - token1: Token; - allocations: [ - { - date: string; - allocation: number; - thirty_day_realized_volatility: number; - }, - ]; - currentApr: number; - volatilityInTicks: number; - }, - ]; -}; - -type PairData = { - topPairs: [ - { - token0: string; - token1: string; - volume0_24h: string; - volume1_24h: string; - fees0_24h: string; - fees1_24h: string; - tvl0_total: string; - tvl1_total: string; - tvl0_delta_24h: string; - tvl1_delta_24h: string; - }, - ]; -}; - -type PricesOfToken = { - timestamp: number; - prices: [ - { - token: string; - price: string; - k_volume: string; - }, - ]; -}; - -type PriceOfToken = { - timestamp: string; - price: string; -}; - -export class Ekubo extends IDapp { - name = 'Ekubo'; - link = 'https://app.ekubo.org/positions'; - logo = 'https://app.ekubo.org/logo.svg'; - - incentiveDataKey = 'Ekubo'; - - _computePoolsInfo(data: any) { - try { - const myData = data[0][this.incentiveDataKey]; - const baseInfo = data[1]; - if (!myData) return []; - const pools: PoolInfo[] = []; - - Object.keys(myData) - .filter(this.commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - let category = Category.Others; - if (poolName === 'USDC/USDT') { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const tokens: TokenName[] = poolName.split('/'); - const logo1 = CONSTANTS.LOGOS[tokens[0]]; - const logo2 = CONSTANTS.LOGOS[tokens[1]]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1, logo2], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: arr[arr.length - 1].apr, - tvl: arr[arr.length - 1].tvl_usd, - aprSplits: [ - { - apr: arr[arr.length - 1].apr, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.DEXV3, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - - const { rewardAPY } = this.getBaseAPY(poolInfo, baseInfo); - if (rewardAPY) { - poolInfo.apr = rewardAPY; - poolInfo.aprSplits = [ - { - apr: rewardAPY, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ]; - } - pools.push(poolInfo); - }); - - return pools; - } catch (err) { - console.error('Error fetching pools', err); - throw err; - } - } - - commonVaultFilter(poolName: string) { - const supportedPools = [ - 'ETH/USDC', - 'STRK/USDC', - 'STRK/ETH', - 'USDC/USDT', - 'USDC', - 'USDT', - 'ETH', - 'STRK', - ]; - console.log('filter2', poolName, supportedPools.includes(poolName)); - // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); - return supportedPools.includes(poolName); - } - - getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { - let rewardAPY: number = 0; - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - const metadata: PoolMetadata | null = null; - - if (data.isSuccess) { - const poolName = p.pool.name; - - const { - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - } = data.data; - - const strkToken = tokens.find((t) => t.symbol === 'STRK'); - - const pools = pairData.topPairs - .map((p) => { - const t0 = BigInt(p.token0); - const t1 = BigInt(p.token1); - 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); - if (!token1 || token1.hidden) return; - - const springPair = defiSpringData.pairs.find( - (pair) => - BigInt(pair.token0.l2_token_address) === t0 && - BigInt(pair.token1.l2_token_address) === t1, - ); - - const price0 = - token0.symbol === 'USDC' - ? 1 - : getPrice({ - t: t0, - pricesETH, - pricesUSDC, - pricesSTRK, - priceOfEth, - priceOfStrk, - }); - const price1 = - token1.symbol === 'USDC' - ? 1 - : getPrice({ - t: t1, - pricesETH, - pricesUSDC, - pricesSTRK, - priceOfEth, - priceOfStrk, - }); - const tvlUsd = - ((price0 ?? 0) * Number(p.tvl0_total)) / - Math.pow(10, token0.decimals) + - ((price1 ?? 0) * Number(p.tvl1_total)) / - Math.pow(10, token1.decimals); - - if (tvlUsd < 10000) return; - const feesUsd = - ((price0 ?? 0) * Number(p.fees0_24h)) / - Math.pow(10, token0.decimals) + - ((price1 ?? 0) * Number(p.fees1_24h)) / - Math.pow(10, token1.decimals); - - const apyBase = (feesUsd * 365) / tvlUsd; - const apyReward = springPair ? springPair.currentApr : undefined; - - return { - pool: `${token0.symbol}/${token1.symbol}`, - symbol: `${token0.symbol}/${token1.symbol}`, - rewardTokens: - apyReward && strkToken ? [strkToken.l2_token_address] : [], - underlyingTokens: [ - token0.l2_token_address, - token1.l2_token_address, - ], - tvlUsd, - apyBase, - apyReward, - }; - }) - .filter((p) => !!p) - .sort((a, b) => b.tvlUsd - a.tvlUsd); - - const pool = pools.find((p) => p.pool === poolName); - - baseAPY = pool ? pool.apyBase : 0; - rewardAPY = pool && pool.apyReward ? pool.apyReward : 0; - - splitApr = { - apr: baseAPY, - title: 'Base APR', - description: 'Subject to position range', - }; - } - - return { - baseAPY, - rewardAPY, - splitApr, - metadata, - }; - } -} - -const getPrice = ({ - t, - pricesUSDC, - pricesETH, - pricesSTRK, - priceOfEth, - priceOfStrk, -}: { - t: bigint; - pricesUSDC: PricesOfToken; - pricesETH: PricesOfToken; - pricesSTRK: PricesOfToken; - priceOfEth: PriceOfToken; - priceOfStrk: PriceOfToken; -}) => { - let p = pricesUSDC.prices.find(({ token }) => BigInt(token) === t); - if (p) return Number(p.price); - p = pricesETH.prices.find(({ token }) => BigInt(token) === t); - if (p && priceOfEth) { - return Number(p.price) * Number(priceOfEth.price); - } - p = pricesSTRK.prices.find(({ token }) => BigInt(token) === t); - if (p && priceOfStrk) { - return Number(p.price) * Number(priceOfStrk); - } -}; - -const getData = async (): Promise => { - const [ - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - ] = await Promise.all([ - fetch(`${CONSTANTS.EKUBO.BASE_API}/tokens`).then((response) => - response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/defi-spring-incentives`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/overview/pairs`).then((response) => - response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/USDC?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK/USDC?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH/USDC?period=21600`).then( - (response) => response.json(), - ), - ]); - - return { - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - }; -}; - -export const ekubo = new Ekubo(); -const EkuboAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['ekubo_base_aprs'], - queryFn: async ({ queryKey }) => { - return await getData(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkDexIncentivesAtom); - const empty: PoolInfo[] = []; - if (!EkuboAtoms.baseAPRs) return empty; - const baseInfo = get(EkuboAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = ekubo._computePoolsInfo([poolsInfo.data, baseInfo]); - return ekubo.addBaseAPYs(pools, baseInfo); - } - - return empty; - }), -}; -export default EkuboAtoms; +'use client'; + +import CONSTANTS, { TokenName } from '@/constants'; +import { + APRSplit, + Category, + PoolInfo, + PoolMetadata, + PoolType, + ProtocolAtoms, + StrkDexIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { IDapp } from './IDapp.store'; +const fetcher = (...args: any[]) => { + return fetch(args[0], args[1]).then((res) => res.json()); +}; + +interface EkuboBaseAprDoc { + tokens: Token[]; + defiSpringData: DefiSpringData; + pairData: PairData; + pricesETH: PricesOfToken; + pricesSTRK: PricesOfToken; + pricesUSDC: PricesOfToken; + priceOfStrk: PriceOfToken; + priceOfEth: PriceOfToken; +} + +type Token = { + name: string; + symbol: string; + decimals: number; + l2_token_address: string; + sort_order: number; + total_supply: number; + hidden?: boolean; + logo_url: string; +}; + +type DefiSpringData = { + strkPrice: number; + totalStrk: number; + pairs: [ + { + token0: Token; + token1: Token; + allocations: [ + { + date: string; + allocation: number; + thirty_day_realized_volatility: number; + }, + ]; + currentApr: number; + volatilityInTicks: number; + }, + ]; +}; + +type PairData = { + topPairs: [ + { + token0: string; + token1: string; + volume0_24h: string; + volume1_24h: string; + fees0_24h: string; + fees1_24h: string; + tvl0_total: string; + tvl1_total: string; + tvl0_delta_24h: string; + tvl1_delta_24h: string; + }, + ]; +}; + +type PricesOfToken = { + timestamp: number; + prices: [ + { + token: string; + price: string; + k_volume: string; + }, + ]; +}; + +type PriceOfToken = { + timestamp: string; + price: string; +}; + +export class Ekubo extends IDapp { + name = 'Ekubo'; + link = 'https://app.ekubo.org/positions'; + logo = 'https://app.ekubo.org/logo.svg'; + + incentiveDataKey = 'Ekubo'; + + _computePoolsInfo(data: any) { + try { + const myData = data[0][this.incentiveDataKey]; + const baseInfo = data[1]; + if (!myData) return []; + const pools: PoolInfo[] = []; + + Object.keys(myData) + .filter(this.commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + let category = Category.Others; + if (poolName === 'USDC/USDT') { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const tokens: TokenName[] = poolName.split('/'); + const logo1 = CONSTANTS.LOGOS[tokens[0]]; + const logo2 = CONSTANTS.LOGOS[tokens[1]]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1, logo2], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: arr[arr.length - 1].apr, + tvl: arr[arr.length - 1].tvl_usd, + aprSplits: [ + { + apr: arr[arr.length - 1].apr, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.DEXV3, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + + const { rewardAPY } = this.getBaseAPY(poolInfo, baseInfo); + if (rewardAPY) { + poolInfo.apr = rewardAPY; + poolInfo.aprSplits = [ + { + apr: rewardAPY, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ]; + } + pools.push(poolInfo); + }); + + return pools; + } catch (err) { + console.error('Error fetching pools', err); + throw err; + } + } + + commonVaultFilter(poolName: string) { + const supportedPools = [ + 'ETH/USDC', + 'STRK/USDC', + 'STRK/ETH', + 'USDC/USDT', + 'USDC', + 'USDT', + 'ETH', + 'STRK', + ]; + console.log('filter2', poolName, supportedPools.includes(poolName)); + // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); + return supportedPools.includes(poolName); + } + + getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { + let rewardAPY: number = 0; + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + const metadata: PoolMetadata | null = null; + + if (data.isSuccess) { + const poolName = p.pool.name; + + const { + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + } = data.data; + + const strkToken = tokens.find((t) => t.symbol === 'STRK'); + + const pools = pairData.topPairs + .map((p) => { + const t0 = BigInt(p.token0); + const t1 = BigInt(p.token1); + 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); + if (!token1 || token1.hidden) return; + + const springPair = defiSpringData.pairs.find( + (pair) => + BigInt(pair.token0.l2_token_address) === t0 && + BigInt(pair.token1.l2_token_address) === t1, + ); + + const price0 = + token0.symbol === 'USDC' + ? 1 + : getPrice({ + t: t0, + pricesETH, + pricesUSDC, + pricesSTRK, + priceOfEth, + priceOfStrk, + }); + const price1 = + token1.symbol === 'USDC' + ? 1 + : getPrice({ + t: t1, + pricesETH, + pricesUSDC, + pricesSTRK, + priceOfEth, + priceOfStrk, + }); + const tvlUsd = + ((price0 ?? 0) * Number(p.tvl0_total)) / + Math.pow(10, token0.decimals) + + ((price1 ?? 0) * Number(p.tvl1_total)) / + Math.pow(10, token1.decimals); + + if (tvlUsd < 10000) return; + const feesUsd = + ((price0 ?? 0) * Number(p.fees0_24h)) / + Math.pow(10, token0.decimals) + + ((price1 ?? 0) * Number(p.fees1_24h)) / + Math.pow(10, token1.decimals); + + const apyBase = (feesUsd * 365) / tvlUsd; + const apyReward = springPair ? springPair.currentApr : undefined; + + return { + pool: `${token0.symbol}/${token1.symbol}`, + symbol: `${token0.symbol}/${token1.symbol}`, + rewardTokens: + apyReward && strkToken ? [strkToken.l2_token_address] : [], + underlyingTokens: [ + token0.l2_token_address, + token1.l2_token_address, + ], + tvlUsd, + apyBase, + apyReward, + }; + }) + .filter((p) => !!p) + .sort((a, b) => b.tvlUsd - a.tvlUsd); + + const pool = pools.find((p) => p.pool === poolName); + + baseAPY = pool ? pool.apyBase : 0; + rewardAPY = pool && pool.apyReward ? pool.apyReward : 0; + + splitApr = { + apr: baseAPY, + title: 'Base APR', + description: 'Subject to position range', + }; + } + + return { + baseAPY, + rewardAPY, + splitApr, + metadata, + }; + } +} + +const getPrice = ({ + t, + pricesUSDC, + pricesETH, + pricesSTRK, + priceOfEth, + priceOfStrk, +}: { + t: bigint; + pricesUSDC: PricesOfToken; + pricesETH: PricesOfToken; + pricesSTRK: PricesOfToken; + priceOfEth: PriceOfToken; + priceOfStrk: PriceOfToken; +}) => { + let p = pricesUSDC.prices.find(({ token }) => BigInt(token) === t); + if (p) return Number(p.price); + p = pricesETH.prices.find(({ token }) => BigInt(token) === t); + if (p && priceOfEth) { + return Number(p.price) * Number(priceOfEth.price); + } + p = pricesSTRK.prices.find(({ token }) => BigInt(token) === t); + if (p && priceOfStrk) { + return Number(p.price) * Number(priceOfStrk); + } +}; + +const getData = async (): Promise => { + const [ + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + ] = await Promise.all([ + fetch(`${CONSTANTS.EKUBO.BASE_API}/tokens`).then((response) => + response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/defi-spring-incentives`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/overview/pairs`).then((response) => + response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/USDC?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK/USDC?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH/USDC?period=21600`).then( + (response) => response.json(), + ), + ]); + + return { + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + }; +}; + +export const ekubo = new Ekubo(); +const EkuboAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['ekubo_base_aprs'], + queryFn: async ({ queryKey }) => { + return await getData(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkDexIncentivesAtom); + const empty: PoolInfo[] = []; + if (!EkuboAtoms.baseAPRs) return empty; + const baseInfo = get(EkuboAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = ekubo._computePoolsInfo([poolsInfo.data, baseInfo]); + return ekubo.addBaseAPYs(pools, baseInfo); + } + + return empty; + }), +}; +export default EkuboAtoms; diff --git a/src/store/haiko.store.ts b/src/store/haiko.store.ts old mode 100644 new mode 100755 diff --git a/src/store/hashstack.store.ts b/src/store/hashstack.store.ts old mode 100644 new mode 100755 index 19203a5..f36040e --- a/src/store/hashstack.store.ts +++ b/src/store/hashstack.store.ts @@ -1,97 +1,97 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { - Category, - PoolInfo, - PoolType, - ProtocolAtoms, - StrkLendingIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { IDapp } from './IDapp.store'; -import { LendingSpace } from './lending.base'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; - -export class Hashstack extends IDapp { - name = 'Hashstack'; - link = 'https://app.hashstack.finance/'; - logo = 'https://app.hashstack.finance/favicon-32x32.png'; - - incentiveDataKey = 'Hashstack'; - SUPPLY_FACTOR = 0.7; - _computePoolsInfo(data: any) { - const myData = data[this.incentiveDataKey]; - if (!myData) return []; - const pools: PoolInfo[] = []; - Object.keys(myData) - .filter(this.commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - if (arr.length === 0) return; - - let category = Category.Others; - if (['USDC', 'USDT'].includes(poolName)) { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const logo1 = CONSTANTS.LOGOS[poolName]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, - tvl: arr[arr.length - 1].supply_usd, - aprSplits: [ - { - apr: 0, - title: 'Base APR', - description: 'Shown soon', - }, - { - apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.Lending, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } -} - -export const hashstack = new Hashstack(); -const HashstackAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return hashstack._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; -export default HashstackAtoms; +import CONSTANTS, { TokenName } from '@/constants'; +import { + Category, + PoolInfo, + PoolType, + ProtocolAtoms, + StrkLendingIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { IDapp } from './IDapp.store'; +import { LendingSpace } from './lending.base'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; + +export class Hashstack extends IDapp { + name = 'Hashstack'; + link = 'https://app.hashstack.finance/'; + logo = 'https://app.hashstack.finance/favicon-32x32.png'; + + incentiveDataKey = 'Hashstack'; + SUPPLY_FACTOR = 0.7; + _computePoolsInfo(data: any) { + const myData = data[this.incentiveDataKey]; + if (!myData) return []; + const pools: PoolInfo[] = []; + Object.keys(myData) + .filter(this.commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + if (arr.length === 0) return; + + let category = Category.Others; + if (['USDC', 'USDT'].includes(poolName)) { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const logo1 = CONSTANTS.LOGOS[poolName]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, + tvl: arr[arr.length - 1].supply_usd, + aprSplits: [ + { + apr: 0, + title: 'Base APR', + description: 'Shown soon', + }, + { + apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.Lending, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } +} + +export const hashstack = new Hashstack(); +const HashstackAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return hashstack._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; +export default HashstackAtoms; diff --git a/src/store/jedi.store.ts b/src/store/jedi.store.ts old mode 100644 new mode 100755 diff --git a/src/store/lending.base.ts b/src/store/lending.base.ts old mode 100644 new mode 100755 index 1e4921c..52f4001 --- a/src/store/lending.base.ts +++ b/src/store/lending.base.ts @@ -1,164 +1,164 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { APRSplit, Category, PoolInfo, PoolMetadata, PoolType } from './pools'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { StrategyAction } from '@/strategies/IStrategy'; - -export namespace LendingSpace { - export interface MyBaseAprDoc { - token: { - decimals: number; - name: string; - symbol: TokenName; - }; - lending_apy: { - net_apy: number; - raw_apy: number; - reward_apy: number; - }; - price: { - decimals: number; - price: string; // "0x554a969a1e", - quote_currency: string; // USD - }; - borrowing_apy: { - net_apy: number; //0.023549914360046387, - raw_apy: number; // 0.023549914360046387, - reward_apy: number; // null - }; - borrow_factor: { - decimals: number; // 27 - value: string; // "0x33b2e3c9fd0803ce8000000" - }; - collateral_factor: { - decimals: number; //27, - value: string; // "0x295be96e640669720000000" - }; - // ... has other data, not relevant - } - - export function computePoolsInfo( - data: any, - incentiveDataKey: string, - info: { - name: string; - link: string; - logo: string; - }, - commonVaultFilter: (poolName: string) => boolean, - ) { - const myData = data[incentiveDataKey]; - if (!myData) return []; - const pools: PoolInfo[] = []; - Object.keys(myData) - .filter(commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - if (arr.length === 0) return; - - let category = Category.Others; - if (['USDC', 'USDT'].includes(poolName)) { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const logo1 = CONSTANTS.LOGOS[poolName]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1], - }, - protocol: { - name: info.name, - link: info.link, - logo: info.logo, - }, - apr: arr[arr.length - 1].strk_grant_apr_nrs, - tvl: arr[arr.length - 1].supply_usd, - aprSplits: [ - { - apr: arr[arr.length - 1].strk_grant_apr_nrs, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.Lending, - borrow: { - apr: 0, - borrowFactor: 0, - }, - lending: { - collateralFactor: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } - - export function getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - let metadata: PoolMetadata | null = null; - if (data.isSuccess) { - const item = data.data.find((doc) => doc.token.symbol === p.pool.name); - if (item) { - baseAPY = item.lending_apy.raw_apy; - splitApr = { - apr: baseAPY, - title: 'Base APY', - description: '', - }; - metadata = { - borrow: { - apr: item.borrowing_apy.net_apy, - borrowFactor: - parseInt(item.borrow_factor.value, 10) / - 10 ** item.borrow_factor.decimals, - }, - lending: { - collateralFactor: - parseInt(item.collateral_factor.value, 10) / - 10 ** item.collateral_factor.decimals, - }, - }; - } - } - return { - baseAPY, - splitApr, - metadata, - }; - } - - export function getHF( - positions: StrategyAction[], - LIQUIDATION_THRESHOLD: number, - ) { - // * HF = Sum(Collateral_usd * col_factor) / Sum(debt_usd/debt_factor); - let numerator = 0; - let denominator = 0; - positions.map((p) => { - // ! TODO To update math using bignumber and decimals - if (p.isDeposit) { - numerator += - Number(p.amount.toString()) * p.pool.lending.collateralFactor; - } else { - denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; - } - }); - - let hf = Number.MAX_SAFE_INTEGER; // if not debt, i.e. denominator 0; - if (denominator !== 0) { - hf = numerator / denominator; - } - - return { hf, isLiquidable: hf <= LIQUIDATION_THRESHOLD }; - } -} +import CONSTANTS, { TokenName } from '@/constants'; +import { APRSplit, Category, PoolInfo, PoolMetadata, PoolType } from './pools'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { StrategyAction } from '@/strategies/IStrategy'; + +export namespace LendingSpace { + export interface MyBaseAprDoc { + token: { + decimals: number; + name: string; + symbol: TokenName; + }; + lending_apy: { + net_apy: number; + raw_apy: number; + reward_apy: number; + }; + price: { + decimals: number; + price: string; // "0x554a969a1e", + quote_currency: string; // USD + }; + borrowing_apy: { + net_apy: number; //0.023549914360046387, + raw_apy: number; // 0.023549914360046387, + reward_apy: number; // null + }; + borrow_factor: { + decimals: number; // 27 + value: string; // "0x33b2e3c9fd0803ce8000000" + }; + collateral_factor: { + decimals: number; //27, + value: string; // "0x295be96e640669720000000" + }; + // ... has other data, not relevant + } + + export function computePoolsInfo( + data: any, + incentiveDataKey: string, + info: { + name: string; + link: string; + logo: string; + }, + commonVaultFilter: (poolName: string) => boolean, + ) { + const myData = data[incentiveDataKey]; + if (!myData) return []; + const pools: PoolInfo[] = []; + Object.keys(myData) + .filter(commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + if (arr.length === 0) return; + + let category = Category.Others; + if (['USDC', 'USDT'].includes(poolName)) { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const logo1 = CONSTANTS.LOGOS[poolName]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1], + }, + protocol: { + name: info.name, + link: info.link, + logo: info.logo, + }, + apr: arr[arr.length - 1].strk_grant_apr_nrs, + tvl: arr[arr.length - 1].supply_usd, + aprSplits: [ + { + apr: arr[arr.length - 1].strk_grant_apr_nrs, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.Lending, + borrow: { + apr: 0, + borrowFactor: 0, + }, + lending: { + collateralFactor: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } + + export function getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + let metadata: PoolMetadata | null = null; + if (data.isSuccess) { + const item = data.data.find((doc) => doc.token.symbol === p.pool.name); + if (item) { + baseAPY = item.lending_apy.raw_apy; + splitApr = { + apr: baseAPY, + title: 'Base APY', + description: '', + }; + metadata = { + borrow: { + apr: item.borrowing_apy.net_apy, + borrowFactor: + parseInt(item.borrow_factor.value, 10) / + 10 ** item.borrow_factor.decimals, + }, + lending: { + collateralFactor: + parseInt(item.collateral_factor.value, 10) / + 10 ** item.collateral_factor.decimals, + }, + }; + } + } + return { + baseAPY, + splitApr, + metadata, + }; + } + + export function getHF( + positions: StrategyAction[], + LIQUIDATION_THRESHOLD: number, + ) { + // * HF = Sum(Collateral_usd * col_factor) / Sum(debt_usd/debt_factor); + let numerator = 0; + let denominator = 0; + positions.map((p) => { + // ! TODO To update math using bignumber and decimals + if (p.isDeposit) { + numerator += + Number(p.amount.toString()) * p.pool.lending.collateralFactor; + } else { + denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; + } + }); + + let hf = Number.MAX_SAFE_INTEGER; // if not debt, i.e. denominator 0; + if (denominator !== 0) { + hf = numerator / denominator; + } + + return { hf, isLiquidable: hf <= LIQUIDATION_THRESHOLD }; + } +} diff --git a/src/store/myswap.store.ts b/src/store/myswap.store.ts old mode 100644 new mode 100755 diff --git a/src/store/nimbora.store.ts b/src/store/nimbora.store.ts old mode 100644 new mode 100755 index e98e163..3ad14a0 --- a/src/store/nimbora.store.ts +++ b/src/store/nimbora.store.ts @@ -1,45 +1,45 @@ -import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { LendingSpace } from './lending.base'; -import { IDapp } from './IDapp.store'; - -export class Nimbora extends IDapp { - name = 'Nimbora'; - link = 'https://app.nimbora.io/'; - logo = - 'https://assets-global.website-files.com/64f0518cbb38bb59ddd7a331/64f1ea84a753c1ed93b2c920_faviconn.png'; - - incentiveDataKey = 'Nimbora'; - - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } -} - -export const nimbora = new Nimbora(); -const NimboraAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return nimbora._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; -export default NimboraAtoms; +import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { LendingSpace } from './lending.base'; +import { IDapp } from './IDapp.store'; + +export class Nimbora extends IDapp { + name = 'Nimbora'; + link = 'https://app.nimbora.io/'; + logo = + 'https://assets-global.website-files.com/64f0518cbb38bb59ddd7a331/64f1ea84a753c1ed93b2c920_faviconn.png'; + + incentiveDataKey = 'Nimbora'; + + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } +} + +export const nimbora = new Nimbora(); +const NimboraAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return nimbora._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; +export default NimboraAtoms; diff --git a/src/store/nostradegen.store.ts b/src/store/nostradegen.store.ts old mode 100644 new mode 100755 diff --git a/src/store/nostradex.store.ts b/src/store/nostradex.store.ts old mode 100644 new mode 100755 diff --git a/src/store/nostralending.store.ts b/src/store/nostralending.store.ts old mode 100644 new mode 100755 index 98823e0..8159a80 --- a/src/store/nostralending.store.ts +++ b/src/store/nostralending.store.ts @@ -1,156 +1,156 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { - APRSplit, - PoolInfo, - PoolMetadata, - ProtocolAtoms, - StrkLendingIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { LendingSpace } from './lending.base'; -import { IDapp } from './IDapp.store'; - -interface MyBaseAprDoc { - _id: string; - id: string; - asset: TokenName; - block: number; - borrowingApy: string; - // borrowingIndex: string, - lendingApy: string; - // "lendingIndex": "1022796136817729881", - timestamp: number; -} - -interface NostraPoolFactor { - asset: string; - dToken: string; - borrowFactor: number; - collateralFactor: number; -} - -// ! to remove hard coding later -const PoolAddresses: { [token: string]: NostraPoolFactor } = { - USDC: { - asset: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', - dToken: - '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', - borrowFactor: 0.95, - collateralFactor: 0.8, - }, - STRK: { - asset: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - dToken: - '0x001258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947', - borrowFactor: 0.8, - collateralFactor: 0.6, - }, - ETH: { - asset: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', - dToken: - '0x00ba3037d968790ac486f70acaa9a1cab10cf5843bb85c986624b4d0e5a82e74', - borrowFactor: 0.9, - collateralFactor: 0.8, - }, - USDT: { - asset: '0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', - dToken: - '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', - borrowFactor: 0.95, - collateralFactor: 0.8, - }, -}; - -export class NostraLending extends IDapp { - name = 'Nostra Money Markets'; - link = 'https://app.nostra.finance/'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/nostra/logo_dark.jpg'; - - incentiveDataKey = 'Nostra'; - - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - let metadata: PoolMetadata | null = null; - if (data.isSuccess) { - const items: { - documents: MyBaseAprDoc[]; - } = data.data; - const item = items.documents.find((doc) => doc.asset === p.pool.name); - if (item) { - baseAPY = Number(item.lendingApy) / 10 ** 18; - splitApr = { - apr: baseAPY, - title: 'Base APY', - description: '', - }; - metadata = { - borrow: { - apr: Number(item.borrowingApy) / 10 ** 18, - borrowFactor: PoolAddresses[p.pool.name].borrowFactor, - }, - lending: { - collateralFactor: PoolAddresses[p.pool.name].collateralFactor, - }, - }; - } - } - return { - baseAPY, - splitApr, - metadata, - }; - } -} - -export const nostraLending = new NostraLending(); -const NostraLendingAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['nostra_lending_base_aprs'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.NOSTRA.LENDING_GRAPH_URL, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - dataSource: 'nostra-production', - database: 'prod-a-nostra-db', - collection: 'apyStats', - filter: { timestamp: { $gte: 1697500800 } }, - sort: { timestamp: -1 }, - }), - }); - return res.json(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (!NostraLendingAtoms.baseAPRs) return empty; - - const baseInfo = get(NostraLendingAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = nostraLending._computePoolsInfo(poolsInfo.data); - return nostraLending.addBaseAPYs(pools, baseInfo); - } - return empty; - }), -}; -export default NostraLendingAtoms; +import CONSTANTS, { TokenName } from '@/constants'; +import { + APRSplit, + PoolInfo, + PoolMetadata, + ProtocolAtoms, + StrkLendingIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { LendingSpace } from './lending.base'; +import { IDapp } from './IDapp.store'; + +interface MyBaseAprDoc { + _id: string; + id: string; + asset: TokenName; + block: number; + borrowingApy: string; + // borrowingIndex: string, + lendingApy: string; + // "lendingIndex": "1022796136817729881", + timestamp: number; +} + +interface NostraPoolFactor { + asset: string; + dToken: string; + borrowFactor: number; + collateralFactor: number; +} + +// ! to remove hard coding later +const PoolAddresses: { [token: string]: NostraPoolFactor } = { + USDC: { + asset: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', + dToken: + '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', + borrowFactor: 0.95, + collateralFactor: 0.8, + }, + STRK: { + asset: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + dToken: + '0x001258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947', + borrowFactor: 0.8, + collateralFactor: 0.6, + }, + ETH: { + asset: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', + dToken: + '0x00ba3037d968790ac486f70acaa9a1cab10cf5843bb85c986624b4d0e5a82e74', + borrowFactor: 0.9, + collateralFactor: 0.8, + }, + USDT: { + asset: '0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', + dToken: + '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', + borrowFactor: 0.95, + collateralFactor: 0.8, + }, +}; + +export class NostraLending extends IDapp { + name = 'Nostra Money Markets'; + link = 'https://app.nostra.finance/'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/nostra/logo_dark.jpg'; + + incentiveDataKey = 'Nostra'; + + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + let metadata: PoolMetadata | null = null; + if (data.isSuccess) { + const items: { + documents: MyBaseAprDoc[]; + } = data.data; + const item = items.documents.find((doc) => doc.asset === p.pool.name); + if (item) { + baseAPY = Number(item.lendingApy) / 10 ** 18; + splitApr = { + apr: baseAPY, + title: 'Base APY', + description: '', + }; + metadata = { + borrow: { + apr: Number(item.borrowingApy) / 10 ** 18, + borrowFactor: PoolAddresses[p.pool.name].borrowFactor, + }, + lending: { + collateralFactor: PoolAddresses[p.pool.name].collateralFactor, + }, + }; + } + } + return { + baseAPY, + splitApr, + metadata, + }; + } +} + +export const nostraLending = new NostraLending(); +const NostraLendingAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['nostra_lending_base_aprs'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.NOSTRA.LENDING_GRAPH_URL, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + dataSource: 'nostra-production', + database: 'prod-a-nostra-db', + collection: 'apyStats', + filter: { timestamp: { $gte: 1697500800 } }, + sort: { timestamp: -1 }, + }), + }); + return res.json(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (!NostraLendingAtoms.baseAPRs) return empty; + + const baseInfo = get(NostraLendingAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = nostraLending._computePoolsInfo(poolsInfo.data); + return nostraLending.addBaseAPYs(pools, baseInfo); + } + return empty; + }), +}; +export default NostraLendingAtoms; diff --git a/src/store/pools.ts b/src/store/pools.ts old mode 100644 new mode 100755 index 9c9b5d3..8858f80 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -1,271 +1,271 @@ -import CONSTANTS from '@/constants'; -import { Atom, atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import EkuboAtoms, { ekubo } from './ekobu.store'; -import HaikoAtoms, { haiko } from './haiko.store'; -import HashstackAtoms, { hashstack } from './hashstack.store'; -import JediAtoms, { jedi } from './jedi.store'; -import MySwapAtoms, { mySwap } from './myswap.store'; -import NimboraAtoms, { nimbora } from './nimbora.store'; -import NostraDexAtoms, { nostraDex } from './nostradex.store'; -import NostraDegenAtoms, { nostraDegen } from './nostradegen.store'; -import NostraLendingAtoms, { nostraLending } from './nostralending.store'; -import SithswapAtoms, { sithswap } from './sithswap.store'; -import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; -import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; -import ZkLendAtoms, { zkLend } from './zklend.store'; -import CarmineAtoms, { carmine } from './carmine.store'; - -export enum Category { - Stable = 'Stable Pools', - STRK = 'STRK Pools', - Degen = 'MetaStable Pools', - Others = 'Others', -} - -export enum PoolType { - DEXV2 = 'V2 LP DEX', - DEXV3 = 'Concentrated LP DEX', - Lending = 'Lending', - Derivatives = 'Derivatives', -} - -export interface APRSplit { - apr: number | 'Err'; - title: string; - description: string; -} - -export interface PoolMetadata { - borrow: { - apr: number; - borrowFactor: number; - }; - lending: { - collateralFactor: number; - }; -} - -export interface PoolInfo extends PoolMetadata { - pool: { - name: string; - logos: string[]; - }; - protocol: { - name: string; - link: string; - logo: string; - }; - tvl: number; - apr: number; // not in % - aprSplits: APRSplit[]; - category: Category; - type: PoolType; - isLoading?: boolean; -} - -export interface ProtocolAtoms { - pools: Atom; - baseAPRs?: Atom>; -} - -export const PROTOCOLS = [ - { - name: ekubo.name, - class: ekubo, - atoms: EkuboAtoms, - }, - { - name: jedi.name, - 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, - atoms: NostraDexAtoms, - }, - { - name: nostraDegen.name, - class: nostraDegen, - atoms: NostraDegenAtoms, - }, - { - name: carmine.name, - class: carmine, - atoms: CarmineAtoms, - }, - { - name: starkDefi.name, - class: starkDefi, - atoms: StarkDefiAtoms, - }, - { - name: sithswap.name, - 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: nimbora.name, - class: nimbora, - atoms: NimboraAtoms, - }, -]; - -export const StrkDexIncentivesAtom = atomWithQuery((get) => ({ - queryKey: ['strk_dex_incentives'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.DEX_INCENTIVE_URL); // common for all - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }, -})); - -export const StrkIncentivesAtom = atomWithQuery((get) => ({ - queryKey: get(StrkIncentivesQueryKeyAtom), - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.NOSTRA_DEGEN_INCENTIVE_URL); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - const parsedData = JSON.parse(data); - - if (queryKey[1] === 'isNostraDex') { - // Filter the data to include only the specific nostra dex pools we are tracking - return Object.values(parsedData).filter((item: any) => { - const id = item.id; - return id === 'ETH-USDC' || id === 'STRK-ETH' || id === 'STRK-USDC'; - }); - } - return parsedData; - }, -})); - -export const StrkIncentivesQueryKeyAtom = atom([ - 'strk_incentives', - 'isNostraDegen', -]); - -export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ - queryKey: ['strk_lending_incentives'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.LENDING_INCENTIVES_URL); // common for all - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }, -})); - -export const ALL_FILTER = 'All'; -export const filters = { - categories: [...Object.values(Category)], - types: [...Object.values(PoolType)], - protocols: [...PROTOCOLS.map((p) => p.name)], -}; - -export const filterAtoms = { - categoriesAtom: atom([ALL_FILTER]), - typesAtom: atom([ALL_FILTER]), - protocolsAtom: atom([ALL_FILTER]), -}; - -export const updateFiltersAtom = atom( - null, - ( - get, - set, - type: 'categories' | 'poolTypes' | 'protocols', - newOptions: string[], - ) => { - if (type === 'categories') { - set(filterAtoms.categoriesAtom, newOptions); - } else if (type === 'poolTypes') { - set(filterAtoms.typesAtom, newOptions); - } else if (type === 'protocols') { - set(filterAtoms.protocolsAtom, newOptions); - } - }, -); - -export const allPoolsAtomUnSorted = atom((get) => { - const pools: PoolInfo[] = []; - return PROTOCOLS.reduce( - (_pools, p) => _pools.concat(get(p.atoms.pools)), - pools, - ); -}); - -// const allPoolsAtom = atom([]); - -const SORT_OPTIONS = ['APR', 'TVL']; - -export const sortAtom = atom(SORT_OPTIONS[0]); - -export const sortPoolsAtom = atom((get) => { - const pools = get(allPoolsAtomUnSorted); - console.log('pre sort', pools); - const sortOption = get(sortAtom); - pools.sort((a, b) => { - if (sortOption === SORT_OPTIONS[1]) { - return b.tvl - a.tvl; - } - return b.apr - a.apr; - }); - return pools; -}); - -export const filteredPools = atom((get) => { - const pools = get(sortPoolsAtom); - const categories = get(filterAtoms.categoriesAtom); - const types = get(filterAtoms.typesAtom); - const protocols = get(filterAtoms.protocolsAtom); - return pools - .filter((pool) => { - // category filter - if (categories.includes(ALL_FILTER)) return true; - if (categories.includes(pool.category.valueOf())) return true; - return false; - }) - .filter((pool) => { - // type filter - if (types.includes(ALL_FILTER)) return true; - if (types.includes(pool.type.valueOf())) return true; - return false; - }) - .filter((pool) => { - // protocol filter - if (protocols.includes(ALL_FILTER)) return true; - if (protocols.includes(pool.protocol.name)) return true; - return false; - }); -}); +import CONSTANTS from '@/constants'; +import { Atom, atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import EkuboAtoms, { ekubo } from './ekobu.store'; +import HaikoAtoms, { haiko } from './haiko.store'; +import HashstackAtoms, { hashstack } from './hashstack.store'; +import JediAtoms, { jedi } from './jedi.store'; +import MySwapAtoms, { mySwap } from './myswap.store'; +import NimboraAtoms, { nimbora } from './nimbora.store'; +import NostraDexAtoms, { nostraDex } from './nostradex.store'; +import NostraDegenAtoms, { nostraDegen } from './nostradegen.store'; +import NostraLendingAtoms, { nostraLending } from './nostralending.store'; +import SithswapAtoms, { sithswap } from './sithswap.store'; +import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; +import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; +import ZkLendAtoms, { zkLend } from './zklend.store'; +import CarmineAtoms, { carmine } from './carmine.store'; + +export enum Category { + Stable = 'Stable Pools', + STRK = 'STRK Pools', + Degen = 'MetaStable Pools', + Others = 'Others', +} + +export enum PoolType { + DEXV2 = 'V2 LP DEX', + DEXV3 = 'Concentrated LP DEX', + Lending = 'Lending', + Derivatives = 'Derivatives', +} + +export interface APRSplit { + apr: number | 'Err'; + title: string; + description: string; +} + +export interface PoolMetadata { + borrow: { + apr: number; + borrowFactor: number; + }; + lending: { + collateralFactor: number; + }; +} + +export interface PoolInfo extends PoolMetadata { + pool: { + name: string; + logos: string[]; + }; + protocol: { + name: string; + link: string; + logo: string; + }; + tvl: number; + apr: number; // not in % + aprSplits: APRSplit[]; + category: Category; + type: PoolType; + isLoading?: boolean; +} + +export interface ProtocolAtoms { + pools: Atom; + baseAPRs?: Atom>; +} + +export const PROTOCOLS = [ + { + name: ekubo.name, + class: ekubo, + atoms: EkuboAtoms, + }, + { + name: jedi.name, + 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, + atoms: NostraDexAtoms, + }, + { + name: nostraDegen.name, + class: nostraDegen, + atoms: NostraDegenAtoms, + }, + { + name: carmine.name, + class: carmine, + atoms: CarmineAtoms, + }, + { + name: starkDefi.name, + class: starkDefi, + atoms: StarkDefiAtoms, + }, + { + name: sithswap.name, + 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: nimbora.name, + class: nimbora, + atoms: NimboraAtoms, + }, +]; + +export const StrkDexIncentivesAtom = atomWithQuery((get) => ({ + queryKey: ['strk_dex_incentives'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.DEX_INCENTIVE_URL); // common for all + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }, +})); + +export const StrkIncentivesAtom = atomWithQuery((get) => ({ + queryKey: get(StrkIncentivesQueryKeyAtom), + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.NOSTRA_DEGEN_INCENTIVE_URL); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + const parsedData = JSON.parse(data); + + if (queryKey[1] === 'isNostraDex') { + // Filter the data to include only the specific nostra dex pools we are tracking + return Object.values(parsedData).filter((item: any) => { + const id = item.id; + return id === 'ETH-USDC' || id === 'STRK-ETH' || id === 'STRK-USDC'; + }); + } + return parsedData; + }, +})); + +export const StrkIncentivesQueryKeyAtom = atom([ + 'strk_incentives', + 'isNostraDegen', +]); + +export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ + queryKey: ['strk_lending_incentives'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.LENDING_INCENTIVES_URL); // common for all + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }, +})); + +export const ALL_FILTER = 'All'; +export const filters = { + categories: [...Object.values(Category)], + types: [...Object.values(PoolType)], + protocols: [...PROTOCOLS.map((p) => p.name)], +}; + +export const filterAtoms = { + categoriesAtom: atom([ALL_FILTER]), + typesAtom: atom([ALL_FILTER]), + protocolsAtom: atom([ALL_FILTER]), +}; + +export const updateFiltersAtom = atom( + null, + ( + get, + set, + type: 'categories' | 'poolTypes' | 'protocols', + newOptions: string[], + ) => { + if (type === 'categories') { + set(filterAtoms.categoriesAtom, newOptions); + } else if (type === 'poolTypes') { + set(filterAtoms.typesAtom, newOptions); + } else if (type === 'protocols') { + set(filterAtoms.protocolsAtom, newOptions); + } + }, +); + +export const allPoolsAtomUnSorted = atom((get) => { + const pools: PoolInfo[] = []; + return PROTOCOLS.reduce( + (_pools, p) => _pools.concat(get(p.atoms.pools)), + pools, + ); +}); + +// const allPoolsAtom = atom([]); + +const SORT_OPTIONS = ['APR', 'TVL']; + +export const sortAtom = atom(SORT_OPTIONS[0]); + +export const sortPoolsAtom = atom((get) => { + const pools = get(allPoolsAtomUnSorted); + console.log('pre sort', pools); + const sortOption = get(sortAtom); + pools.sort((a, b) => { + if (sortOption === SORT_OPTIONS[1]) { + return b.tvl - a.tvl; + } + return b.apr - a.apr; + }); + return pools; +}); + +export const filteredPools = atom((get) => { + const pools = get(sortPoolsAtom); + const categories = get(filterAtoms.categoriesAtom); + const types = get(filterAtoms.typesAtom); + const protocols = get(filterAtoms.protocolsAtom); + return pools + .filter((pool) => { + // category filter + if (categories.includes(ALL_FILTER)) return true; + if (categories.includes(pool.category.valueOf())) return true; + return false; + }) + .filter((pool) => { + // type filter + if (types.includes(ALL_FILTER)) return true; + if (types.includes(pool.type.valueOf())) return true; + return false; + }) + .filter((pool) => { + // protocol filter + if (protocols.includes(ALL_FILTER)) return true; + if (protocols.includes(pool.protocol.name)) return true; + return false; + }); +}); diff --git a/src/store/sithswap.store.ts b/src/store/sithswap.store.ts old mode 100644 new mode 100755 diff --git a/src/store/starkdefi.store.ts b/src/store/starkdefi.store.ts old mode 100644 new mode 100755 diff --git a/src/store/strategies.atoms.ts b/src/store/strategies.atoms.ts old mode 100644 new mode 100755 index 0b07017..c507435 --- a/src/store/strategies.atoms.ts +++ b/src/store/strategies.atoms.ts @@ -1,126 +1,126 @@ -import { atom } from 'jotai'; -import { allPoolsAtomUnSorted } from './pools'; -import { AutoTokenStrategy } from '@/strategies/auto_strk.strat'; -import { - IStrategy, - IStrategyProps, - StrategyLiveStatus, -} from '@/strategies/IStrategy'; -import CONSTANTS from '@/constants'; -import { DeltaNeutralMM } from '@/strategies/delta_neutral_mm'; -import Mustache from 'mustache'; -import { getTokenInfoFromName } from '@/utils'; - -export interface StrategyInfo extends IStrategyProps { - name: string; -} - -export function getStrategies() { - // const simpleStableStrat = new SimpleStableStrategy(); - const autoStrkStrategy = new AutoTokenStrategy( - 'STRK', - 'Auto Compounding STRK', - "Stake your STRK or zkLend's zSTRK token to receive DeFi Spring $STRK rewards every 14 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.", - 'zSTRK', - CONSTANTS.CONTRACTS.AutoStrkFarm, - { - maxTVL: 50000, - }, - ); - const autoUSDCStrategy = new AutoTokenStrategy( - 'USDC', - 'Auto Compounding USDC', - "Stake your USDC or zkLend's zUSDC token to receive DeFi Spring $STRK rewards every 14 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.", - 'zUSDC', - CONSTANTS.CONTRACTS.AutoUsdcFarm, - { - maxTVL: 50000, - }, - ); - - 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 usdcTokenInfo = getTokenInfoFromName('USDC'); - const deltaNeutralMMUSDCETH = new DeltaNeutralMM( - usdcTokenInfo, - 'USDC Sensei', - Mustache.render(DNMMDescription, { token1: 'USDC', token2: 'ETH' }), - 'ETH', - CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - [1, 0.615384615, 1, 0.584615385, 0.552509024], // precomputed factors based on strategy math - StrategyLiveStatus.NEW, - { - maxTVL: 50000, - }, - ); - - const deltaNeutralMMETHUSDC = new DeltaNeutralMM( - getTokenInfoFromName('ETH'), - 'ETH Sensei', - Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }), - 'USDC', - // ! change this later - CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - [1, 0.608, 1, 0.552509, 0.552509], // precomputed factors based on strategy math - StrategyLiveStatus.COMING_SOON, - { - maxTVL: 50000, - }, - ); - const deltaNeutralMMSTRKETH = new DeltaNeutralMM( - getTokenInfoFromName('STRK'), - 'STRK Sensei', - Mustache.render(DNMMDescription, { token1: 'STRK', token2: 'ETH' }), - 'ETH', - // ! change this later - 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 - StrategyLiveStatus.NEW, - { - maxTVL: 250000, - }, - ); - - const strategies: IStrategy[] = [ - autoStrkStrategy, - autoUSDCStrategy, - deltaNeutralMMUSDCETH, - deltaNeutralMMETHUSDC, - deltaNeutralMMSTRKETH, - ]; - - return strategies; -} - -export const STRATEGIES_INFO = getStrategies(); - -export const strategiesAtom = atom((get) => { - const strategies = getStrategies(); - const allPools = get(allPoolsAtomUnSorted); - const filteredPools = allPools.filter( - (p) => - p.protocol.name === 'zkLend' || - p.protocol.name === 'Nostra Money Markets', - ); - - for (const s of strategies) { - s.solve(filteredPools, '1000'); - } - - strategies.sort((a, b) => { - const status1 = getLiveStatusNumber(a.liveStatus); - const status2 = getLiveStatusNumber(b.liveStatus); - return status1 - status2 || b.netYield - a.netYield; - }); - return strategies; -}); - -function getLiveStatusNumber(status: StrategyLiveStatus) { - if (status == StrategyLiveStatus.NEW) { - return 1; - } else if (status == StrategyLiveStatus.ACTIVE) { - return 2; - } else if (status == StrategyLiveStatus.COMING_SOON) { - return 3; - } - return 4; -} +import { atom } from 'jotai'; +import { allPoolsAtomUnSorted } from './pools'; +import { AutoTokenStrategy } from '@/strategies/auto_strk.strat'; +import { + IStrategy, + IStrategyProps, + StrategyLiveStatus, +} from '@/strategies/IStrategy'; +import CONSTANTS from '@/constants'; +import { DeltaNeutralMM } from '@/strategies/delta_neutral_mm'; +import Mustache from 'mustache'; +import { getTokenInfoFromName } from '@/utils'; + +export interface StrategyInfo extends IStrategyProps { + name: string; +} + +export function getStrategies() { + // const simpleStableStrat = new SimpleStableStrategy(); + const autoStrkStrategy = new AutoTokenStrategy( + 'STRK', + 'Auto Compounding STRK', + "Stake your STRK or zkLend's zSTRK token to receive DeFi Spring $STRK rewards every 14 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.", + 'zSTRK', + CONSTANTS.CONTRACTS.AutoStrkFarm, + { + maxTVL: 50000, + }, + ); + const autoUSDCStrategy = new AutoTokenStrategy( + 'USDC', + 'Auto Compounding USDC', + "Stake your USDC or zkLend's zUSDC token to receive DeFi Spring $STRK rewards every 14 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.", + 'zUSDC', + CONSTANTS.CONTRACTS.AutoUsdcFarm, + { + maxTVL: 50000, + }, + ); + + 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 usdcTokenInfo = getTokenInfoFromName('USDC'); + const deltaNeutralMMUSDCETH = new DeltaNeutralMM( + usdcTokenInfo, + 'USDC Sensei', + Mustache.render(DNMMDescription, { token1: 'USDC', token2: 'ETH' }), + 'ETH', + CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + [1, 0.615384615, 1, 0.584615385, 0.552509024], // precomputed factors based on strategy math + StrategyLiveStatus.NEW, + { + maxTVL: 50000, + }, + ); + + const deltaNeutralMMETHUSDC = new DeltaNeutralMM( + getTokenInfoFromName('ETH'), + 'ETH Sensei', + Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }), + 'USDC', + // ! change this later + CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + [1, 0.608, 1, 0.552509, 0.552509], // precomputed factors based on strategy math + StrategyLiveStatus.COMING_SOON, + { + maxTVL: 50000, + }, + ); + const deltaNeutralMMSTRKETH = new DeltaNeutralMM( + getTokenInfoFromName('STRK'), + 'STRK Sensei', + Mustache.render(DNMMDescription, { token1: 'STRK', token2: 'ETH' }), + 'ETH', + // ! change this later + 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 + StrategyLiveStatus.NEW, + { + maxTVL: 250000, + }, + ); + + const strategies: IStrategy[] = [ + autoStrkStrategy, + autoUSDCStrategy, + deltaNeutralMMUSDCETH, + deltaNeutralMMETHUSDC, + deltaNeutralMMSTRKETH, + ]; + + return strategies; +} + +export const STRATEGIES_INFO = getStrategies(); + +export const strategiesAtom = atom((get) => { + const strategies = getStrategies(); + const allPools = get(allPoolsAtomUnSorted); + const filteredPools = allPools.filter( + (p) => + p.protocol.name === 'zkLend' || + p.protocol.name === 'Nostra Money Markets', + ); + + for (const s of strategies) { + s.solve(filteredPools, '1000'); + } + + strategies.sort((a, b) => { + const status1 = getLiveStatusNumber(a.liveStatus); + const status2 = getLiveStatusNumber(b.liveStatus); + return status1 - status2 || b.netYield - a.netYield; + }); + return strategies; +}); + +function getLiveStatusNumber(status: StrategyLiveStatus) { + if (status == StrategyLiveStatus.NEW) { + return 1; + } else if (status == StrategyLiveStatus.ACTIVE) { + return 2; + } else if (status == StrategyLiveStatus.COMING_SOON) { + return 3; + } + return 4; +} diff --git a/src/store/tenkswap.store.ts b/src/store/tenkswap.store.ts old mode 100644 new mode 100755 diff --git a/src/store/transactions.atom.ts b/src/store/transactions.atom.ts old mode 100644 new mode 100755 diff --git a/src/store/utils.atoms.ts b/src/store/utils.atoms.ts old mode 100644 new mode 100755 diff --git a/src/store/zklend.store.ts b/src/store/zklend.store.ts old mode 100644 new mode 100755 index 043aaae..deb87c9 --- a/src/store/zklend.store.ts +++ b/src/store/zklend.store.ts @@ -1,90 +1,90 @@ -'use client'; - -import CONSTANTS from '@/constants'; -import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { IDapp } from './IDapp.store'; -import { StrategyAction } from '@/strategies/IStrategy'; -import { LendingSpace } from './lending.base'; -const fetcher = (...args: any[]) => { - return fetch(args[0], args[1]).then((res) => res.json()); -}; - -export class ZkLend extends IDapp { - name = 'zkLend'; - link = 'https://app.zklend.com/markets'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/zkLend/logo_dark.png'; - - incentiveDataKey = 'zkLend'; - LIQUIDATION_THRESHOLD = 1; - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } - - // ! To consider price of tokens later. used for stables only for now. - getHF(positions: StrategyAction[]) { - return LendingSpace.getHF(positions, this.LIQUIDATION_THRESHOLD); - } - - // Returns the maximum debt that can be taken out incl. the factor. - getMaxFactoredOut(positions: StrategyAction[], minHf: number) { - let numerator = 0; - let denominator = 0; - positions.map((p) => { - // ! TODO To update math using bignumber and decimals - if (p.isDeposit) { - numerator += - Number(p.amount.toString()) * p.pool.lending.collateralFactor; - } else { - denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; - } - }); - - // HF = (numerator) / (denominator + factoredAmount) - // whre factoredAmount = (Amount of new Debt / debt factor) - const factoredAmount = numerator / minHf - denominator; - if (factoredAmount < 0) return 0; - return factoredAmount; - } -} - -export const zkLend = new ZkLend(); -const ZkLendAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['zklend_lending_base_aprs'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.ZKLEND.BASE_APR_API); - return res.json(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (!ZkLendAtoms.baseAPRs) return empty; - const baseInfo = get(ZkLendAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = zkLend._computePoolsInfo(poolsInfo.data); - return zkLend.addBaseAPYs(pools, baseInfo); - } - return empty; - }), -}; -export default ZkLendAtoms; +'use client'; + +import CONSTANTS from '@/constants'; +import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { IDapp } from './IDapp.store'; +import { StrategyAction } from '@/strategies/IStrategy'; +import { LendingSpace } from './lending.base'; +const fetcher = (...args: any[]) => { + return fetch(args[0], args[1]).then((res) => res.json()); +}; + +export class ZkLend extends IDapp { + name = 'zkLend'; + link = 'https://app.zklend.com/markets'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/zkLend/logo_dark.png'; + + incentiveDataKey = 'zkLend'; + LIQUIDATION_THRESHOLD = 1; + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } + + // ! To consider price of tokens later. used for stables only for now. + getHF(positions: StrategyAction[]) { + return LendingSpace.getHF(positions, this.LIQUIDATION_THRESHOLD); + } + + // Returns the maximum debt that can be taken out incl. the factor. + getMaxFactoredOut(positions: StrategyAction[], minHf: number) { + let numerator = 0; + let denominator = 0; + positions.map((p) => { + // ! TODO To update math using bignumber and decimals + if (p.isDeposit) { + numerator += + Number(p.amount.toString()) * p.pool.lending.collateralFactor; + } else { + denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; + } + }); + + // HF = (numerator) / (denominator + factoredAmount) + // whre factoredAmount = (Amount of new Debt / debt factor) + const factoredAmount = numerator / minHf - denominator; + if (factoredAmount < 0) return 0; + return factoredAmount; + } +} + +export const zkLend = new ZkLend(); +const ZkLendAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['zklend_lending_base_aprs'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.ZKLEND.BASE_APR_API); + return res.json(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (!ZkLendAtoms.baseAPRs) return empty; + const baseInfo = get(ZkLendAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = zkLend._computePoolsInfo(poolsInfo.data); + return zkLend.addBaseAPYs(pools, baseInfo); + } + return empty; + }), +}; +export default ZkLendAtoms; diff --git a/src/strategies/IStrategy.ts b/src/strategies/IStrategy.ts old mode 100644 new mode 100755 index 1b82315..4c94ed1 --- a/src/strategies/IStrategy.ts +++ b/src/strategies/IStrategy.ts @@ -1,330 +1,330 @@ -import { IDapp } from '@/store/IDapp.store'; -import { BalanceResult, getBalanceAtom } from '@/store/balance.atoms'; -import { Category, PoolInfo } from '@/store/pools'; -import { zkLend } from '@/store/zklend.store'; -import MyNumber from '@/utils/MyNumber'; -import { Atom, atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { Call, ProviderInterface } from 'starknet'; - -interface Step { - name: string; - optimizer: ( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => StrategyAction[]; - filter: (( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => PoolInfo[])[]; -} - -export interface TokenInfo { - token: string; - decimals: number; - displayDecimals: number; - name: string; - logo: any; - minAmount: MyNumber; - maxAmount: MyNumber; - stepAmount: MyNumber; - ekuboPriceKey?: string; - isERC4626: boolean; -} - -export interface NFTInfo { - name: string; - address: string; - logo: any; - config: { - mainTokenName: string; - }; -} - -export interface StrategyAction { - pool: PoolInfo; - amount: string; - isDeposit: boolean; - name?: string; -} - -export enum StrategyStatus { - UNINTIALISED = 0, - SOLVING = 1, - SOLVED = 2, -} - -export enum StrategyLiveStatus { - ACTIVE = 'Active', - NEW = 'New', - COMING_SOON = 'Coming Soon', - RETIRED = 'Retired', -} - -export interface IStrategyActionHook { - tokenInfo: TokenInfo; - calls: Call[]; - balanceAtom: Atom>; -} - -export interface IStrategySettings { - maxTVL: number; -} - -export interface AmountInfo { - amount: MyNumber; - usdValue: number; - tokenInfo: TokenInfo; -} - -export class IStrategyProps { - readonly liveStatus: StrategyLiveStatus; - readonly id: string; - readonly name: string; - readonly description: string; - readonly settings: IStrategySettings; - exchanges: IDapp[] = []; - - steps: Step[] = []; - - actions: StrategyAction[] = []; - netYield: number = 0; - leverage: number = 0; - status = StrategyStatus.UNINTIALISED; - - readonly rewardTokens: { logo: string }[]; - readonly holdingTokens: (TokenInfo | NFTInfo)[]; - - balEnabled = atom(false); - readonly balanceAtom: Atom>; - readonly tvlAtom: Atom>; - - risks: string[] = [ - 'The strategy involves exposure to smart contracts, which inherently carry risks like hacks, albeit relatively low', - 'APYs shown are just indicative and do not promise exact returns', - ]; - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ): IStrategyActionHook[] => { - return []; - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ): IStrategyActionHook[] => { - return []; - }; - - getTVL = async (): Promise => { - throw new Error('getTVL: Not implemented'); - }; - - getUserTVL = async (user: string): Promise => { - throw new Error('getTVL: Not implemented'); - }; - - isLive() { - return ( - this.liveStatus == StrategyLiveStatus.ACTIVE || - this.liveStatus == StrategyLiveStatus.NEW - ); - } - - constructor( - id: string, - name: string, - description: string, - rewardTokens: { logo: string }[], - holdingTokens: (TokenInfo | NFTInfo)[], - liveStatus: StrategyLiveStatus, - settings: IStrategySettings, - ) { - this.id = id; - this.name = name; - this.description = description; - this.rewardTokens = rewardTokens; - this.holdingTokens = holdingTokens; - console.log('calling getBalanceAtom', id, holdingTokens[0]); - this.balanceAtom = getBalanceAtom(holdingTokens[0], this.balEnabled); - this.liveStatus = liveStatus; - this.settings = settings; - this.tvlAtom = atomWithQuery((get) => { - return { - queryKey: ['tvl', this.id], - queryFn: async ({ queryKey }: any): Promise => { - return this.getTVL(); - }, - refetchInterval: 15000, - }; - }); - } -} - -export class IStrategy extends IStrategyProps { - readonly tag: string; - - constructor( - id: string, - tag: string, - name: string, - description: string, - rewardTokens: { logo: string }[], - holdingTokens: (TokenInfo | NFTInfo)[], - liveStatus = StrategyLiveStatus.ACTIVE, - settings: IStrategySettings, - ) { - super( - id, - name, - description, - rewardTokens, - holdingTokens, - liveStatus, - settings, - ); - this.tag = tag; - } - - filterStablesOnly( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const eligiblePools = pools.filter((p) => p.category == Category.Stable); - if (!eligiblePools) throw new Error(`${this.tag}: [F1] no eligible pools`); - return eligiblePools; - } - - filterSameProtocolNotSameDepositPool( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - if (prevActions.length == 0) - throw new Error( - `${this.tag}: filterSameProtocolNotSameDepositPool - Prev actions zero`, - ); - const lastAction = prevActions[prevActions.length - 1]; - const eligiblePools = pools - .filter((p) => p.protocol.name == lastAction.pool.protocol.name) - .filter((p) => { - return p.pool.name != lastAction.pool.pool.name; - }); - - if (!eligiblePools) throw new Error(`${this.tag}: [F2] no eligible pools`); - return eligiblePools; - } - - filterNotSameProtocolSameDepositPool( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - if (prevActions.length == 0) - throw new Error( - `${this.tag}: filterNotSameProtocolSameDepositPool - Prev actions zero`, - ); - const lastAction = prevActions[prevActions.length - 1]; - const eligiblePools = pools - .filter((p) => p.protocol.name != lastAction.pool.protocol.name) - .filter((p) => { - return p.pool.name == lastAction.pool.pool.name; - }); - - if (!eligiblePools) throw new Error(`${this.tag}: [F3] no eligible pools`); - return eligiblePools; - } - - filterStrkzkLend( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - return pools.filter( - (p) => p.pool.name == 'STRK' && p.protocol.name == zkLend.name, - ); - } - - optimizerDeposit( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ) { - let bestPool: PoolInfo = eligiblePools[0]; - eligiblePools.forEach((p) => { - if (p.apr > bestPool.apr) { - bestPool = p; - } - }); - return [...actions, { pool: bestPool, amount, isDeposit: true }]; - } - - solve(pools: PoolInfo[], amount: string) { - this.actions = []; - let _amount: string = amount; - let netYield = 0; - this.status = StrategyStatus.SOLVING; - try { - for (let i = 0; i < this.steps.length; ++i) { - const step = this.steps[i]; - let _pools = [...pools]; - for (let j = 0; j < step.filter.length; ++j) { - const filter = step.filter[j]; - _pools = filter.bind(this)(_pools, amount, this.actions); - } - - console.log('solve', i, _pools, pools.length, this.actions, _amount); - - if (_pools.length > 0) { - this.actions = step.optimizer.bind(this)( - _pools, - _amount, - this.actions, - ); - if (this.actions.length != i + 1) { - console.warn(`actions`, this.actions.length, 'i', i); - throw new Error('one new action per step required'); - } - this.actions[i].name = step.name; - _amount = this.actions[this.actions.length - 1].amount; - } else { - throw new Error('no pools to continue computing strategy'); - } - } - } catch (err) { - console.warn(`${this.tag} - unsolved`, err); - return; - } - - this.actions.forEach((action) => { - const sign = action.isDeposit ? 1 : -1; - const apr = action.isDeposit ? action.pool.apr : action.pool.borrow.apr; - netYield += sign * apr * Number(action.amount); - console.log('netYield1', sign, apr, action.amount, netYield); - }); - this.netYield = netYield / Number(amount); - console.log('netYield', netYield, this.netYield); - this.leverage = this.netYield / this.actions[0].pool.apr; - - this.postSolve(); - - this.status = StrategyStatus.SOLVED; - } - - postSolve() {} - - isSolved() { - return this.status === StrategyStatus.SOLVED; - } - - isSolving() { - return this.status === StrategyStatus.SOLVING; - } -} +import { IDapp } from '@/store/IDapp.store'; +import { BalanceResult, getBalanceAtom } from '@/store/balance.atoms'; +import { Category, PoolInfo } from '@/store/pools'; +import { zkLend } from '@/store/zklend.store'; +import MyNumber from '@/utils/MyNumber'; +import { Atom, atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { Call, ProviderInterface } from 'starknet'; + +interface Step { + name: string; + optimizer: ( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => StrategyAction[]; + filter: (( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => PoolInfo[])[]; +} + +export interface TokenInfo { + token: string; + decimals: number; + displayDecimals: number; + name: string; + logo: any; + minAmount: MyNumber; + maxAmount: MyNumber; + stepAmount: MyNumber; + ekuboPriceKey?: string; + isERC4626: boolean; +} + +export interface NFTInfo { + name: string; + address: string; + logo: any; + config: { + mainTokenName: string; + }; +} + +export interface StrategyAction { + pool: PoolInfo; + amount: string; + isDeposit: boolean; + name?: string; +} + +export enum StrategyStatus { + UNINTIALISED = 0, + SOLVING = 1, + SOLVED = 2, +} + +export enum StrategyLiveStatus { + ACTIVE = 'Active', + NEW = 'New', + COMING_SOON = 'Coming Soon', + RETIRED = 'Retired', +} + +export interface IStrategyActionHook { + tokenInfo: TokenInfo; + calls: Call[]; + balanceAtom: Atom>; +} + +export interface IStrategySettings { + maxTVL: number; +} + +export interface AmountInfo { + amount: MyNumber; + usdValue: number; + tokenInfo: TokenInfo; +} + +export class IStrategyProps { + readonly liveStatus: StrategyLiveStatus; + readonly id: string; + readonly name: string; + readonly description: string; + readonly settings: IStrategySettings; + exchanges: IDapp[] = []; + + steps: Step[] = []; + + actions: StrategyAction[] = []; + netYield: number = 0; + leverage: number = 0; + status = StrategyStatus.UNINTIALISED; + + readonly rewardTokens: { logo: string }[]; + readonly holdingTokens: (TokenInfo | NFTInfo)[]; + + balEnabled = atom(false); + readonly balanceAtom: Atom>; + readonly tvlAtom: Atom>; + + risks: string[] = [ + 'The strategy involves exposure to smart contracts, which inherently carry risks like hacks, albeit relatively low', + 'APYs shown are just indicative and do not promise exact returns', + ]; + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ): IStrategyActionHook[] => { + return []; + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ): IStrategyActionHook[] => { + return []; + }; + + getTVL = async (): Promise => { + throw new Error('getTVL: Not implemented'); + }; + + getUserTVL = async (user: string): Promise => { + throw new Error('getTVL: Not implemented'); + }; + + isLive() { + return ( + this.liveStatus == StrategyLiveStatus.ACTIVE || + this.liveStatus == StrategyLiveStatus.NEW + ); + } + + constructor( + id: string, + name: string, + description: string, + rewardTokens: { logo: string }[], + holdingTokens: (TokenInfo | NFTInfo)[], + liveStatus: StrategyLiveStatus, + settings: IStrategySettings, + ) { + this.id = id; + this.name = name; + this.description = description; + this.rewardTokens = rewardTokens; + this.holdingTokens = holdingTokens; + console.log('calling getBalanceAtom', id, holdingTokens[0]); + this.balanceAtom = getBalanceAtom(holdingTokens[0], this.balEnabled); + this.liveStatus = liveStatus; + this.settings = settings; + this.tvlAtom = atomWithQuery((get) => { + return { + queryKey: ['tvl', this.id], + queryFn: async ({ queryKey }: any): Promise => { + return this.getTVL(); + }, + refetchInterval: 15000, + }; + }); + } +} + +export class IStrategy extends IStrategyProps { + readonly tag: string; + + constructor( + id: string, + tag: string, + name: string, + description: string, + rewardTokens: { logo: string }[], + holdingTokens: (TokenInfo | NFTInfo)[], + liveStatus = StrategyLiveStatus.ACTIVE, + settings: IStrategySettings, + ) { + super( + id, + name, + description, + rewardTokens, + holdingTokens, + liveStatus, + settings, + ); + this.tag = tag; + } + + filterStablesOnly( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const eligiblePools = pools.filter((p) => p.category == Category.Stable); + if (!eligiblePools) throw new Error(`${this.tag}: [F1] no eligible pools`); + return eligiblePools; + } + + filterSameProtocolNotSameDepositPool( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + if (prevActions.length == 0) + throw new Error( + `${this.tag}: filterSameProtocolNotSameDepositPool - Prev actions zero`, + ); + const lastAction = prevActions[prevActions.length - 1]; + const eligiblePools = pools + .filter((p) => p.protocol.name == lastAction.pool.protocol.name) + .filter((p) => { + return p.pool.name != lastAction.pool.pool.name; + }); + + if (!eligiblePools) throw new Error(`${this.tag}: [F2] no eligible pools`); + return eligiblePools; + } + + filterNotSameProtocolSameDepositPool( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + if (prevActions.length == 0) + throw new Error( + `${this.tag}: filterNotSameProtocolSameDepositPool - Prev actions zero`, + ); + const lastAction = prevActions[prevActions.length - 1]; + const eligiblePools = pools + .filter((p) => p.protocol.name != lastAction.pool.protocol.name) + .filter((p) => { + return p.pool.name == lastAction.pool.pool.name; + }); + + if (!eligiblePools) throw new Error(`${this.tag}: [F3] no eligible pools`); + return eligiblePools; + } + + filterStrkzkLend( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + return pools.filter( + (p) => p.pool.name == 'STRK' && p.protocol.name == zkLend.name, + ); + } + + optimizerDeposit( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ) { + let bestPool: PoolInfo = eligiblePools[0]; + eligiblePools.forEach((p) => { + if (p.apr > bestPool.apr) { + bestPool = p; + } + }); + return [...actions, { pool: bestPool, amount, isDeposit: true }]; + } + + solve(pools: PoolInfo[], amount: string) { + this.actions = []; + let _amount: string = amount; + let netYield = 0; + this.status = StrategyStatus.SOLVING; + try { + for (let i = 0; i < this.steps.length; ++i) { + const step = this.steps[i]; + let _pools = [...pools]; + for (let j = 0; j < step.filter.length; ++j) { + const filter = step.filter[j]; + _pools = filter.bind(this)(_pools, amount, this.actions); + } + + console.log('solve', i, _pools, pools.length, this.actions, _amount); + + if (_pools.length > 0) { + this.actions = step.optimizer.bind(this)( + _pools, + _amount, + this.actions, + ); + if (this.actions.length != i + 1) { + console.warn(`actions`, this.actions.length, 'i', i); + throw new Error('one new action per step required'); + } + this.actions[i].name = step.name; + _amount = this.actions[this.actions.length - 1].amount; + } else { + throw new Error('no pools to continue computing strategy'); + } + } + } catch (err) { + console.warn(`${this.tag} - unsolved`, err); + return; + } + + this.actions.forEach((action) => { + const sign = action.isDeposit ? 1 : -1; + const apr = action.isDeposit ? action.pool.apr : action.pool.borrow.apr; + netYield += sign * apr * Number(action.amount); + console.log('netYield1', sign, apr, action.amount, netYield); + }); + this.netYield = netYield / Number(amount); + console.log('netYield', netYield, this.netYield); + this.leverage = this.netYield / this.actions[0].pool.apr; + + this.postSolve(); + + this.status = StrategyStatus.SOLVED; + } + + postSolve() {} + + isSolved() { + return this.status === StrategyStatus.SOLVED; + } + + isSolving() { + return this.status === StrategyStatus.SOLVING; + } +} diff --git a/src/strategies/auto_strk.strat.ts b/src/strategies/auto_strk.strat.ts old mode 100644 new mode 100755 index 298b158..851164f --- a/src/strategies/auto_strk.strat.ts +++ b/src/strategies/auto_strk.strat.ts @@ -1,309 +1,309 @@ -import CONSTANTS, { TOKENS, TokenName } from '@/constants'; -import { PoolInfo } from '@/store/pools'; -import { - IStrategy, - IStrategySettings, - StrategyAction, - StrategyLiveStatus, - TokenInfo, -} from './IStrategy'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import AutoStrkAbi from '@/abi/autoStrk.abi.json'; -import MasterAbi from '@/abi/master.abi.json'; -import MyNumber from '@/utils/MyNumber'; -import { Contract, ProviderInterface, uint256 } from 'starknet'; -import { atom } from 'jotai'; -import { - DUMMY_BAL_ATOM, - getBalance, - getBalanceAtom, - getERC20Balance, - getERC20BalanceAtom, -} from '@/store/balance.atoms'; -import { getTokenInfoFromName } from '@/utils'; -import axios from 'axios'; - -interface Step { - name: string; - optimizer: ( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => StrategyAction[]; - filter: (( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => PoolInfo[])[]; -} - -export class AutoTokenStrategy extends IStrategy { - token: TokenInfo; - readonly lpTokenName: string; - readonly strategyAddress: string; - - constructor( - token: TokenName, - name: string, - description: string, - lpTokenName: string, - strategyAddress: string, - settings: IStrategySettings, - ) { - const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; - const frmToken = TOKENS.find((t) => t.token == strategyAddress); - if (!frmToken) throw new Error('frmToken undefined'); - const holdingTokens = [frmToken]; - - super( - `auto_token_${token.toLowerCase()}`, - 'AutoSTRK', - name, - description, - rewardTokens, - holdingTokens, - StrategyLiveStatus.ACTIVE, - settings, - ); - this.token = getTokenInfoFromName(token); - - this.steps = [ - { - name: `Supplies your ${token} to zkLend`, - optimizer: this.optimizer, - filter: [this.filterStrkzkLend], - }, - { - name: `Re-invest your STRK Rewards every 14 days`, - optimizer: this.compounder, - filter: [this.filterStrkzkLend], - }, - ]; - const _risks = [...this.risks]; - this.risks = [ - `Safety score: 4.5/5`, - `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, - `Transfering excess ${lpTokenName} may take your borrows in zkLend near liquidaton. It's safer to deposit ${token} directly.`, - ..._risks, - ]; - this.lpTokenName = lpTokenName; - this.strategyAddress = strategyAddress; - } - - optimizer( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - return [{ pool: eligiblePools[0], amount, isDeposit: true }]; - } - - compounder( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - const baseApr = actions[0].pool.apr; - const compoundingApr = (1 + baseApr / 26) ** 26 - 1; - return [ - ...actions, - { - pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, - amount, - isDeposit: true, - }, - ]; - } - - getUserTVL = async (user: string) => { - if (this.liveStatus == StrategyLiveStatus.COMING_SOON) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - // returns zToken - const balanceInfo = await getBalance(this.holdingTokens[0], user); - if (!balanceInfo.tokenInfo) { - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - } - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - console.log('getUserTVL autoc', price, balanceInfo.amount.toEtherStr()); - return { - amount: balanceInfo.amount, - usdValue: Number(balanceInfo.amount.toEtherStr()) * price, - tokenInfo: balanceInfo.tokenInfo, - }; - }; - - getTVL = async () => { - if (!this.isLive()) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - const zTokenInfo = getTokenInfoFromName(this.lpTokenName); - const bal = await getERC20Balance(zTokenInfo, this.strategyAddress); - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - return { - amount: bal.amount, - usdValue: Number(bal.amount.toEtherStr()) * price, - tokenInfo: this.token, - }; - }; - - // postSolve() { - // const normalYield = this.netYield; - // this.netYield = (1 + this.netYield/26)**26 - 1; // biweekly compounding - // this.leverage = this.netYield / normalYield; - // } - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const baseTokenInfo: TokenInfo = TOKENS.find( - (t) => t.name == this.token.name, - ) as TokenInfo; // - const zTokenInfo: TokenInfo = TOKENS.find( - (t) => t.name == this.lpTokenName, - ) as TokenInfo; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: baseTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - { - tokenInfo: zTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const baseTokenContract = new Contract( - ERC20Abi, - baseTokenInfo.token, - provider, - ); - const zTokenContract = new Contract(ERC20Abi, zTokenInfo.token, provider); - const masterContract = new Contract( - MasterAbi, - CONSTANTS.CONTRACTS.Master, - provider, - ); - const strategyContract = new Contract( - AutoStrkAbi, - this.strategyAddress, - provider, - ); - - // base token - const call11 = baseTokenContract.populate('approve', [ - masterContract.address, - uint256.bnToUint256(amount.toString()), - ]); - const call12 = masterContract.populate('invest_auto_strk', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - address, - ]); - - // zToken - const call21 = zTokenContract.populate('approve', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - ]); - const call22 = strategyContract.populate('deposit', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls1 = [call11, call12]; - const calls2 = [call21, call22]; - - return [ - { - tokenInfo: baseTokenInfo, - calls: calls1, - balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), - }, - { - tokenInfo: zTokenInfo, - calls: calls2, - balanceAtom: getBalanceAtom(zTokenInfo, atom(true)), - }, - ]; - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const frmToken: TokenInfo = TOKENS.find( - (t) => t.token == this.strategyAddress, - ) as TokenInfo; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: frmToken, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - // const baseTokenContract = new Contract(ERC20Abi, baseTokenInfo.token, provider); - const frmTokenContract = new Contract(ERC20Abi, frmToken.token, provider); - // const masterContract = new Contract(MasterAbi, CONSTANTS.CONTRACTS.Master, provider); - const strategyContract = new Contract( - AutoStrkAbi, - this.strategyAddress, - provider, - ); - - // base token - // const call11 = baseTokenContract.populate("approve", [masterContract.address, uint256.bnToUint256(amount.toString())]) - // const call12 = masterContract.populate("invest_auto_strk", [this.strategyAddress, uint256.bnToUint256(amount.toString()), address]) - - // zToken - const call1 = frmTokenContract.populate('approve', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - ]); - const call2 = strategyContract.populate('redeem', [ - uint256.bnToUint256(amount.toString()), - address, - address, - ]); - - const calls = [call1, call2]; - - return [ - { - tokenInfo: frmToken, - calls, - balanceAtom: getERC20BalanceAtom(frmToken), - }, - ]; - }; -} +import CONSTANTS, { TOKENS, TokenName } from '@/constants'; +import { PoolInfo } from '@/store/pools'; +import { + IStrategy, + IStrategySettings, + StrategyAction, + StrategyLiveStatus, + TokenInfo, +} from './IStrategy'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import AutoStrkAbi from '@/abi/autoStrk.abi.json'; +import MasterAbi from '@/abi/master.abi.json'; +import MyNumber from '@/utils/MyNumber'; +import { Contract, ProviderInterface, uint256 } from 'starknet'; +import { atom } from 'jotai'; +import { + DUMMY_BAL_ATOM, + getBalance, + getBalanceAtom, + getERC20Balance, + getERC20BalanceAtom, +} from '@/store/balance.atoms'; +import { getTokenInfoFromName } from '@/utils'; +import axios from 'axios'; + +interface Step { + name: string; + optimizer: ( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => StrategyAction[]; + filter: (( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => PoolInfo[])[]; +} + +export class AutoTokenStrategy extends IStrategy { + token: TokenInfo; + readonly lpTokenName: string; + readonly strategyAddress: string; + + constructor( + token: TokenName, + name: string, + description: string, + lpTokenName: string, + strategyAddress: string, + settings: IStrategySettings, + ) { + const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; + const frmToken = TOKENS.find((t) => t.token == strategyAddress); + if (!frmToken) throw new Error('frmToken undefined'); + const holdingTokens = [frmToken]; + + super( + `auto_token_${token.toLowerCase()}`, + 'AutoSTRK', + name, + description, + rewardTokens, + holdingTokens, + StrategyLiveStatus.ACTIVE, + settings, + ); + this.token = getTokenInfoFromName(token); + + this.steps = [ + { + name: `Supplies your ${token} to zkLend`, + optimizer: this.optimizer, + filter: [this.filterStrkzkLend], + }, + { + name: `Re-invest your STRK Rewards every 14 days`, + optimizer: this.compounder, + filter: [this.filterStrkzkLend], + }, + ]; + const _risks = [...this.risks]; + this.risks = [ + `Safety score: 4.5/5`, + `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, + `Transfering excess ${lpTokenName} may take your borrows in zkLend near liquidaton. It's safer to deposit ${token} directly.`, + ..._risks, + ]; + this.lpTokenName = lpTokenName; + this.strategyAddress = strategyAddress; + } + + optimizer( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + return [{ pool: eligiblePools[0], amount, isDeposit: true }]; + } + + compounder( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + const baseApr = actions[0].pool.apr; + const compoundingApr = (1 + baseApr / 26) ** 26 - 1; + return [ + ...actions, + { + pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, + amount, + isDeposit: true, + }, + ]; + } + + getUserTVL = async (user: string) => { + if (this.liveStatus == StrategyLiveStatus.COMING_SOON) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + // returns zToken + const balanceInfo = await getBalance(this.holdingTokens[0], user); + if (!balanceInfo.tokenInfo) { + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + } + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + console.log('getUserTVL autoc', price, balanceInfo.amount.toEtherStr()); + return { + amount: balanceInfo.amount, + usdValue: Number(balanceInfo.amount.toEtherStr()) * price, + tokenInfo: balanceInfo.tokenInfo, + }; + }; + + getTVL = async () => { + if (!this.isLive()) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + const zTokenInfo = getTokenInfoFromName(this.lpTokenName); + const bal = await getERC20Balance(zTokenInfo, this.strategyAddress); + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + return { + amount: bal.amount, + usdValue: Number(bal.amount.toEtherStr()) * price, + tokenInfo: this.token, + }; + }; + + // postSolve() { + // const normalYield = this.netYield; + // this.netYield = (1 + this.netYield/26)**26 - 1; // biweekly compounding + // this.leverage = this.netYield / normalYield; + // } + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const baseTokenInfo: TokenInfo = TOKENS.find( + (t) => t.name == this.token.name, + ) as TokenInfo; // + const zTokenInfo: TokenInfo = TOKENS.find( + (t) => t.name == this.lpTokenName, + ) as TokenInfo; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: baseTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + { + tokenInfo: zTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const baseTokenContract = new Contract( + ERC20Abi, + baseTokenInfo.token, + provider, + ); + const zTokenContract = new Contract(ERC20Abi, zTokenInfo.token, provider); + const masterContract = new Contract( + MasterAbi, + CONSTANTS.CONTRACTS.Master, + provider, + ); + const strategyContract = new Contract( + AutoStrkAbi, + this.strategyAddress, + provider, + ); + + // base token + const call11 = baseTokenContract.populate('approve', [ + masterContract.address, + uint256.bnToUint256(amount.toString()), + ]); + const call12 = masterContract.populate('invest_auto_strk', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + address, + ]); + + // zToken + const call21 = zTokenContract.populate('approve', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + ]); + const call22 = strategyContract.populate('deposit', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls1 = [call11, call12]; + const calls2 = [call21, call22]; + + return [ + { + tokenInfo: baseTokenInfo, + calls: calls1, + balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), + }, + { + tokenInfo: zTokenInfo, + calls: calls2, + balanceAtom: getBalanceAtom(zTokenInfo, atom(true)), + }, + ]; + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const frmToken: TokenInfo = TOKENS.find( + (t) => t.token == this.strategyAddress, + ) as TokenInfo; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: frmToken, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + // const baseTokenContract = new Contract(ERC20Abi, baseTokenInfo.token, provider); + const frmTokenContract = new Contract(ERC20Abi, frmToken.token, provider); + // const masterContract = new Contract(MasterAbi, CONSTANTS.CONTRACTS.Master, provider); + const strategyContract = new Contract( + AutoStrkAbi, + this.strategyAddress, + provider, + ); + + // base token + // const call11 = baseTokenContract.populate("approve", [masterContract.address, uint256.bnToUint256(amount.toString())]) + // const call12 = masterContract.populate("invest_auto_strk", [this.strategyAddress, uint256.bnToUint256(amount.toString()), address]) + + // zToken + const call1 = frmTokenContract.populate('approve', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + ]); + const call2 = strategyContract.populate('redeem', [ + uint256.bnToUint256(amount.toString()), + address, + address, + ]); + + const calls = [call1, call2]; + + return [ + { + tokenInfo: frmToken, + calls, + balanceAtom: getERC20BalanceAtom(frmToken), + }, + ]; + }; +} diff --git a/src/strategies/delta_neutral_mm.ts b/src/strategies/delta_neutral_mm.ts old mode 100644 new mode 100755 index dffbd10..c85f8b5 --- a/src/strategies/delta_neutral_mm.ts +++ b/src/strategies/delta_neutral_mm.ts @@ -1,398 +1,398 @@ -import CONSTANTS, { NFTS, TokenName } from '@/constants'; -import { PoolInfo } from '@/store/pools'; -import { - IStrategy, - IStrategySettings, - NFTInfo, - StrategyAction, - StrategyLiveStatus, - TokenInfo, -} from './IStrategy'; -import { zkLend } from '@/store/zklend.store'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; -import MyNumber from '@/utils/MyNumber'; -import { Call, Contract, ProviderInterface, uint256 } from 'starknet'; -import { nostraLending } from '@/store/nostralending.store'; -import { getTokenInfoFromName, standariseAddress } from '@/utils'; -import { - DUMMY_BAL_ATOM, - getBalance, - getBalanceAtom, - getERC20Balance, -} from '@/store/balance.atoms'; -import { atom } from 'jotai'; -import axios from 'axios'; - -export class DeltaNeutralMM extends IStrategy { - token: TokenInfo; - readonly secondaryToken: string; - readonly strategyAddress: string; - // Factor of Amount to be deposited/borrowed at each step relative to the previous step - readonly stepAmountFactors: number[]; - - constructor( - token: TokenInfo, - name: string, - description: string, - secondaryTokenName: TokenName, - strategyAddress: string, - stepAmountFactors: number[], - liveStatus: StrategyLiveStatus, - settings: IStrategySettings, - ) { - const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; - const nftInfo = NFTS.find( - (nft) => - standariseAddress(nft.address) == standariseAddress(strategyAddress), - ); - if (!nftInfo) { - throw new Error('DeltaMM: NFT not found'); - } - const holdingTokens: (TokenInfo | NFTInfo)[] = [nftInfo]; - super( - `${token.name.toLowerCase()}_sensei`, - 'DeltaNeutralMM', - name, - description, - rewardTokens, - holdingTokens, - liveStatus, - settings, - ); - this.token = token; - - this.steps = [ - { - name: `Supply's your ${token.name} to zkLend`, - optimizer: this.optimizer, - filter: [this.filterMainToken], - }, - { - name: `Borrow ${secondaryTokenName} from zkLend`, - optimizer: this.optimizer, - filter: [this.filterSecondaryToken], - }, - { - name: `Deposit ${secondaryTokenName} to Nostra`, - optimizer: this.optimizer, - filter: [this.filterSecondaryToken], - }, - { - name: `Borrow ${token.name} from Nostra`, - optimizer: this.optimizer, - filter: [this.filterMainToken], - }, - { - name: `Loop back to step 1, repeat 3 more times`, - optimizer: this.getLookRepeatYieldAmount, - filter: [this.filterMainToken], - }, - { - name: `Re-invest your STRK Rewards every 14 days (Compound)`, - optimizer: this.compounder, - filter: [this.filterStrkzkLend], - }, - ]; - - if (stepAmountFactors.length != 5) { - throw new Error( - 'stepAmountFactors length should be equal to steps length', - ); - } - this.stepAmountFactors = stepAmountFactors; - - const _risks = [...this.risks]; - this.risks = [ - `Safety score: 4.25/5`, - `For upto 2 weeks, your position value may reduce due to high borrow APR. This will be compensated by STRK rewards.`, - `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, - `Technical failures in rebalancing positions to maintain healthy health factor may result in liquidations.`, - ..._risks, - ]; - this.secondaryToken = secondaryTokenName; - this.strategyAddress = strategyAddress; - } - - filterMainToken( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const dapp = - prevActions.length == 0 || prevActions.length == 4 - ? zkLend - : nostraLending; - return pools.filter( - (p) => p.pool.name == this.token.name && p.protocol.name == dapp.name, - ); - } - - filterSecondaryToken( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const dapp = prevActions.length == 1 ? zkLend : nostraLending; - return pools.filter( - (p) => p.pool.name == this.secondaryToken && p.protocol.name == dapp.name, - ); - } - - optimizer( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - console.log('optimizer', actions.length, this.stepAmountFactors); - const _amount = ( - Number(amount) * this.stepAmountFactors[actions.length] - ).toFixed(2); - return [ - ...actions, - { - pool: eligiblePools[0], - amount: _amount, - isDeposit: actions.length == 0 || actions.length == 2, - }, - ]; - } - - getLookRepeatYieldAmount( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ) { - console.log('getLookRepeatYieldAmount', amount, actions); - let full_amount = Number(amount); - this.stepAmountFactors.slice(0, 4).forEach((factor, i) => { - full_amount /= factor; - }); - const excessFactor = this.stepAmountFactors[4]; - const amount1 = excessFactor * full_amount; - const exp1 = amount1 * this.actions[0].pool.apr; - const amount2 = this.stepAmountFactors[1] * amount1; - const exp2 = - amount2 * (this.actions[2].pool.apr - this.actions[1].pool.borrow.apr); - const amount3 = this.stepAmountFactors[3] * amount2; - const exp3 = -amount3 * this.actions[3].pool.borrow.apr; - const effecitveAmount = amount1 - amount3; - const effectiveAPR = (exp1 + exp2 + exp3) / effecitveAmount; - const pool: PoolInfo = { ...eligiblePools[0] }; - pool.apr = effectiveAPR; - const strategyAction: StrategyAction = { - pool, - amount: effecitveAmount.toString(), - isDeposit: true, - }; - console.log( - 'getLookRepeatYieldAmount exp1', - this.id, - exp1, - full_amount, - exp2, - amount2, - this.actions[2], - this.actions[1], - exp3, - amount1, - amount3, - ); - return [...actions, strategyAction]; - } - - compounder( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - const amountWeights = this.actions.reduce((a, pool) => { - const sign = pool.isDeposit ? 1 : -1; - const apr = pool.isDeposit ? pool.pool.apr : pool.pool.borrow.apr; - console.log('compounder2', sign, pool.amount, apr); - return sign * Number(pool.amount) * apr + a; - }, 0); - const amountIn = Number(this.actions[0].amount); - const baseApr = amountWeights / amountIn; - const compoundingApr = (1 + baseApr / 26) ** 26 - 1; - console.log( - 'compounder', - amountIn, - amountWeights, - baseApr, - compoundingApr, - actions, - ); - return [ - ...actions, - { - pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, - amount: amountIn.toFixed(2), - isDeposit: true, - }, - ]; - } - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const baseTokenInfo = this.token; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: baseTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const baseTokenContract = new Contract( - ERC20Abi, - baseTokenInfo.token, - provider, - ); - const strategyContract = new Contract( - DeltaNeutralAbi, - this.strategyAddress, - provider, - ); - - // base token - const call11 = baseTokenContract.populate('approve', [ - strategyContract.address, - uint256.bnToUint256(amount.toString()), - ]); - const call12 = strategyContract.populate('deposit', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls1 = [call11, call12]; - - return [ - { - tokenInfo: baseTokenInfo, - calls: calls1, - balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), - }, - ]; - }; - - getUserTVL = async (user: string) => { - if (this.liveStatus == StrategyLiveStatus.COMING_SOON) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - const balanceInfo = await getBalance(this.holdingTokens[0], user); - if (!balanceInfo.tokenInfo) { - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - } - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${balanceInfo.tokenInfo.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - console.log('getUserTVL dnmm', price, balanceInfo.amount.toEtherStr()); - return { - amount: balanceInfo.amount, - usdValue: Number(balanceInfo.amount.toEtherStr()) * price, - tokenInfo: balanceInfo.tokenInfo, - }; - }; - - getTVL = async () => { - if (!this.isLive()) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - try { - const mainTokenName = this.token.name; - const zToken = getTokenInfoFromName(`z${mainTokenName}`); - - const bal = await getERC20Balance(zToken, this.strategyAddress); - console.log('getTVL', bal.amount.toString()); - // This reduces the zToken TVL to near actual deposits made by users wihout looping - const discountFactor = this.stepAmountFactors[4]; - const amount = bal.amount.operate('div', 1 + discountFactor); - console.log('getTVL1', amount.toString()); - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${mainTokenName}-USDT/spot`, - ); - console.log('getTVL2', priceInfo); - const price = Number(priceInfo.data.data.amount); - return { - amount, - usdValue: Number(amount.toEtherStr()) * price, - tokenInfo: this.token, - }; - } catch (e) { - console.log('getTVL err', e); - throw e; - } - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const mainToken = { ...this.token }; - - // removing max amount restrictions on withdrawal - mainToken.maxAmount = MyNumber.fromEther( - '100000000000', - mainToken.maxAmount.decimals, - ); - - if (!address || address == '0x0') { - return [ - { - tokenInfo: mainToken, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const strategyContract = new Contract( - DeltaNeutralAbi, - this.strategyAddress, - provider, - ); - - const call = strategyContract.populate('withdraw', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls: Call[] = [call]; - - const nftInfo = NFTS.find( - (nft) => - standariseAddress(nft.address) == - standariseAddress(this.strategyAddress), - ); - if (!nftInfo) { - throw new Error('DeltaMM: NFT not found'); - } - return [ - { - tokenInfo: mainToken, - calls, - balanceAtom: getBalanceAtom(nftInfo, atom(true)), - }, - ]; - }; -} +import CONSTANTS, { NFTS, TokenName } from '@/constants'; +import { PoolInfo } from '@/store/pools'; +import { + IStrategy, + IStrategySettings, + NFTInfo, + StrategyAction, + StrategyLiveStatus, + TokenInfo, +} from './IStrategy'; +import { zkLend } from '@/store/zklend.store'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; +import MyNumber from '@/utils/MyNumber'; +import { Call, Contract, ProviderInterface, uint256 } from 'starknet'; +import { nostraLending } from '@/store/nostralending.store'; +import { getTokenInfoFromName, standariseAddress } from '@/utils'; +import { + DUMMY_BAL_ATOM, + getBalance, + getBalanceAtom, + getERC20Balance, +} from '@/store/balance.atoms'; +import { atom } from 'jotai'; +import axios from 'axios'; + +export class DeltaNeutralMM extends IStrategy { + token: TokenInfo; + readonly secondaryToken: string; + readonly strategyAddress: string; + // Factor of Amount to be deposited/borrowed at each step relative to the previous step + readonly stepAmountFactors: number[]; + + constructor( + token: TokenInfo, + name: string, + description: string, + secondaryTokenName: TokenName, + strategyAddress: string, + stepAmountFactors: number[], + liveStatus: StrategyLiveStatus, + settings: IStrategySettings, + ) { + const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; + const nftInfo = NFTS.find( + (nft) => + standariseAddress(nft.address) == standariseAddress(strategyAddress), + ); + if (!nftInfo) { + throw new Error('DeltaMM: NFT not found'); + } + const holdingTokens: (TokenInfo | NFTInfo)[] = [nftInfo]; + super( + `${token.name.toLowerCase()}_sensei`, + 'DeltaNeutralMM', + name, + description, + rewardTokens, + holdingTokens, + liveStatus, + settings, + ); + this.token = token; + + this.steps = [ + { + name: `Supply's your ${token.name} to zkLend`, + optimizer: this.optimizer, + filter: [this.filterMainToken], + }, + { + name: `Borrow ${secondaryTokenName} from zkLend`, + optimizer: this.optimizer, + filter: [this.filterSecondaryToken], + }, + { + name: `Deposit ${secondaryTokenName} to Nostra`, + optimizer: this.optimizer, + filter: [this.filterSecondaryToken], + }, + { + name: `Borrow ${token.name} from Nostra`, + optimizer: this.optimizer, + filter: [this.filterMainToken], + }, + { + name: `Loop back to step 1, repeat 3 more times`, + optimizer: this.getLookRepeatYieldAmount, + filter: [this.filterMainToken], + }, + { + name: `Re-invest your STRK Rewards every 14 days (Compound)`, + optimizer: this.compounder, + filter: [this.filterStrkzkLend], + }, + ]; + + if (stepAmountFactors.length != 5) { + throw new Error( + 'stepAmountFactors length should be equal to steps length', + ); + } + this.stepAmountFactors = stepAmountFactors; + + const _risks = [...this.risks]; + this.risks = [ + `Safety score: 4.25/5`, + `For upto 2 weeks, your position value may reduce due to high borrow APR. This will be compensated by STRK rewards.`, + `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, + `Technical failures in rebalancing positions to maintain healthy health factor may result in liquidations.`, + ..._risks, + ]; + this.secondaryToken = secondaryTokenName; + this.strategyAddress = strategyAddress; + } + + filterMainToken( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const dapp = + prevActions.length == 0 || prevActions.length == 4 + ? zkLend + : nostraLending; + return pools.filter( + (p) => p.pool.name == this.token.name && p.protocol.name == dapp.name, + ); + } + + filterSecondaryToken( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const dapp = prevActions.length == 1 ? zkLend : nostraLending; + return pools.filter( + (p) => p.pool.name == this.secondaryToken && p.protocol.name == dapp.name, + ); + } + + optimizer( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + console.log('optimizer', actions.length, this.stepAmountFactors); + const _amount = ( + Number(amount) * this.stepAmountFactors[actions.length] + ).toFixed(2); + return [ + ...actions, + { + pool: eligiblePools[0], + amount: _amount, + isDeposit: actions.length == 0 || actions.length == 2, + }, + ]; + } + + getLookRepeatYieldAmount( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ) { + console.log('getLookRepeatYieldAmount', amount, actions); + let full_amount = Number(amount); + this.stepAmountFactors.slice(0, 4).forEach((factor, i) => { + full_amount /= factor; + }); + const excessFactor = this.stepAmountFactors[4]; + const amount1 = excessFactor * full_amount; + const exp1 = amount1 * this.actions[0].pool.apr; + const amount2 = this.stepAmountFactors[1] * amount1; + const exp2 = + amount2 * (this.actions[2].pool.apr - this.actions[1].pool.borrow.apr); + const amount3 = this.stepAmountFactors[3] * amount2; + const exp3 = -amount3 * this.actions[3].pool.borrow.apr; + const effecitveAmount = amount1 - amount3; + const effectiveAPR = (exp1 + exp2 + exp3) / effecitveAmount; + const pool: PoolInfo = { ...eligiblePools[0] }; + pool.apr = effectiveAPR; + const strategyAction: StrategyAction = { + pool, + amount: effecitveAmount.toString(), + isDeposit: true, + }; + console.log( + 'getLookRepeatYieldAmount exp1', + this.id, + exp1, + full_amount, + exp2, + amount2, + this.actions[2], + this.actions[1], + exp3, + amount1, + amount3, + ); + return [...actions, strategyAction]; + } + + compounder( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + const amountWeights = this.actions.reduce((a, pool) => { + const sign = pool.isDeposit ? 1 : -1; + const apr = pool.isDeposit ? pool.pool.apr : pool.pool.borrow.apr; + console.log('compounder2', sign, pool.amount, apr); + return sign * Number(pool.amount) * apr + a; + }, 0); + const amountIn = Number(this.actions[0].amount); + const baseApr = amountWeights / amountIn; + const compoundingApr = (1 + baseApr / 26) ** 26 - 1; + console.log( + 'compounder', + amountIn, + amountWeights, + baseApr, + compoundingApr, + actions, + ); + return [ + ...actions, + { + pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, + amount: amountIn.toFixed(2), + isDeposit: true, + }, + ]; + } + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const baseTokenInfo = this.token; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: baseTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const baseTokenContract = new Contract( + ERC20Abi, + baseTokenInfo.token, + provider, + ); + const strategyContract = new Contract( + DeltaNeutralAbi, + this.strategyAddress, + provider, + ); + + // base token + const call11 = baseTokenContract.populate('approve', [ + strategyContract.address, + uint256.bnToUint256(amount.toString()), + ]); + const call12 = strategyContract.populate('deposit', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls1 = [call11, call12]; + + return [ + { + tokenInfo: baseTokenInfo, + calls: calls1, + balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), + }, + ]; + }; + + getUserTVL = async (user: string) => { + if (this.liveStatus == StrategyLiveStatus.COMING_SOON) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + const balanceInfo = await getBalance(this.holdingTokens[0], user); + if (!balanceInfo.tokenInfo) { + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + } + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${balanceInfo.tokenInfo.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + console.log('getUserTVL dnmm', price, balanceInfo.amount.toEtherStr()); + return { + amount: balanceInfo.amount, + usdValue: Number(balanceInfo.amount.toEtherStr()) * price, + tokenInfo: balanceInfo.tokenInfo, + }; + }; + + getTVL = async () => { + if (!this.isLive()) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + try { + const mainTokenName = this.token.name; + const zToken = getTokenInfoFromName(`z${mainTokenName}`); + + const bal = await getERC20Balance(zToken, this.strategyAddress); + console.log('getTVL', bal.amount.toString()); + // This reduces the zToken TVL to near actual deposits made by users wihout looping + const discountFactor = this.stepAmountFactors[4]; + const amount = bal.amount.operate('div', 1 + discountFactor); + console.log('getTVL1', amount.toString()); + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${mainTokenName}-USDT/spot`, + ); + console.log('getTVL2', priceInfo); + const price = Number(priceInfo.data.data.amount); + return { + amount, + usdValue: Number(amount.toEtherStr()) * price, + tokenInfo: this.token, + }; + } catch (e) { + console.log('getTVL err', e); + throw e; + } + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const mainToken = { ...this.token }; + + // removing max amount restrictions on withdrawal + mainToken.maxAmount = MyNumber.fromEther( + '100000000000', + mainToken.maxAmount.decimals, + ); + + if (!address || address == '0x0') { + return [ + { + tokenInfo: mainToken, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const strategyContract = new Contract( + DeltaNeutralAbi, + this.strategyAddress, + provider, + ); + + const call = strategyContract.populate('withdraw', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls: Call[] = [call]; + + const nftInfo = NFTS.find( + (nft) => + standariseAddress(nft.address) == + standariseAddress(this.strategyAddress), + ); + if (!nftInfo) { + throw new Error('DeltaMM: NFT not found'); + } + return [ + { + tokenInfo: mainToken, + calls, + balanceAtom: getBalanceAtom(nftInfo, atom(true)), + }, + ]; + }; +} diff --git a/src/strategies/simple.stable.strat.ts b/src/strategies/simple.stable.strat.ts old mode 100644 new mode 100755 index d69a5ab..edc1ac5 --- a/src/strategies/simple.stable.strat.ts +++ b/src/strategies/simple.stable.strat.ts @@ -1,89 +1,89 @@ -// import CONSTANTS from '@/constants'; -// import { IDapp } from '@/store/IDapp.store'; -// import { PROTOCOLS, PoolInfo } from '@/store/pools'; -// import { IStrategy, StrategyAction } from './IStrategy'; - -// interface Step { -// name: string; -// optimizer: ( -// pools: PoolInfo[], -// amount: string, -// prevActions: StrategyAction[], -// ) => StrategyAction[]; -// filter: (( -// pools: PoolInfo[], -// amount: string, -// prevActions: StrategyAction[], -// ) => PoolInfo[])[]; -// } - -// export class SimpleStableStrategy extends IStrategy { -// tag = 'SSStrt'; -// exchanges: IDapp[] = []; - -// actions: StrategyAction[] = []; -// netYield: number = 0; -// leverage: number = 0; -// solved = false; - -// constructor() { -// const rewardTokens = [ -// { logo: CONSTANTS.LOGOS.STRK }, -// { logo: CONSTANTS.LOGOS.USDC }, -// { logo: CONSTANTS.LOGOS.USDT }, -// ]; -// super( -// `SSStrt_mm_usdc_usdt`, -// 'SSStrt', -// 'Stable loop', -// 'Loop stable-coins to maximize yield', -// rewardTokens, -// [], -// ); - -// this.steps = [ -// { -// name: 'Deposit to best pool', -// optimizer: this.optimizerDeposit, -// filter: [this.filterStablesOnly], -// }, -// { -// name: 'Borrow from same protocol keeping HF > 1.2', -// optimizer: (pools, amount, actions) => { -// let bestPool: PoolInfo = pools[0]; -// pools.forEach((p) => { -// if (p.borrow.apr < bestPool.borrow.apr) { -// bestPool = p; -// } -// }); -// const protocolInfo: any = PROTOCOLS.find( -// (p) => p.name === bestPool.protocol.name, -// ); -// if (!protocolInfo) -// throw new Error(`${this.tag} Protocol info not found`); -// const protocolClass: IDapp = protocolInfo.class; -// const factoredAmount = protocolClass.getMaxFactoredOut(actions, 1.2); -// const newAmount = factoredAmount * bestPool.borrow.borrowFactor; -// const newAction: StrategyAction = { -// pool: bestPool, -// amount: newAmount.toFixed(0), -// isDeposit: false, -// }; -// return [...actions, newAction]; -// }, -// filter: [ -// this.filterStablesOnly, -// this.filterSameProtocolNotSameDepositPool, -// ], -// }, -// { -// name: 'Deposit borrowed amount to another protocol', -// optimizer: this.optimizerDeposit, -// filter: [ -// this.filterStablesOnly, -// this.filterNotSameProtocolSameDepositPool, -// ], -// }, -// ]; -// } -// } +// import CONSTANTS from '@/constants'; +// import { IDapp } from '@/store/IDapp.store'; +// import { PROTOCOLS, PoolInfo } from '@/store/pools'; +// import { IStrategy, StrategyAction } from './IStrategy'; + +// interface Step { +// name: string; +// optimizer: ( +// pools: PoolInfo[], +// amount: string, +// prevActions: StrategyAction[], +// ) => StrategyAction[]; +// filter: (( +// pools: PoolInfo[], +// amount: string, +// prevActions: StrategyAction[], +// ) => PoolInfo[])[]; +// } + +// export class SimpleStableStrategy extends IStrategy { +// tag = 'SSStrt'; +// exchanges: IDapp[] = []; + +// actions: StrategyAction[] = []; +// netYield: number = 0; +// leverage: number = 0; +// solved = false; + +// constructor() { +// const rewardTokens = [ +// { logo: CONSTANTS.LOGOS.STRK }, +// { logo: CONSTANTS.LOGOS.USDC }, +// { logo: CONSTANTS.LOGOS.USDT }, +// ]; +// super( +// `SSStrt_mm_usdc_usdt`, +// 'SSStrt', +// 'Stable loop', +// 'Loop stable-coins to maximize yield', +// rewardTokens, +// [], +// ); + +// this.steps = [ +// { +// name: 'Deposit to best pool', +// optimizer: this.optimizerDeposit, +// filter: [this.filterStablesOnly], +// }, +// { +// name: 'Borrow from same protocol keeping HF > 1.2', +// optimizer: (pools, amount, actions) => { +// let bestPool: PoolInfo = pools[0]; +// pools.forEach((p) => { +// if (p.borrow.apr < bestPool.borrow.apr) { +// bestPool = p; +// } +// }); +// const protocolInfo: any = PROTOCOLS.find( +// (p) => p.name === bestPool.protocol.name, +// ); +// if (!protocolInfo) +// throw new Error(`${this.tag} Protocol info not found`); +// const protocolClass: IDapp = protocolInfo.class; +// const factoredAmount = protocolClass.getMaxFactoredOut(actions, 1.2); +// const newAmount = factoredAmount * bestPool.borrow.borrowFactor; +// const newAction: StrategyAction = { +// pool: bestPool, +// amount: newAmount.toFixed(0), +// isDeposit: false, +// }; +// return [...actions, newAction]; +// }, +// filter: [ +// this.filterStablesOnly, +// this.filterSameProtocolNotSameDepositPool, +// ], +// }, +// { +// name: 'Deposit borrowed amount to another protocol', +// optimizer: this.optimizerDeposit, +// filter: [ +// this.filterStablesOnly, +// this.filterNotSameProtocolSameDepositPool, +// ], +// }, +// ]; +// } +// } diff --git a/src/utils.ts b/src/utils.ts old mode 100644 new mode 100755 diff --git a/src/utils/MyNumber.ts b/src/utils/MyNumber.ts old mode 100644 new mode 100755 index 93edd5d..d1c664f --- a/src/utils/MyNumber.ts +++ b/src/utils/MyNumber.ts @@ -1,113 +1,113 @@ -import BigNumber from 'bignumber.js'; -import { ethers } from 'ethers'; -const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom'); - -export default class MyNumber { - bigNumber: BigNumber; - decimals: number; - - constructor(bigNumber: string, decimals: number) { - this.bigNumber = new BigNumber(bigNumber); - this.decimals = decimals; - } - - static fromEther(num: string, decimals: number) { - try { - return new MyNumber( - Number(ethers.parseUnits(num, decimals)).toFixed(6), - decimals, - ); - } catch (e) { - console.error('fromEther', e, num, decimals); - throw e; - } - } - - static fromZero() { - return new MyNumber('0', 0); - } - - toString() { - return this.bigNumber.toFixed(); - } - - toEtherStr() { - return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals); - } - - toFixedStr(decimals: number) { - return Number(this.toEtherStr()).toFixed(decimals); - } - - toEtherToFixedDecimals(decimals: number) { - // rounding down - return ( - Math.floor(parseFloat(this.toEtherStr()) * 10 ** decimals) / - 10 ** decimals - ).toFixed(decimals); - } - - isZero() { - return this.bigNumber.eq('0'); - } - - /** - * - * @param amountEther in token terms without decimal e.g. 1 for 1 STRK - * @param command BigNumber compare funds. e.g. gte, gt, lt - * @returns - * @dev Add more commands as needed - */ - compare(amountEther: string, command: 'gte' | 'gt' | 'lt') { - const fullNum = new BigNumber( - ethers.parseUnits(amountEther, this.decimals).toString(), +import BigNumber from 'bignumber.js'; +import { ethers } from 'ethers'; +const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom'); + +export default class MyNumber { + bigNumber: BigNumber; + decimals: number; + + constructor(bigNumber: string, decimals: number) { + this.bigNumber = new BigNumber(bigNumber); + this.decimals = decimals; + } + + static fromEther(num: string, decimals: number) { + try { + return new MyNumber( + Number(ethers.parseUnits(num, decimals)).toFixed(6), + decimals, + ); + } catch (e) { + console.error('fromEther', e, num, decimals); + throw e; + } + } + + static fromZero() { + return new MyNumber('0', 0); + } + + toString() { + return this.bigNumber.toFixed(); + } + + toEtherStr() { + return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals); + } + + toFixedStr(decimals: number) { + return Number(this.toEtherStr()).toFixed(decimals); + } + + toEtherToFixedDecimals(decimals: number) { + // rounding down + return ( + Math.floor(parseFloat(this.toEtherStr()) * 10 ** decimals) / + 10 ** decimals + ).toFixed(decimals); + } + + isZero() { + return this.bigNumber.eq('0'); + } + + /** + * + * @param amountEther in token terms without decimal e.g. 1 for 1 STRK + * @param command BigNumber compare funds. e.g. gte, gt, lt + * @returns + * @dev Add more commands as needed + */ + compare(amountEther: string, command: 'gte' | 'gt' | 'lt') { + const fullNum = new BigNumber( + ethers.parseUnits(amountEther, this.decimals).toString(), + ); + return this.bigNumber[command](fullNum); + } + + operate(command: 'div' | 'plus', value: string | number) { + const bn = new BigNumber(Number(value).toFixed(6)); + return new MyNumber(this.bigNumber[command](bn).toFixed(0), this.decimals); + } + + subtract(value: MyNumber) { + const bn = this.bigNumber.minus(value.bigNumber); + return new MyNumber(bn.toString(), this.decimals); + } + + static min(a: MyNumber, b: MyNumber) { + if (a.decimals !== b.decimals) { + const diff = Math.abs(a.decimals - b.decimals); + if (a.decimals > b.decimals) { + b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); + } else { + a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); + } + } + const bn = BigNumber.min(a.bigNumber, b.bigNumber); + return new MyNumber( + bn.toString(), + a.decimals > b.decimals ? a.decimals : b.decimals, + ); + } + + static max(a: MyNumber, b: MyNumber) { + if (a.decimals !== b.decimals) { + const diff = Math.abs(a.decimals - b.decimals); + if (a.decimals > b.decimals) { + b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); + } else { + a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); + } + } + const bn = BigNumber.max(a.bigNumber, b.bigNumber); + return new MyNumber( + bn.toString(), + a.decimals > b.decimals ? a.decimals : b.decimals, ); - return this.bigNumber[command](fullNum); - } - - operate(command: 'div' | 'plus', value: string | number) { - const bn = new BigNumber(Number(value).toFixed(6)); - return new MyNumber(this.bigNumber[command](bn).toFixed(0), this.decimals); - } - - subtract(value: MyNumber) { - const bn = this.bigNumber.minus(value.bigNumber); - return new MyNumber(bn.toString(), this.decimals); - } - - static min(a: MyNumber, b: MyNumber) { - if (a.decimals !== b.decimals) { - const diff = Math.abs(a.decimals - b.decimals); - if (a.decimals > b.decimals) { - b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); - } else { - a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); - } - } - const bn = BigNumber.min(a.bigNumber, b.bigNumber); - return new MyNumber( - bn.toString(), - a.decimals > b.decimals ? a.decimals : b.decimals, - ); - } - - static max(a: MyNumber, b: MyNumber) { - if (a.decimals !== b.decimals) { - const diff = Math.abs(a.decimals - b.decimals); - if (a.decimals > b.decimals) { - b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); - } else { - a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); - } - } - const bn = BigNumber.max(a.bigNumber, b.bigNumber); - return new MyNumber( - bn.toString(), - a.decimals > b.decimals ? a.decimals : b.decimals, - ); - } - - [customInspectSymbol](depth: any, inspectOptions: any, inspect: any) { - return JSON.stringify({ raw: this.toString(), decimals: this.decimals }); - } -} + } + + [customInspectSymbol](depth: any, inspectOptions: any, inspect: any) { + return JSON.stringify({ raw: this.toString(), decimals: this.decimals }); + } +} diff --git a/src/utils/useWindowSize.ts b/src/utils/useWindowSize.ts old mode 100644 new mode 100755 diff --git a/tailwind.config.ts b/tailwind.config.ts old mode 100644 new mode 100755 diff --git a/tsconfig.json b/tsconfig.json old mode 100644 new mode 100755 index dd29771..c783c56 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,28 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "sourceMap": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"], - "@public/*": ["./public/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "sourceMap": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"], + "@public/*": ["./public/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock old mode 100644 new mode 100755 index 4b1d7db..5985975 --- a/yarn.lock +++ b/yarn.lock @@ -1,6591 +1,6591 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@adraffy/ens-normalize@1.10.1": - version "1.10.1" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz" - integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== - -"@ajna/pagination@1.4.19": - version "1.4.19" - resolved "https://registry.yarnpkg.com/@ajna/pagination/-/pagination-1.4.19.tgz#2eae0f9321a540490918395a40ad21531035e561" - integrity sha512-QnrERhw1fhAVst1pBrXyPruJphbrLnIYcHf5bpWS7IhtK3tKljTPQ8/UbUsroJ6oAqHCp9X9nLi49PT+xw/hXw== - dependencies: - framer-motion "^6.3.11" - lodash.union "^4.6.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.21.4": - version "7.23.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/helper-module-imports@^7.16.7": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.24.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" - integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/types@^7.22.15": - version "7.24.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@chakra-ui/accordion@2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz" - integrity sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag== - dependencies: - "@chakra-ui/descendant" "3.1.0" - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/transition" "2.1.0" - -"@chakra-ui/alert@2.2.2": - version "2.2.2" - resolved "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz" - integrity sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw== - dependencies: - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/spinner" "2.1.0" - -"@chakra-ui/anatomy@2.2.2": - version "2.2.2" - resolved "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz" - integrity sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg== - -"@chakra-ui/avatar@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz" - integrity sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g== - dependencies: - "@chakra-ui/image" "2.1.0" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/breadcrumb@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz" - integrity sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA== - dependencies: - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/breakpoint-utils@2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz" - integrity sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/button@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz" - integrity sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA== - dependencies: - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/spinner" "2.1.0" - -"@chakra-ui/card@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz" - integrity sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/checkbox@2.3.2": - version "2.3.2" - resolved "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz" - integrity sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g== - dependencies: - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-callback-ref" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/visually-hidden" "2.2.0" - "@zag-js/focus-visible" "0.16.0" - -"@chakra-ui/clickable@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz" - integrity sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw== - dependencies: - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/close-button@2.1.1": - version "2.1.1" - resolved "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz" - integrity sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw== - dependencies: - "@chakra-ui/icon" "3.2.0" - -"@chakra-ui/color-mode@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz" - integrity sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg== - dependencies: - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - -"@chakra-ui/control-box@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz" - integrity sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg== - -"@chakra-ui/counter@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz" - integrity sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw== - dependencies: - "@chakra-ui/number-utils" "2.0.7" - "@chakra-ui/react-use-callback-ref" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/css-reset@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz" - integrity sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg== - -"@chakra-ui/descendant@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz" - integrity sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ== - dependencies: - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - -"@chakra-ui/dom-utils@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz" - integrity sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ== - -"@chakra-ui/editable@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz" - integrity sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg== - dependencies: - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-callback-ref" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/event-utils@2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz" - integrity sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw== - -"@chakra-ui/focus-lock@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz" - integrity sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w== - dependencies: - "@chakra-ui/dom-utils" "2.1.0" - react-focus-lock "^2.9.4" - -"@chakra-ui/form-control@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz" - integrity sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw== - dependencies: - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/hooks@2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz" - integrity sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ== - dependencies: - "@chakra-ui/react-utils" "2.0.12" - "@chakra-ui/utils" "2.0.15" - compute-scroll-into-view "3.0.3" - copy-to-clipboard "3.3.3" - -"@chakra-ui/icon@3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz" - integrity sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/icons@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.1.1.tgz#58ff0f9e703f2f4f89debd600ce4e438f43f9c9a" - integrity sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g== - dependencies: - "@chakra-ui/icon" "3.2.0" - -"@chakra-ui/image@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz" - integrity sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA== - dependencies: - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/input@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz" - integrity sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw== - dependencies: - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/object-utils" "2.1.0" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/layout@2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz" - integrity sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg== - dependencies: - "@chakra-ui/breakpoint-utils" "2.0.8" - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/object-utils" "2.1.0" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/lazy-utils@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz" - integrity sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg== - -"@chakra-ui/live-region@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz" - integrity sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw== - -"@chakra-ui/media-query@3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz" - integrity sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g== - dependencies: - "@chakra-ui/breakpoint-utils" "2.0.8" - "@chakra-ui/react-env" "3.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/menu@2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz" - integrity sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g== - dependencies: - "@chakra-ui/clickable" "2.1.0" - "@chakra-ui/descendant" "3.1.0" - "@chakra-ui/lazy-utils" "2.0.5" - "@chakra-ui/popper" "3.1.0" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-animation-state" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-disclosure" "2.1.0" - "@chakra-ui/react-use-focus-effect" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-outside-click" "2.2.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/transition" "2.1.0" - -"@chakra-ui/modal@2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz" - integrity sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ== - dependencies: - "@chakra-ui/close-button" "2.1.1" - "@chakra-ui/focus-lock" "2.1.0" - "@chakra-ui/portal" "2.1.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/transition" "2.1.0" - aria-hidden "^1.2.3" - react-remove-scroll "^2.5.6" - -"@chakra-ui/number-input@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz" - integrity sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA== - dependencies: - "@chakra-ui/counter" "2.1.0" - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-callback-ref" "2.1.0" - "@chakra-ui/react-use-event-listener" "2.1.0" - "@chakra-ui/react-use-interval" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/number-utils@2.0.7": - version "2.0.7" - resolved "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz" - integrity sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg== - -"@chakra-ui/object-utils@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz" - integrity sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ== - -"@chakra-ui/pin-input@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz" - integrity sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw== - dependencies: - "@chakra-ui/descendant" "3.1.0" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/popover@2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz" - integrity sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg== - dependencies: - "@chakra-ui/close-button" "2.1.1" - "@chakra-ui/lazy-utils" "2.0.5" - "@chakra-ui/popper" "3.1.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-animation-state" "2.1.0" - "@chakra-ui/react-use-disclosure" "2.1.0" - "@chakra-ui/react-use-focus-effect" "2.1.0" - "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/popper@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz" - integrity sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg== - dependencies: - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@popperjs/core" "^2.9.3" - -"@chakra-ui/portal@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz" - integrity sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg== - dependencies: - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - -"@chakra-ui/progress@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz" - integrity sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ== - dependencies: - "@chakra-ui/react-context" "2.1.0" - -"@chakra-ui/provider@2.4.2": - version "2.4.2" - resolved "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz" - integrity sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw== - dependencies: - "@chakra-ui/css-reset" "2.3.0" - "@chakra-ui/portal" "2.1.0" - "@chakra-ui/react-env" "3.1.0" - "@chakra-ui/system" "2.6.2" - "@chakra-ui/utils" "2.0.15" - -"@chakra-ui/radio@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz" - integrity sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w== - dependencies: - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@zag-js/focus-visible" "0.16.0" - -"@chakra-ui/react-children-utils@2.0.6": - version "2.0.6" - resolved "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz" - integrity sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA== - -"@chakra-ui/react-context@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz" - integrity sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w== - -"@chakra-ui/react-env@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz" - integrity sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw== - dependencies: - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - -"@chakra-ui/react-types@2.0.7": - version "2.0.7" - resolved "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz" - integrity sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ== - -"@chakra-ui/react-use-animation-state@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz" - integrity sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg== - dependencies: - "@chakra-ui/dom-utils" "2.1.0" - "@chakra-ui/react-use-event-listener" "2.1.0" - -"@chakra-ui/react-use-callback-ref@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz" - integrity sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ== - -"@chakra-ui/react-use-controllable-state@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz" - integrity sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-disclosure@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz" - integrity sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-event-listener@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz" - integrity sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-focus-effect@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz" - integrity sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ== - dependencies: - "@chakra-ui/dom-utils" "2.1.0" - "@chakra-ui/react-use-event-listener" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - -"@chakra-ui/react-use-focus-on-pointer-down@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz" - integrity sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg== - dependencies: - "@chakra-ui/react-use-event-listener" "2.1.0" - -"@chakra-ui/react-use-interval@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz" - integrity sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-latest-ref@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz" - integrity sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ== - -"@chakra-ui/react-use-merge-refs@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz" - integrity sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ== - -"@chakra-ui/react-use-outside-click@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz" - integrity sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-pan-event@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz" - integrity sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg== - dependencies: - "@chakra-ui/event-utils" "2.0.8" - "@chakra-ui/react-use-latest-ref" "2.1.0" - framesync "6.1.2" - -"@chakra-ui/react-use-previous@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz" - integrity sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg== - -"@chakra-ui/react-use-safe-layout-effect@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz" - integrity sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw== - -"@chakra-ui/react-use-size@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz" - integrity sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A== - dependencies: - "@zag-js/element-size" "0.10.5" - -"@chakra-ui/react-use-timeout@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz" - integrity sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ== - dependencies: - "@chakra-ui/react-use-callback-ref" "2.1.0" - -"@chakra-ui/react-use-update-effect@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz" - integrity sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA== - -"@chakra-ui/react-utils@2.0.12": - version "2.0.12" - resolved "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz" - integrity sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw== - dependencies: - "@chakra-ui/utils" "2.0.15" - -"@chakra-ui/react@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.8.2.tgz#94d692fb35e4447748c5bfd73d8d38a746193c7d" - integrity sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ== - dependencies: - "@chakra-ui/accordion" "2.3.1" - "@chakra-ui/alert" "2.2.2" - "@chakra-ui/avatar" "2.3.0" - "@chakra-ui/breadcrumb" "2.2.0" - "@chakra-ui/button" "2.1.0" - "@chakra-ui/card" "2.2.0" - "@chakra-ui/checkbox" "2.3.2" - "@chakra-ui/close-button" "2.1.1" - "@chakra-ui/control-box" "2.1.0" - "@chakra-ui/counter" "2.1.0" - "@chakra-ui/css-reset" "2.3.0" - "@chakra-ui/editable" "3.1.0" - "@chakra-ui/focus-lock" "2.1.0" - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/hooks" "2.2.1" - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/image" "2.1.0" - "@chakra-ui/input" "2.1.2" - "@chakra-ui/layout" "2.3.1" - "@chakra-ui/live-region" "2.1.0" - "@chakra-ui/media-query" "3.3.0" - "@chakra-ui/menu" "2.2.1" - "@chakra-ui/modal" "2.3.1" - "@chakra-ui/number-input" "2.1.2" - "@chakra-ui/pin-input" "2.1.0" - "@chakra-ui/popover" "2.2.1" - "@chakra-ui/popper" "3.1.0" - "@chakra-ui/portal" "2.1.0" - "@chakra-ui/progress" "2.2.0" - "@chakra-ui/provider" "2.4.2" - "@chakra-ui/radio" "2.1.2" - "@chakra-ui/react-env" "3.1.0" - "@chakra-ui/select" "2.1.2" - "@chakra-ui/skeleton" "2.1.0" - "@chakra-ui/skip-nav" "2.1.0" - "@chakra-ui/slider" "2.1.0" - "@chakra-ui/spinner" "2.1.0" - "@chakra-ui/stat" "2.1.1" - "@chakra-ui/stepper" "2.3.1" - "@chakra-ui/styled-system" "2.9.2" - "@chakra-ui/switch" "2.1.2" - "@chakra-ui/system" "2.6.2" - "@chakra-ui/table" "2.1.0" - "@chakra-ui/tabs" "3.0.0" - "@chakra-ui/tag" "3.1.1" - "@chakra-ui/textarea" "2.1.2" - "@chakra-ui/theme" "3.3.1" - "@chakra-ui/theme-utils" "2.0.21" - "@chakra-ui/toast" "7.0.2" - "@chakra-ui/tooltip" "2.3.1" - "@chakra-ui/transition" "2.1.0" - "@chakra-ui/utils" "2.0.15" - "@chakra-ui/visually-hidden" "2.2.0" - -"@chakra-ui/select@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz" - integrity sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA== - dependencies: - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/shared-utils@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz" - integrity sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q== - -"@chakra-ui/skeleton@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz" - integrity sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ== - dependencies: - "@chakra-ui/media-query" "3.3.0" - "@chakra-ui/react-use-previous" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/skip-nav@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz" - integrity sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug== - -"@chakra-ui/slider@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz" - integrity sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ== - dependencies: - "@chakra-ui/number-utils" "2.0.7" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-callback-ref" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-latest-ref" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-pan-event" "2.1.0" - "@chakra-ui/react-use-size" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - -"@chakra-ui/spinner@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz" - integrity sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/stat@2.1.1": - version "2.1.1" - resolved "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz" - integrity sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q== - dependencies: - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/stepper@2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz" - integrity sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q== - dependencies: - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/styled-system@2.9.2": - version "2.9.2" - resolved "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz" - integrity sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - csstype "^3.1.2" - lodash.mergewith "4.6.2" - -"@chakra-ui/switch@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz" - integrity sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA== - dependencies: - "@chakra-ui/checkbox" "2.3.2" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/system@2.6.2": - version "2.6.2" - resolved "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz" - integrity sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ== - dependencies: - "@chakra-ui/color-mode" "2.2.0" - "@chakra-ui/object-utils" "2.1.0" - "@chakra-ui/react-utils" "2.0.12" - "@chakra-ui/styled-system" "2.9.2" - "@chakra-ui/theme-utils" "2.0.21" - "@chakra-ui/utils" "2.0.15" - react-fast-compare "3.2.2" - -"@chakra-ui/table@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz" - integrity sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ== - dependencies: - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/tabs@3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz" - integrity sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw== - dependencies: - "@chakra-ui/clickable" "2.1.0" - "@chakra-ui/descendant" "3.1.0" - "@chakra-ui/lazy-utils" "2.0.5" - "@chakra-ui/react-children-utils" "2.0.6" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-controllable-state" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/react-use-safe-layout-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/tag@3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz" - integrity sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ== - dependencies: - "@chakra-ui/icon" "3.2.0" - "@chakra-ui/react-context" "2.1.0" - -"@chakra-ui/textarea@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz" - integrity sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA== - dependencies: - "@chakra-ui/form-control" "2.2.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/theme-tools@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz" - integrity sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA== - dependencies: - "@chakra-ui/anatomy" "2.2.2" - "@chakra-ui/shared-utils" "2.0.5" - color2k "^2.0.2" - -"@chakra-ui/theme-utils@2.0.21": - version "2.0.21" - resolved "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz" - integrity sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/styled-system" "2.9.2" - "@chakra-ui/theme" "3.3.1" - lodash.mergewith "4.6.2" - -"@chakra-ui/theme@3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz" - integrity sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ== - dependencies: - "@chakra-ui/anatomy" "2.2.2" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/theme-tools" "2.1.2" - -"@chakra-ui/toast@7.0.2": - version "7.0.2" - resolved "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz" - integrity sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA== - dependencies: - "@chakra-ui/alert" "2.2.2" - "@chakra-ui/close-button" "2.1.1" - "@chakra-ui/portal" "2.1.0" - "@chakra-ui/react-context" "2.1.0" - "@chakra-ui/react-use-timeout" "2.1.0" - "@chakra-ui/react-use-update-effect" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - "@chakra-ui/styled-system" "2.9.2" - "@chakra-ui/theme" "3.3.1" - -"@chakra-ui/tooltip@2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz" - integrity sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A== - dependencies: - "@chakra-ui/dom-utils" "2.1.0" - "@chakra-ui/popper" "3.1.0" - "@chakra-ui/portal" "2.1.0" - "@chakra-ui/react-types" "2.0.7" - "@chakra-ui/react-use-disclosure" "2.1.0" - "@chakra-ui/react-use-event-listener" "2.1.0" - "@chakra-ui/react-use-merge-refs" "2.1.0" - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/transition@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz" - integrity sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ== - dependencies: - "@chakra-ui/shared-utils" "2.0.5" - -"@chakra-ui/utils@2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz" - integrity sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA== - dependencies: - "@types/lodash.mergewith" "4.6.7" - css-box-model "1.2.1" - framesync "6.1.2" - lodash.mergewith "4.6.2" - -"@chakra-ui/visually-hidden@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz" - integrity sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ== - -"@emnapi/runtime@^1.1.1": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" - integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== - dependencies: - tslib "^2.4.0" - -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - stylis "4.2.0" - -"@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== - -"@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/is-prop-valid@^1.2.1": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" - integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/react@11.11.3": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" - integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - hoist-non-react-statics "^3.3.1" - -"@emotion/react@^11.10.5", "@emotion/react@^11.8.1": - version "11.11.4" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" - integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz" - integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== - dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== - -"@emotion/styled@11.11.0", "@emotion/styled@^11.10.5": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" - integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/serialize" "^1.1.2" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== - -"@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== - -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0": - version "4.10.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@floating-ui/core@^1.0.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== - dependencies: - "@floating-ui/utils" "^0.2.1" - -"@floating-ui/dom@^1.0.1": - version "1.6.3" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== - dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" - -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@hutson/parse-repository-url@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz" - integrity sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg== - -"@img/sharp-darwin-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz#a1cf4a7febece334f16e0328b9689f05797d7aec" - integrity sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA== - optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.0.2" - -"@img/sharp-darwin-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz#f77be2d7c3609d3e77cd337b199a772e07b87bd2" - integrity sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.2" - -"@img/sharp-libvips-darwin-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz#b69f49fecbe9572378675769b189410721b0fa53" - integrity sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA== - -"@img/sharp-libvips-darwin-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz#5665da7360d8e5ed7bee314491c8fe736b6a3c39" - integrity sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw== - -"@img/sharp-libvips-linux-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz#8a05e5e9e9b760ff46561e32f19bd5e035fa881c" - integrity sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw== - -"@img/sharp-libvips-linux-arm@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz#0fd33b9bf3221948ce0ca7a5a725942626577a03" - integrity sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw== - -"@img/sharp-libvips-linux-s390x@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz#4b89150ec91b256ee2cbb5bb125321bf029a4770" - integrity sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog== - -"@img/sharp-libvips-linux-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz#947ccc22ca5bc8c8cfe921b39a5fdaebc5e39f3f" - integrity sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz#821d58ce774f0f8bed065b69913a62f65d512f2f" - integrity sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ== - -"@img/sharp-libvips-linuxmusl-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz#4309474bd8b728a61af0b3b4fad0c476b5f3ccbe" - integrity sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw== - -"@img/sharp-linux-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz#bd390113e256487041411b988ded13a26cfc5f95" - integrity sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.2" - -"@img/sharp-linux-arm@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz#14ecc81f38f75fb4cd7571bc83311746d6745fca" - integrity sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.2" - -"@img/sharp-linux-s390x@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz#119e8081e2c6741b5ac908fe02244e4c559e525f" - integrity sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.2" - -"@img/sharp-linux-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz#21d4c137b8da9a313b069ff5c920ded709f853d7" - integrity sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.2" - -"@img/sharp-linuxmusl-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz#f3fde68fd67b85a32da6f1155818c3b58b8e7ae0" - integrity sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" - -"@img/sharp-linuxmusl-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz#44373724aecd7b69900e0578228144e181db7892" - integrity sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.2" - -"@img/sharp-wasm32@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz#88e3f18d7e7cd8cfe1af98e9963db4d7b6491435" - integrity sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ== - dependencies: - "@emnapi/runtime" "^1.1.1" - -"@img/sharp-win32-ia32@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz#b1c772dd2952e983980b1eb85808fa8129484d46" - integrity sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw== - -"@img/sharp-win32-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz#106f911134035b4157ec92a0c154a6b6f88fa4c1" - integrity sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@motionone/animation@^10.12.0": - version "10.17.0" - resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.17.0.tgz" - integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== - dependencies: - "@motionone/easing" "^10.17.0" - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/dom@10.12.0": - version "10.12.0" - resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" - integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== - dependencies: - "@motionone/animation" "^10.12.0" - "@motionone/generators" "^10.12.0" - "@motionone/types" "^10.12.0" - "@motionone/utils" "^10.12.0" - hey-listen "^1.0.8" - tslib "^2.3.1" - -"@motionone/easing@^10.17.0": - version "10.17.0" - resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.17.0.tgz" - integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== - dependencies: - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/generators@^10.12.0": - version "10.17.0" - resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.17.0.tgz" - integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== - dependencies: - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" - tslib "^2.3.1" - -"@motionone/types@^10.12.0", "@motionone/types@^10.17.0": - version "10.17.0" - resolved "https://registry.npmjs.org/@motionone/types/-/types-10.17.0.tgz" - integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== - -"@motionone/utils@^10.12.0", "@motionone/utils@^10.17.0": - version "10.17.0" - resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.17.0.tgz" - integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== - dependencies: - "@motionone/types" "^10.17.0" - hey-listen "^1.0.8" - tslib "^2.3.1" - -"@next/env@14.1.0": - version "14.1.0" - resolved "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz" - integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== - -"@next/eslint-plugin-next@14.1.0": - version "14.1.0" - resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz" - integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" - integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== - -"@next/swc-darwin-x64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" - integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== - -"@next/swc-linux-arm64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" - integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== - -"@next/swc-linux-arm64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" - integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== - -"@next/swc-linux-x64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz" - integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== - -"@next/swc-linux-x64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz" - integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== - -"@next/swc-win32-arm64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" - integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== - -"@next/swc-win32-ia32-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" - integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== - -"@next/swc-win32-x64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" - integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== - -"@next/third-parties@14.1.3": - version "14.1.3" - resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.1.3.tgz#5e14d1873638be10cbf2bb4f73038012f2131120" - integrity sha512-c3l0JnJzB5L2xXWK9DbH6nFpV1Z9vPFCiFan5l/pbwHjWGKxS8Q532MLAOW6EHB00vhCre8F/okBjGyPAGYpnw== - dependencies: - third-party-capital "1.0.20" - -"@nikolovlazar/chakra-ui-prose@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@nikolovlazar/chakra-ui-prose/-/chakra-ui-prose-1.2.1.tgz#1271da3b35ada4a2b4346f38604ff30136ee94ee" - integrity sha512-I8EZiKDGkOnzBOkPquLWir1gvHoKpo7x23O+VusK2WhPcWtgR7p56On+e/QPMCitMbV4xW997ecivCohOxGk9Q== - -"@noble/curves@1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/curves@~1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz" - integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== - dependencies: - "@noble/hashes" "1.3.3" - -"@noble/hashes@1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - -"@noble/hashes@1.3.3", "@noble/hashes@~1.3.3": - version "1.3.3" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@parcel/watcher-android-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" - integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== - -"@parcel/watcher-darwin-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" - integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== - -"@parcel/watcher-darwin-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" - integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== - -"@parcel/watcher-freebsd-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" - integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== - -"@parcel/watcher-linux-arm-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" - integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== - -"@parcel/watcher-linux-arm64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" - integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== - -"@parcel/watcher-linux-arm64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" - integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== - -"@parcel/watcher-linux-x64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz" - integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== - -"@parcel/watcher-linux-x64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz" - integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== - -"@parcel/watcher-wasm@^2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz" - integrity sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA== - dependencies: - is-glob "^4.0.3" - micromatch "^4.0.5" - napi-wasm "^1.1.0" - -"@parcel/watcher-win32-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" - integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== - -"@parcel/watcher-win32-ia32@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" - integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== - -"@parcel/watcher-win32-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" - integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== - -"@parcel/watcher@^2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz" - integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== - dependencies: - detect-libc "^1.0.3" - is-glob "^4.0.3" - micromatch "^4.0.5" - node-addon-api "^7.0.0" - optionalDependencies: - "@parcel/watcher-android-arm64" "2.4.1" - "@parcel/watcher-darwin-arm64" "2.4.1" - "@parcel/watcher-darwin-x64" "2.4.1" - "@parcel/watcher-freebsd-x64" "2.4.1" - "@parcel/watcher-linux-arm-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-musl" "2.4.1" - "@parcel/watcher-linux-x64-glibc" "2.4.1" - "@parcel/watcher-linux-x64-musl" "2.4.1" - "@parcel/watcher-win32-arm64" "2.4.1" - "@parcel/watcher-win32-ia32" "2.4.1" - "@parcel/watcher-win32-x64" "2.4.1" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@popperjs/core@^2.11.6", "@popperjs/core@^2.9.3": - version "2.11.8" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@rushstack/eslint-patch@^1.3.3": - version "1.7.2" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz" - integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== - -"@scure/base@~1.1.3": - version "1.1.5" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz" - integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== - -"@scure/starknet@~1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.0.0.tgz" - integrity sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg== - dependencies: - "@noble/curves" "~1.3.0" - "@noble/hashes" "~1.3.3" - -"@stablelib/aead@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz" - integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== - -"@stablelib/binary@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz" - integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== - dependencies: - "@stablelib/int" "^1.0.1" - -"@stablelib/bytes@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz" - integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== - -"@stablelib/chacha20poly1305@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz" - integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== - dependencies: - "@stablelib/aead" "^1.0.1" - "@stablelib/binary" "^1.0.1" - "@stablelib/chacha" "^1.0.1" - "@stablelib/constant-time" "^1.0.1" - "@stablelib/poly1305" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/chacha@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz" - integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/constant-time@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz" - integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== - -"@stablelib/ed25519@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz" - integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== - dependencies: - "@stablelib/random" "^1.0.2" - "@stablelib/sha512" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/hash@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz" - integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== - -"@stablelib/hkdf@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz" - integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== - dependencies: - "@stablelib/hash" "^1.0.1" - "@stablelib/hmac" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/hmac@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz" - integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== - dependencies: - "@stablelib/constant-time" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/int@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz" - integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== - -"@stablelib/keyagreement@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz" - integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== - dependencies: - "@stablelib/bytes" "^1.0.1" - -"@stablelib/poly1305@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz" - integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== - dependencies: - "@stablelib/constant-time" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz" - integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/sha256@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz" - integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/sha512@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz" - integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/hash" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/wipe@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz" - integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== - -"@stablelib/x25519@1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz" - integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== - dependencies: - "@stablelib/keyagreement" "^1.0.1" - "@stablelib/random" "^1.0.2" - "@stablelib/wipe" "^1.0.1" - -"@starknet-react/chains@0.1.7", "@starknet-react/chains@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@starknet-react/chains/-/chains-0.1.7.tgz#58503379e2ffabe33b4f6e0f2aef775e84745a4d" - integrity sha512-UNh97I1SvuJKaAhKOmpEk8JcWuZWMlPG/ba2HcvFYL9x/47BKndJ+Da9V+iJFtkHUjreVnajT1snsaz1XMG+UQ== - -"@starknet-react/core@2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@starknet-react/core/-/core-2.8.0.tgz#5ad0ff09ec2095a17e285cd6d736ff6303f4a3ff" - integrity sha512-fTvTK/YdXLjb/sJ61Z1JpdO0CjtRgsfF4MTh4QioPmmqWCcOyLtoPipgxMDLDMTzNEsqxrDYjZfhYPHqUyoaag== - dependencies: - "@starknet-react/chains" "^0.1.7" - "@tanstack/react-query" "^5.0.1" - eventemitter3 "^5.0.1" - immutable "^4.3.4" - zod "^3.22.2" - -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== - dependencies: - tslib "^2.4.0" - -"@tanstack/query-core@5.28.0": - version "5.28.0" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.0.tgz" - integrity sha512-BfltXqnoIAXTCFrQCu40M3Ch7odQ6IJraTy0t8n12jAwXMYKIgDwOBWTqkSUYD+vxMi8Ag0+9F8lw9wZKhi2Yg== - -"@tanstack/react-query@^5.0.1": - version "5.28.0" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.28.0.tgz" - integrity sha512-nF4E4rFMQdh30gECGkTfyzgjgfSr4MLVgYoIsf7KqVkjUjEQHPpi9jyx10kO3Yq/OQMKOLMHAzD31st/lxDPbQ== - dependencies: - "@tanstack/query-core" "5.28.0" - -"@trpc/client@^10.38.1": - version "10.45.2" - resolved "https://registry.npmjs.org/@trpc/client/-/client-10.45.2.tgz" - integrity sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg== - -"@trpc/server@^10.38.1": - version "10.45.2" - resolved "https://registry.npmjs.org/@trpc/server/-/server-10.45.2.tgz" - integrity sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg== - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.mergewith@4.6.7": - version "4.6.7" - resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz" - integrity sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.17.0" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz" - integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== - -"@types/mixpanel-browser@2.49.0": - version "2.49.0" - resolved "https://registry.yarnpkg.com/@types/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz#ad92ecc36fad63b9c0aed80b6283d86dbf52e49e" - integrity sha512-StmgUnS58d44DmIAEX9Kk8qwisAYCl6E2qulIjYyHXUPuJCPOuyUMTTKBp+aU2F2do+kxAzCxiBtsB4fnBT9Fg== - -"@types/mustache@4.2.5": - version "4.2.5" - resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.5.tgz#9129f0d6857f976e00e171bbb3460e4b702f84ef" - integrity sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA== - -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - -"@types/node@20": - version "20.14.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.7.tgz#342cada27f97509eb8eb2dbc003edf21ce8ab5a8" - integrity sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.1": - version "2.4.4" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prop-types@*": - version "15.7.11" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== - -"@types/react-dom@18": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.4.0": - version "4.4.10" - resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.2.65" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz" - integrity sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@18": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - -"@types/semver@^7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@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" - integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/type-utils" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" - integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== - dependencies: - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - debug "^4.3.4" - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/scope-manager@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" - integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== - dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - -"@typescript-eslint/type-utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" - integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== - dependencies: - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/types@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" - integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/typescript-estree@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" - integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== - dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" - integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - semver "^7.6.0" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@typescript-eslint/visitor-keys@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" - integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== - dependencies: - "@typescript-eslint/types" "7.7.0" - eslint-visitor-keys "^3.4.3" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vercel/analytics@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-1.2.2.tgz#715d8f203a170c06ba36b363e03b048c03060d5d" - integrity sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A== - dependencies: - server-only "^0.0.1" - -"@vercel/speed-insights@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@vercel/speed-insights/-/speed-insights-1.0.12.tgz#71c2edffdedae98d34e306d7b0a573e6816898b4" - integrity sha512-ZGQ+a7bcfWJD2VYEp2R1LHvRAMyyaFBYytZXsfnbOMkeOvzGNVxUL7aVUvisIrTZjXTSsxG45DKX7yiw6nq2Jw== - -"@walletconnect/core@2.13.1": - version "2.13.1" - resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.13.1.tgz" - integrity sha512-h0MSYKJu9i1VEs5koCTT7c5YeQ1Kj0ncTFiMqANbDnB1r3mBulXn+FKtZ2fCmf1j7KDpgluuUzpSs+sQfPcv4Q== - dependencies: - "@walletconnect/heartbeat" "1.2.2" - "@walletconnect/jsonrpc-provider" "1.0.14" - "@walletconnect/jsonrpc-types" "1.0.4" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/jsonrpc-ws-connection" "1.0.14" - "@walletconnect/keyvaluestorage" "1.1.1" - "@walletconnect/logger" "2.1.2" - "@walletconnect/relay-api" "1.0.10" - "@walletconnect/relay-auth" "1.0.4" - "@walletconnect/safe-json" "1.0.2" - "@walletconnect/time" "1.0.2" - "@walletconnect/types" "2.13.1" - "@walletconnect/utils" "2.13.1" - events "3.3.0" - isomorphic-unfetch "3.1.0" - lodash.isequal "4.5.0" - uint8arrays "3.1.0" - -"@walletconnect/environment@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz" - integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== - dependencies: - tslib "1.14.1" - -"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz" - integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== - dependencies: - keyvaluestorage-interface "^1.0.0" - tslib "1.14.1" - -"@walletconnect/heartbeat@1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz" - integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw== - dependencies: - "@walletconnect/events" "^1.0.1" - "@walletconnect/time" "^1.0.2" - events "^3.3.0" - -"@walletconnect/jsonrpc-provider@1.0.14": - version "1.0.14" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz" - integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== - dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.8" - "@walletconnect/safe-json" "^1.0.2" - events "^3.3.0" - -"@walletconnect/jsonrpc-types@1.0.4", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": - version "1.0.4" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz" - integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== - dependencies: - events "^3.3.0" - keyvaluestorage-interface "^1.0.0" - -"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz" - integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== - dependencies: - "@walletconnect/environment" "^1.0.1" - "@walletconnect/jsonrpc-types" "^1.0.3" - tslib "1.14.1" - -"@walletconnect/jsonrpc-ws-connection@1.0.14": - version "1.0.14" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz" - integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== - dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.6" - "@walletconnect/safe-json" "^1.0.2" - events "^3.3.0" - ws "^7.5.1" - -"@walletconnect/keyvaluestorage@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz" - integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== - dependencies: - "@walletconnect/safe-json" "^1.0.1" - idb-keyval "^6.2.1" - unstorage "^1.9.0" - -"@walletconnect/logger@2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz" - integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== - dependencies: - "@walletconnect/safe-json" "^1.0.2" - pino "7.11.0" - -"@walletconnect/relay-api@1.0.10": - version "1.0.10" - resolved "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.10.tgz" - integrity sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw== - dependencies: - "@walletconnect/jsonrpc-types" "^1.0.2" - -"@walletconnect/relay-auth@1.0.4": - version "1.0.4" - resolved "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz" - integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== - dependencies: - "@stablelib/ed25519" "^1.0.2" - "@stablelib/random" "^1.0.1" - "@walletconnect/safe-json" "^1.0.1" - "@walletconnect/time" "^1.0.2" - tslib "1.14.1" - uint8arrays "^3.0.0" - -"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz" - integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== - dependencies: - tslib "1.14.1" - -"@walletconnect/sign-client@^2.10.1": - version "2.13.1" - resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.13.1.tgz" - integrity sha512-e+dcqcLsedB4ZjnePFM5Cy8oxu0dyz5iZfhfKH/MOrQV/hyhZ+hJwh4MmkO2QyEu2PERKs9o2Uc6x8RZdi0UAQ== - dependencies: - "@walletconnect/core" "2.13.1" - "@walletconnect/events" "1.0.1" - "@walletconnect/heartbeat" "1.2.2" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/logger" "2.1.2" - "@walletconnect/time" "1.0.2" - "@walletconnect/types" "2.13.1" - "@walletconnect/utils" "2.13.1" - events "3.3.0" - -"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz" - integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== - dependencies: - tslib "1.14.1" - -"@walletconnect/types@2.13.1": - version "2.13.1" - resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.13.1.tgz" - integrity sha512-CIrdt66d38xdunGCy5peOOP17EQkCEGKweXc3+Gn/RWeSiRU35I7wjC/Bp4iWcgAQ6iBTZv4jGGST5XyrOp+Pg== - dependencies: - "@walletconnect/events" "1.0.1" - "@walletconnect/heartbeat" "1.2.2" - "@walletconnect/jsonrpc-types" "1.0.4" - "@walletconnect/keyvaluestorage" "1.1.1" - "@walletconnect/logger" "2.1.2" - events "3.3.0" - -"@walletconnect/utils@2.13.1": - version "2.13.1" - resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.13.1.tgz" - integrity sha512-EcooXXlqy5hk9hy/nK2wBF/qxe7HjH0K8ZHzjKkXRkwAE5pCvy0IGXIXWmUR9sw8LFJEqZyd8rZdWLKNUe8hqA== - dependencies: - "@stablelib/chacha20poly1305" "1.0.1" - "@stablelib/hkdf" "1.0.1" - "@stablelib/random" "1.0.2" - "@stablelib/sha256" "1.0.1" - "@stablelib/x25519" "1.0.3" - "@walletconnect/relay-api" "1.0.10" - "@walletconnect/safe-json" "1.0.2" - "@walletconnect/time" "1.0.2" - "@walletconnect/types" "2.13.1" - "@walletconnect/window-getters" "1.0.1" - "@walletconnect/window-metadata" "1.0.1" - detect-browser "5.3.0" - query-string "7.1.3" - uint8arrays "3.1.0" - -"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz" - integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== - dependencies: - tslib "1.14.1" - -"@walletconnect/window-metadata@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz" - integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== - dependencies: - "@walletconnect/window-getters" "^1.0.1" - tslib "1.14.1" - -"@zag-js/dom-query@0.16.0": - version "0.16.0" - resolved "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz" - integrity sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ== - -"@zag-js/element-size@0.10.5": - version "0.10.5" - resolved "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz" - integrity sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w== - -"@zag-js/focus-visible@0.16.0": - version "0.16.0" - resolved "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz" - integrity sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA== - dependencies: - "@zag-js/dom-query" "0.16.0" - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abi-wan-kanabi@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.1.tgz" - integrity sha512-W3RNuu2tG10W4AY63uq89JX/MsZSOxvpmsitQ3pbdVn3e8RxXR2oegN0QmGpgfyT0KlPdreydHsqq/u+2Pt2PQ== - dependencies: - ansicolors "^0.3.2" - cardinal "^2.1.1" - fs-extra "^10.0.0" - yargs "^17.7.2" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.11.3: - version "8.11.3" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -add-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz" - integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== - -aes-js@4.0.0-beta.5: - version "4.0.0-beta.5" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" - integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansicolors@^0.3.2, ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.1.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-hidden@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.filter@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz" - integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -array.prototype.findlast@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz" - integrity sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.4" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz" - integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -autoprefixer@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.0.1.tgz#e2d9000f84ebd98d77b7bc16f8adb2ff1f7bb946" - integrity sha512-aQo2BDIsoOdemXUAOBpFv4ZQa2DrOtEufarYhtFsK1088Ca0TUwu/aQWf0M3mrILXZ3mTIVn1lR3hPW8acacsw== - dependencies: - browserslist "^4.14.5" - caniuse-lite "^1.0.30001137" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axios@1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== - dependencies: - follow-redirects "^1.15.4" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bignumber.js@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.4.tgz#7c40f5abcd2d6623ab7b99682ee7db81b11889a4" - integrity sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bowser@^2.11.0: - version "2.11.0" - resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" - integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.14.5: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== - dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001137, caniuse-lite@^1.0.30001629: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== - -caniuse-lite@^1.0.30001579: - version "1.0.30001597" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz" - integrity sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w== - -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.3, chokidar@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chroma.ts@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/chroma.ts/-/chroma.ts-1.0.10.tgz#2b965d8f2c2eee44d25072902e5787fe259d4565" - integrity sha512-0FOQiB6LaiOwoyaxP+a4d3sCIOSf7YvBKj3TfeQM4ZBb2yskRxe4FlT2P4YNpHz7kIB5rXsfmpyniyrYRRyVHw== - -citty@^0.1.5, citty@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz" - integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== - dependencies: - consola "^3.2.3" - -classnames@^2.2.5, classnames@^2.3.2: - version "2.5.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -client-only@0.0.1, client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -clipboardy@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz" - integrity sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w== - dependencies: - execa "^8.0.1" - is-wsl "^3.1.0" - is64bit "^2.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color2k@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" - integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colorette@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -compute-scroll-into-view@3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz" - integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -confbox@^0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz" - integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== - -consola@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz" - integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== - -conventional-changelog-angular@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" - integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-atom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz" - integrity sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw== - -conventional-changelog-codemirror@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz" - integrity sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q== - -conventional-changelog-conventionalcommits@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz" - integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-core@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz" - integrity sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg== - dependencies: - "@hutson/parse-repository-url" "^5.0.0" - add-stream "^1.0.0" - conventional-changelog-writer "^7.0.0" - conventional-commits-parser "^5.0.0" - git-raw-commits "^4.0.0" - git-semver-tags "^7.0.0" - hosted-git-info "^7.0.0" - normalize-package-data "^6.0.0" - read-pkg "^8.0.0" - read-pkg-up "^10.0.0" - -conventional-changelog-ember@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz" - integrity sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA== - -conventional-changelog-eslint@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz" - integrity sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA== - -conventional-changelog-express@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz" - integrity sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw== - -conventional-changelog-jquery@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz" - integrity sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw== - -conventional-changelog-jshint@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz" - integrity sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-preset-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz" - integrity sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA== - -conventional-changelog-writer@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz" - integrity sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA== - dependencies: - conventional-commits-filter "^4.0.0" - handlebars "^4.7.7" - json-stringify-safe "^5.0.1" - meow "^12.0.1" - semver "^7.5.2" - split2 "^4.0.0" - -conventional-changelog@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-5.1.0.tgz#04b36a5ad0518e0323e9d629e3b86e34f7abb7eb" - integrity sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg== - dependencies: - conventional-changelog-angular "^7.0.0" - conventional-changelog-atom "^4.0.0" - conventional-changelog-codemirror "^4.0.0" - conventional-changelog-conventionalcommits "^7.0.2" - conventional-changelog-core "^7.0.0" - conventional-changelog-ember "^4.0.0" - conventional-changelog-eslint "^5.0.0" - conventional-changelog-express "^4.0.0" - conventional-changelog-jquery "^5.0.0" - conventional-changelog-jshint "^4.0.0" - conventional-changelog-preset-loader "^4.1.0" - -conventional-commits-filter@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz" - integrity sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A== - -conventional-commits-parser@5.0.0, conventional-commits-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" - integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== - dependencies: - JSONStream "^1.3.5" - is-text-path "^2.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-es@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz" - integrity sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw== - -copy-to-clipboard@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crossws@^0.2.0, crossws@^0.2.2: - version "0.2.4" - resolved "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz" - integrity sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg== - -css-box-model@1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2, csstype@^3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dargs@^8.0.0: - version "8.1.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" - integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== - -debug@^2.1.3: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decode-uri-component@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -defu@^6.1.3, defu@^6.1.4: - version "6.1.4" - resolved "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz" - integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destr@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz" - integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== - -detect-browser@5.3.0, detect-browser@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" - integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexify@^4.1.2: - version "4.1.3" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz" - integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.796: - version "1.4.808" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz#85b2f93a5e32c2949a1a4d39375851945c936835" - integrity sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ== - -embla-carousel-autoplay@8.1.6: - version "8.1.6" - resolved "https://registry.yarnpkg.com/embla-carousel-autoplay/-/embla-carousel-autoplay-8.1.6.tgz#24696cb6037bbb3e894f51a8bcf6698c81ea38cf" - integrity sha512-e5n9f4q+DVeBPiPPT3gwzqpiqfae8aP8fQACS4OZkPFvFLdsVhnWcw+cwtewryP7snWJGKPXEMA1GOjieEKv+w== - -embla-carousel-react@8.1.6: - version "8.1.6" - resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.1.6.tgz#4de0cef2888443f4203408df73af2707e5c961e9" - integrity sha512-DHxwFzF63yVrU95Eo58E9Xr5b6Y9ul6TTsqb/rtwMi+jXudAmIqN1i9iBxQ73i8jKuUVxll/ziNYMmnWvrdQJQ== - dependencies: - embla-carousel "8.1.6" - embla-carousel-reactive-utils "8.1.6" - -embla-carousel-reactive-utils@8.1.6: - version "8.1.6" - resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.1.6.tgz#51c4a1dc6df1e608e9480f7a5fc3328e95926f91" - integrity sha512-Wg+J2YoqLqkaqsXi7fTJaLmXm6BpgDRJ0EfTdvQ4KE/ip5OsUuKGpJsEQDTt4waGXSDyZhIBlfoQtgGJeyYQ1Q== - -embla-carousel@8.1.6: - version "8.1.6" - resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.1.6.tgz#a67f0b51f0cb51131299c47dff18e2d08165d44a" - integrity sha512-9n7FVsbPAs1KD+JmO84DnEDOZMXPBQbLujjMQqvsBRN2CDWwgZ9hRSNapztdPnyJfzOIxowGmj0BUQ8ACYAPkA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -error-ex@^1.3.1, error-ex@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: - version "1.22.5" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz" - integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.1" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.0" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.14" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.0.0, es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.17" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz" - integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== - dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.22.4" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.2" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.0" - -es-set-tostringtag@^2.0.2, es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.1.0: - version "14.1.0" - resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz" - integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== - dependencies: - "@next/eslint-plugin-next" "14.1.0" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.33.2: - version "7.34.0" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz" - integrity sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-plugin-unused-imports@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz#db015b569d3774e17a482388c95c17bd303bc602" - integrity sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw== - dependencies: - eslint-rule-composer "^0.3.0" - -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethers@6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" - integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== - dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.5.0" - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -events@3.3.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-redact@^3.0.0: - version "3.5.0" - resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz" - integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fetch-cookie@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz" - 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" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -focus-lock@^1.3.2: - version "1.3.4" - resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.4.tgz" - integrity sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA== - dependencies: - tslib "^2.0.3" - -follow-redirects@^1.15.4: - version "1.15.5" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -framer-motion@11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.5.tgz#2ae1341d8605a01c50009d3bb195a67e4e2bfc69" - integrity sha512-Lb0EYbQcSK/pgyQUJm+KzsQrKrJRX9sFRyzl9hSr9gFG4Mk8yP7BjhuxvRXzblOM/+JxycrJdCDVmOQBsjpYlw== - dependencies: - tslib "^2.4.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - -framer-motion@^6.3.11: - version "6.5.1" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" - integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== - dependencies: - "@motionone/dom" "10.12.0" - framesync "6.0.1" - hey-listen "^1.0.8" - popmotion "11.0.3" - style-value-types "5.0.0" - tslib "^2.1.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" - -framesync@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" - integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== - dependencies: - tslib "^2.1.0" - -framesync@6.1.2: - version "6.1.2" - resolved "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz" - integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== - dependencies: - tslib "2.4.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -get-port-please@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz" - integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== - -get-starknet-core@3.2.0, get-starknet-core@^3.0.1, get-starknet-core@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/get-starknet-core/-/get-starknet-core-3.2.0.tgz" - integrity sha512-SZhxtLlKoPKLZ2H3l9WIU7CiNmkL3qLWGksALmvZdAXa/9PykYfLtvIB5B8A2UZMpf2ojTZlWLfuo1KhgmVobA== - -get-starknet@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/get-starknet/-/get-starknet-3.0.1.tgz#46a4ece33defcedf83d8e006e1222bb868132116" - integrity sha512-EyUl+DVQH5PXW2OUdY06/yaqlMizzLKRLzp3S+VhYz+l6wGvW5pmhTXHLaYI4hWfebIDfFkFvAPxVPv/TkWLyA== - dependencies: - bowser "^2.11.0" - get-starknet-core "^3.0.1" - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== - dependencies: - resolve-pkg-maps "^1.0.0" - -git-raw-commits@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" - integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== - dependencies: - dargs "^8.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -git-semver-tags@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz" - integrity sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q== - dependencies: - meow "^12.0.1" - semver "^7.5.2" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10, glob@^10.3.10: - version "10.3.10" - resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -goober@^2.1.10: - version "2.1.14" - resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" - integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -h3@^1.10.2, h3@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/h3/-/h3-1.11.1.tgz" - integrity sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A== - dependencies: - cookie-es "^1.0.0" - crossws "^0.2.2" - defu "^6.1.4" - destr "^2.0.3" - iron-webcrypto "^1.0.0" - ohash "^1.1.3" - radix3 "^1.1.0" - ufo "^1.4.0" - uncrypto "^0.1.3" - unenv "^1.9.0" - -handlebars@^4.7.7: - version "4.7.8" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hey-listen@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" - integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== - -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz" - integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== - dependencies: - lru-cache "^10.0.1" - -http-shutdown@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz" - integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -husky@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.1.tgz#73f8f1b58329f377654293148c1a6458f54ca224" - integrity sha512-fCqlqLXcBnXa/TJXmT93/A36tJsjdJkibQ1MuIiFyCCYUlpYpIaj2mv1w+3KR6Rzu1IC3slFTje5f6DUp2A2rg== - -idb-keyval@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz" - integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -immutable@^4.3.4: - version "4.3.5" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.5, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -iron-webcrypto@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz" - integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - -is64bit@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz" - integrity sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw== - dependencies: - system-architecture "^0.1.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz" - integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== - dependencies: - node-fetch "^2.6.1" - whatwg-fetch "^3.4.1" - -isomorphic-unfetch@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.17.2: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - -jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -jotai-tanstack-query@0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/jotai-tanstack-query/-/jotai-tanstack-query-0.8.5.tgz#12616f18a7623cc3786f3e2d7b1e1b2dc60394b2" - integrity sha512-cFq+1sE7Qkt7Kh9Db2KE8LXdbPiGwCiy8S5YSEnjUDxF59A4XhoXTDJBuPiMIA1dD1/yMsNKr1ADfN5CvscYZw== - -jotai@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.6.4.tgz#a68a76f0e5cd2b614afae7112cfc52a77dbfe038" - integrity sha512-RniwQPX4893YlNR1muOtyUGHYaTD1fhEN4qnOuZJSrDHj6xdEMrqlRSN/hCm2fshwk78ruecB/P2l+NCVWe6TQ== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-parse-even-better-errors@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" - integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonp@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz" - integrity sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw== - dependencies: - debug "^2.1.3" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -keyvaluestorage-interface@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz" - integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== - -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5, lilconfig@^2.0.6: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lines-and-columns@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz" - integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== - -listhen@^1.7.2: - version "1.7.2" - resolved "https://registry.npmjs.org/listhen/-/listhen-1.7.2.tgz" - integrity sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g== - dependencies: - "@parcel/watcher" "^2.4.1" - "@parcel/watcher-wasm" "^2.4.1" - citty "^0.1.6" - clipboardy "^4.0.0" - consola "^3.2.3" - crossws "^0.2.0" - defu "^6.1.4" - get-port-please "^3.1.2" - h3 "^1.10.2" - http-shutdown "^1.2.2" - jiti "^1.21.0" - mlly "^1.6.1" - node-forge "^1.3.1" - pathe "^1.1.2" - std-env "^3.7.0" - ufo "^1.4.0" - untun "^0.1.3" - uqr "^0.1.2" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.isequal@4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz" - integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lossless-json@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/lossless-json/-/lossless-json-4.0.1.tgz" - integrity sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA== - -lru-cache@^10.0.1, lru-cache@^10.2.0, "lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -meow@^12.0.1: - version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" - integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -minimatch@9.0.3, minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -mixpanel-browser@2.49.0: - version "2.49.0" - resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz#de3f4f2d0f3a32b4babf6d827ef983a9fd48a711" - integrity sha512-RZJCO7XXuuHBAWG5fd9Mavz994M7v7W3Qiaq8NzmN631pa4BQ0vNZQtRFqKcCCOBn4xqOZbX2GkuC7ZkQoL4cQ== - -mlly@^1.6.1, mlly@^1.7.0: - version "1.7.1" - resolved "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz" - integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== - dependencies: - acorn "^8.11.3" - pathe "^1.1.2" - pkg-types "^1.1.1" - ufo "^1.5.3" - -mri@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - -mustache@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -napi-wasm@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" - integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next@14.1.0: - version "14.1.0" - resolved "https://registry.npmjs.org/next/-/next-14.1.0.tgz" - integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== - dependencies: - "@next/env" "14.1.0" - "@swc/helpers" "0.5.2" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "14.1.0" - "@next/swc-darwin-x64" "14.1.0" - "@next/swc-linux-arm64-gnu" "14.1.0" - "@next/swc-linux-arm64-musl" "14.1.0" - "@next/swc-linux-x64-gnu" "14.1.0" - "@next/swc-linux-x64-musl" "14.1.0" - "@next/swc-win32-arm64-msvc" "14.1.0" - "@next/swc-win32-ia32-msvc" "14.1.0" - "@next/swc-win32-x64-msvc" "14.1.0" - -node-addon-api@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz" - integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== - -node-fetch-native@^1.6.1, node-fetch-native@^1.6.2, node-fetch-native@^1.6.3: - version "1.6.4" - resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz" - integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== - -node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-package-data@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz" - integrity sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ== - dependencies: - hosted-git-info "^7.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.groupby@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz" - integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== - dependencies: - array.prototype.filter "^1.0.3" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.0.0" - -object.hasown@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== - dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -ofetch@^1.3.3: - version "1.3.4" - resolved "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz" - integrity sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw== - dependencies: - destr "^2.0.3" - node-fetch-native "^1.6.3" - ufo "^1.5.3" - -ohash@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz" - integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== - -on-exit-leak-free@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz" - integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -pako@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-json@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz" - integrity sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw== - dependencies: - "@babel/code-frame" "^7.21.4" - error-ex "^1.3.2" - json-parse-even-better-errors "^3.0.0" - lines-and-columns "^2.0.3" - type-fest "^3.8.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.1, pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pino-abstract-transport@v0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz" - integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== - dependencies: - duplexify "^4.1.2" - split2 "^4.0.0" - -pino-std-serializers@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz" - integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== - -pino@7.11.0: - version "7.11.0" - resolved "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz" - integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.0.0" - on-exit-leak-free "^0.2.0" - pino-abstract-transport v0.5.0 - pino-std-serializers "^4.0.0" - process-warning "^1.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.1.0" - safe-stable-stringify "^2.1.0" - sonic-boom "^2.2.1" - thread-stream "^0.15.1" - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-types@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz" - integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== - dependencies: - confbox "^0.1.7" - mlly "^1.7.0" - pathe "^1.1.2" - -popmotion@11.0.3: - version "11.0.3" - resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" - integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== - dependencies: - framesync "6.0.1" - hey-listen "^1.0.8" - style-value-types "5.0.0" - tslib "^2.1.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-selector-parser@^6.0.10: - version "6.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.11: - version "6.0.16" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8, postcss@^8.0.9: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -process-warning@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -query-string@7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz" - integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== - dependencies: - decode-uri-component "^0.2.2" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -radix3@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz" - integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== - -react-clientside-effect@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz" - integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== - 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" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-easy-swipe@^0.0.21: - version "0.0.21" - resolved "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.21.tgz" - integrity sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg== - dependencies: - prop-types "^15.5.8" - -react-fast-compare@3.2.2: - version "3.2.2" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-focus-lock@^2.9.4: - version "2.11.2" - resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.2.tgz" - integrity sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ== - dependencies: - "@babel/runtime" "^7.0.0" - focus-lock "^1.3.2" - prop-types "^15.6.2" - react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-hot-toast@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" - integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== - dependencies: - goober "^2.1.10" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-mixpanel@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/react-mixpanel/-/react-mixpanel-1.0.5.tgz#38c0078577dddd6ac01fbaa8a638d6b291f76446" - integrity sha512-2ZLXO01ZEVGSIHN62OrsBQ5zmuKV9QUNJy5jeCOmKEhZUcxT49hOd5dbSB+W8epjMS/eBcw9RsPk8TJlPadwhQ== - -react-pro-sidebar@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-pro-sidebar/-/react-pro-sidebar-1.1.0.tgz#e8f4ca0d7c4ff9fd2c38f8a0b85664083173b7ac" - integrity sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ== - dependencies: - "@emotion/react" "^11.10.5" - "@emotion/styled" "^11.10.5" - "@popperjs/core" "^2.11.6" - classnames "^2.3.2" - -react-remove-scroll-bar@^2.3.4: - version "2.3.6" - resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" - integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@^2.5.6: - version "2.5.7" - resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz" - integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== - dependencies: - react-remove-scroll-bar "^2.3.4" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-responsive-carousel@3.2.23: - version "3.2.23" - resolved "https://registry.yarnpkg.com/react-responsive-carousel/-/react-responsive-carousel-3.2.23.tgz#4c0016ff54603e604bb5c1f9e7ef2d1eda133f1d" - integrity sha512-pqJLsBaKHWJhw/ItODgbVoziR2z4lpcJg+YwmRlSk4rKH32VE633mAtZZ9kDXjy4wFO+pgUZmDKPsPe1fPmHCg== - dependencies: - classnames "^2.2.5" - prop-types "^15.5.8" - react-easy-swipe "^0.0.21" - -react-select@5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5" - integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA== - dependencies: - "@babel/runtime" "^7.12.0" - "@emotion/cache" "^11.4.0" - "@emotion/react" "^11.8.1" - "@floating-ui/dom" "^1.0.1" - "@types/react-transition-group" "^4.4.0" - memoize-one "^6.0.0" - prop-types "^15.6.0" - react-transition-group "^4.3.0" - use-isomorphic-layout-effect "^1.1.2" - -react-share@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/react-share/-/react-share-5.1.0.tgz#27eff763e5c233c8765cacf595b039093cb9b408" - integrity sha512-OvyfMtj/0UzH1wi90OdHhZVJ6WUC/+IeWvBwppeZozwIGyAjQgyR0QXlHOrxVHVECqnGvcpBaFTXVrqouTieaw== - dependencies: - classnames "^2.3.2" - jsonp "^0.2.1" - -react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-transition-group@^4.3.0: - version "4.4.5" - resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@18: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -read-pkg-up@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz" - integrity sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA== - dependencies: - find-up "^6.3.0" - read-pkg "^8.1.0" - type-fest "^4.2.0" - -read-pkg@^8.0.0, read-pkg@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz" - integrity sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ== - dependencies: - "@types/normalize-package-data" "^2.4.1" - normalize-package-data "^6.0.0" - parse-json "^7.0.0" - type-fest "^4.2.0" - -readable-stream@^3.1.1: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -real-require@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz" - integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - -reflect.getprototypeof@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz" - integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.0.0" - get-intrinsic "^1.2.3" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-stable-stringify@^2.1.0: - version "2.4.3" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.5.2, semver@^7.5.4, semver@^7.6.0: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -server-only@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz" - integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== - -set-cookie-parser@^2.4.8: - version "2.6.0" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -sharp@0.33.4: - version "0.33.4" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.4.tgz#b88e6e843e095c6ab5e1a0c59c4885e580cd8405" - integrity sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q== - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.0" - optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.4" - "@img/sharp-darwin-x64" "0.33.4" - "@img/sharp-libvips-darwin-arm64" "1.0.2" - "@img/sharp-libvips-darwin-x64" "1.0.2" - "@img/sharp-libvips-linux-arm" "1.0.2" - "@img/sharp-libvips-linux-arm64" "1.0.2" - "@img/sharp-libvips-linux-s390x" "1.0.2" - "@img/sharp-libvips-linux-x64" "1.0.2" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" - "@img/sharp-libvips-linuxmusl-x64" "1.0.2" - "@img/sharp-linux-arm" "0.33.4" - "@img/sharp-linux-arm64" "0.33.4" - "@img/sharp-linux-s390x" "0.33.4" - "@img/sharp-linux-x64" "0.33.4" - "@img/sharp-linuxmusl-arm64" "0.33.4" - "@img/sharp-linuxmusl-x64" "0.33.4" - "@img/sharp-wasm32" "0.33.4" - "@img/sharp-win32-ia32" "0.33.4" - "@img/sharp-win32-x64" "0.33.4" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sonic-boom@^2.2.1: - version "2.8.0" - resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz" - integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== - dependencies: - atomic-sleep "^1.0.0" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -starknet@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.4.1.tgz#bcb3f98c091cde67946f09393775a1a8276e36c2" - integrity sha512-CtjSzkI0P6O0FuYsW39+m+a00xKtQFYfz4rdZGn3JgEoR78X691OlscA+Q0yq285NwjjFvPn6WJxlRs2q3aL2w== - dependencies: - "@noble/curves" "~1.3.0" - "@scure/base" "~1.1.3" - "@scure/starknet" "~1.0.0" - abi-wan-kanabi "^2.2.1" - fetch-cookie "^3.0.0" - isomorphic-fetch "^3.0.0" - lossless-json "^4.0.1" - pako "^2.0.4" - ts-mixer "^6.0.3" - url-join "^4.0.1" - -starknetkit@1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/starknetkit/-/starknetkit-1.1.9.tgz#92ff7536b2bdc36017e4b16067f4c5ba264b4981" - integrity sha512-KarnNS9sJoImTdpTKizyNzDlQSAOutbzuZ6CzHQpJHWzaf8ION9aIf+d87sY7hSlbmD7cqGRUG28Hpke24arCg== - dependencies: - "@trpc/client" "^10.38.1" - "@trpc/server" "^10.38.1" - "@walletconnect/sign-client" "^2.10.1" - bowser "^2.11.0" - detect-browser "^5.3.0" - eventemitter3 "^5.0.1" - events "^3.3.0" - get-starknet-core "^3.1.0" - lodash-es "^4.17.21" - svelte-forms "^2.3.1" - trpc-browser "^1.3.2" - -std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - -stream-shift@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz" - integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.10: - version "4.0.10" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-value-types@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" - integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== - dependencies: - hey-listen "^1.0.8" - tslib "^2.1.0" - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -sucrase@^3.29.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svelte-forms@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/svelte-forms/-/svelte-forms-2.3.1.tgz" - integrity sha512-ExX9PM0JgvdOWlHl2ztD7XzLNPOPt9U5hBKV8sUAisMfcYWpPRnyz+6EFmh35BOBGJJmuhTDBGm5/7seLjOTIA== - dependencies: - is-promise "^4.0.0" - -swr@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" - integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg== - dependencies: - client-only "^0.0.1" - use-sync-external-store "^1.2.0" - -system-architecture@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz" - integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA== - -tailwindcss@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.0.tgz#8cab40e5a10a10648118c0859ba8bfbc744a761e" - integrity sha512-hOXlFx+YcklJ8kXiCAfk/FMyr4Pm9ck477G0m/us2344Vuj355IpoEDB5UmGAsSpTBmr+4ZhjzW04JuFXkb/fw== - dependencies: - arg "^5.0.2" - chokidar "^3.5.3" - color-name "^1.1.4" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.17.2" - lilconfig "^2.0.6" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.0.9" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" - sucrase "^3.29.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-extensions@^2.0.0: - version "2.4.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" - integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -third-party-capital@1.0.20: - version "1.0.20" - resolved "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz" - integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== - -thread-stream@^0.15.1: - version "0.15.2" - resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz" - integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== - dependencies: - real-require "^0.1.0" - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tiny-invariant@^1.0.6: - version "1.3.3" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" - integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trpc-browser@^1.3.2: - version "1.4.2" - resolved "https://registry.npmjs.org/trpc-browser/-/trpc-browser-1.4.2.tgz" - integrity sha512-A4p5LtEiI81fEBi/RduirnXx6MrbKab+qpu9lzYONVEVHeWkXzmIzGlG2gfowWgBmxtKKjku8F3fZTrPxl93Gw== - -ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-mixer@^6.0.3: - version "6.0.4" - resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" - integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@1.14.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^3.8.0: - version "3.13.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -type-fest@^4.2.0: - version "4.18.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz" - integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz" - integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@5: - version "5.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" - integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== - -ua-parser-js@^1.0.33: - version "1.0.37" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== - -ufo@^1.4.0, ufo@^1.5.3: - version "1.5.3" - resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz" - integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -uint8arrays@3.1.0, uint8arrays@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz" - integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== - dependencies: - multiformats "^9.4.2" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -uncrypto@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz" - integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unenv@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz" - integrity sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g== - dependencies: - consola "^3.2.3" - defu "^6.1.3" - mime "^3.0.0" - node-fetch-native "^1.6.1" - pathe "^1.1.1" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unstorage@^1.9.0: - version "1.10.2" - resolved "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz" - integrity sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ== - dependencies: - anymatch "^3.1.3" - chokidar "^3.6.0" - destr "^2.0.3" - h3 "^1.11.1" - listhen "^1.7.2" - lru-cache "^10.2.0" - mri "^1.2.0" - node-fetch-native "^1.6.2" - ofetch "^1.3.3" - ufo "^1.4.0" - -untun@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz" - integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== - dependencies: - citty "^0.1.5" - consola "^3.2.3" - pathe "^1.1.1" - -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" - -uqr@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz" - integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-callback-ref@^1.3.0: - version "1.3.1" - resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz" - integrity sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ== - dependencies: - tslib "^2.0.0" - -use-isomorphic-layout-effect@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-fetch@^3.4.1: - version "3.6.20" - resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz" - integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wonka@6.3.4: - version "6.3.4" - resolved "https://registry.yarnpkg.com/wonka/-/wonka-6.3.4.tgz#76eb9316e3d67d7febf4945202b5bdb2db534594" - integrity sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^7.5.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - -zod@^3.22.2: - version "3.22.4" - resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@ajna/pagination@1.4.19": + version "1.4.19" + resolved "https://registry.yarnpkg.com/@ajna/pagination/-/pagination-1.4.19.tgz#2eae0f9321a540490918395a40ad21531035e561" + integrity sha512-QnrERhw1fhAVst1pBrXyPruJphbrLnIYcHf5bpWS7IhtK3tKljTPQ8/UbUsroJ6oAqHCp9X9nLi49PT+xw/hXw== + dependencies: + framer-motion "^6.3.11" + lodash.union "^4.6.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.21.4": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/helper-module-imports@^7.16.7": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/types@^7.22.15": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@chakra-ui/accordion@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz" + integrity sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag== + dependencies: + "@chakra-ui/descendant" "3.1.0" + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.1.0" + +"@chakra-ui/alert@2.2.2": + version "2.2.2" + resolved "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz" + integrity sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw== + dependencies: + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/spinner" "2.1.0" + +"@chakra-ui/anatomy@2.2.2": + version "2.2.2" + resolved "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz" + integrity sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg== + +"@chakra-ui/avatar@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz" + integrity sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g== + dependencies: + "@chakra-ui/image" "2.1.0" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/breadcrumb@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz" + integrity sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA== + dependencies: + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/breakpoint-utils@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz" + integrity sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/button@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz" + integrity sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA== + dependencies: + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/spinner" "2.1.0" + +"@chakra-ui/card@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz" + integrity sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/checkbox@2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz" + integrity sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g== + dependencies: + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/visually-hidden" "2.2.0" + "@zag-js/focus-visible" "0.16.0" + +"@chakra-ui/clickable@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz" + integrity sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw== + dependencies: + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/close-button@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz" + integrity sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw== + dependencies: + "@chakra-ui/icon" "3.2.0" + +"@chakra-ui/color-mode@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz" + integrity sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + +"@chakra-ui/control-box@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz" + integrity sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg== + +"@chakra-ui/counter@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz" + integrity sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw== + dependencies: + "@chakra-ui/number-utils" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/css-reset@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz" + integrity sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg== + +"@chakra-ui/descendant@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz" + integrity sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ== + dependencies: + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + +"@chakra-ui/dom-utils@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz" + integrity sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ== + +"@chakra-ui/editable@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz" + integrity sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg== + dependencies: + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/event-utils@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz" + integrity sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw== + +"@chakra-ui/focus-lock@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz" + integrity sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w== + dependencies: + "@chakra-ui/dom-utils" "2.1.0" + react-focus-lock "^2.9.4" + +"@chakra-ui/form-control@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz" + integrity sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw== + dependencies: + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/hooks@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz" + integrity sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ== + dependencies: + "@chakra-ui/react-utils" "2.0.12" + "@chakra-ui/utils" "2.0.15" + compute-scroll-into-view "3.0.3" + copy-to-clipboard "3.3.3" + +"@chakra-ui/icon@3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz" + integrity sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/icons@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.1.1.tgz#58ff0f9e703f2f4f89debd600ce4e438f43f9c9a" + integrity sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g== + dependencies: + "@chakra-ui/icon" "3.2.0" + +"@chakra-ui/image@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz" + integrity sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/input@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz" + integrity sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw== + dependencies: + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/object-utils" "2.1.0" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/layout@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz" + integrity sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.8" + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/object-utils" "2.1.0" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/lazy-utils@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz" + integrity sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg== + +"@chakra-ui/live-region@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz" + integrity sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw== + +"@chakra-ui/media-query@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz" + integrity sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.8" + "@chakra-ui/react-env" "3.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/menu@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz" + integrity sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g== + dependencies: + "@chakra-ui/clickable" "2.1.0" + "@chakra-ui/descendant" "3.1.0" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/popper" "3.1.0" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-animation-state" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-disclosure" "2.1.0" + "@chakra-ui/react-use-focus-effect" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-outside-click" "2.2.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.1.0" + +"@chakra-ui/modal@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz" + integrity sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ== + dependencies: + "@chakra-ui/close-button" "2.1.1" + "@chakra-ui/focus-lock" "2.1.0" + "@chakra-ui/portal" "2.1.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.1.0" + aria-hidden "^1.2.3" + react-remove-scroll "^2.5.6" + +"@chakra-ui/number-input@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz" + integrity sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA== + dependencies: + "@chakra-ui/counter" "2.1.0" + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.1.0" + "@chakra-ui/react-use-event-listener" "2.1.0" + "@chakra-ui/react-use-interval" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/number-utils@2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz" + integrity sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg== + +"@chakra-ui/object-utils@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz" + integrity sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ== + +"@chakra-ui/pin-input@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz" + integrity sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw== + dependencies: + "@chakra-ui/descendant" "3.1.0" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/popover@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz" + integrity sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg== + dependencies: + "@chakra-ui/close-button" "2.1.1" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/popper" "3.1.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-animation-state" "2.1.0" + "@chakra-ui/react-use-disclosure" "2.1.0" + "@chakra-ui/react-use-focus-effect" "2.1.0" + "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/popper@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz" + integrity sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg== + dependencies: + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@popperjs/core" "^2.9.3" + +"@chakra-ui/portal@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz" + integrity sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg== + dependencies: + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + +"@chakra-ui/progress@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz" + integrity sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ== + dependencies: + "@chakra-ui/react-context" "2.1.0" + +"@chakra-ui/provider@2.4.2": + version "2.4.2" + resolved "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz" + integrity sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw== + dependencies: + "@chakra-ui/css-reset" "2.3.0" + "@chakra-ui/portal" "2.1.0" + "@chakra-ui/react-env" "3.1.0" + "@chakra-ui/system" "2.6.2" + "@chakra-ui/utils" "2.0.15" + +"@chakra-ui/radio@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz" + integrity sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w== + dependencies: + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@zag-js/focus-visible" "0.16.0" + +"@chakra-ui/react-children-utils@2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz" + integrity sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA== + +"@chakra-ui/react-context@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz" + integrity sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w== + +"@chakra-ui/react-env@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz" + integrity sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + +"@chakra-ui/react-types@2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz" + integrity sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ== + +"@chakra-ui/react-use-animation-state@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz" + integrity sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg== + dependencies: + "@chakra-ui/dom-utils" "2.1.0" + "@chakra-ui/react-use-event-listener" "2.1.0" + +"@chakra-ui/react-use-callback-ref@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz" + integrity sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ== + +"@chakra-ui/react-use-controllable-state@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz" + integrity sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-disclosure@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz" + integrity sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-event-listener@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz" + integrity sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-focus-effect@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz" + integrity sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ== + dependencies: + "@chakra-ui/dom-utils" "2.1.0" + "@chakra-ui/react-use-event-listener" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + +"@chakra-ui/react-use-focus-on-pointer-down@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz" + integrity sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg== + dependencies: + "@chakra-ui/react-use-event-listener" "2.1.0" + +"@chakra-ui/react-use-interval@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz" + integrity sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-latest-ref@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz" + integrity sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ== + +"@chakra-ui/react-use-merge-refs@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz" + integrity sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ== + +"@chakra-ui/react-use-outside-click@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz" + integrity sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-pan-event@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz" + integrity sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg== + dependencies: + "@chakra-ui/event-utils" "2.0.8" + "@chakra-ui/react-use-latest-ref" "2.1.0" + framesync "6.1.2" + +"@chakra-ui/react-use-previous@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz" + integrity sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg== + +"@chakra-ui/react-use-safe-layout-effect@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz" + integrity sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw== + +"@chakra-ui/react-use-size@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz" + integrity sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A== + dependencies: + "@zag-js/element-size" "0.10.5" + +"@chakra-ui/react-use-timeout@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz" + integrity sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.1.0" + +"@chakra-ui/react-use-update-effect@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz" + integrity sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA== + +"@chakra-ui/react-utils@2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz" + integrity sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw== + dependencies: + "@chakra-ui/utils" "2.0.15" + +"@chakra-ui/react@2.8.2": + version "2.8.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.8.2.tgz#94d692fb35e4447748c5bfd73d8d38a746193c7d" + integrity sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ== + dependencies: + "@chakra-ui/accordion" "2.3.1" + "@chakra-ui/alert" "2.2.2" + "@chakra-ui/avatar" "2.3.0" + "@chakra-ui/breadcrumb" "2.2.0" + "@chakra-ui/button" "2.1.0" + "@chakra-ui/card" "2.2.0" + "@chakra-ui/checkbox" "2.3.2" + "@chakra-ui/close-button" "2.1.1" + "@chakra-ui/control-box" "2.1.0" + "@chakra-ui/counter" "2.1.0" + "@chakra-ui/css-reset" "2.3.0" + "@chakra-ui/editable" "3.1.0" + "@chakra-ui/focus-lock" "2.1.0" + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/hooks" "2.2.1" + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/image" "2.1.0" + "@chakra-ui/input" "2.1.2" + "@chakra-ui/layout" "2.3.1" + "@chakra-ui/live-region" "2.1.0" + "@chakra-ui/media-query" "3.3.0" + "@chakra-ui/menu" "2.2.1" + "@chakra-ui/modal" "2.3.1" + "@chakra-ui/number-input" "2.1.2" + "@chakra-ui/pin-input" "2.1.0" + "@chakra-ui/popover" "2.2.1" + "@chakra-ui/popper" "3.1.0" + "@chakra-ui/portal" "2.1.0" + "@chakra-ui/progress" "2.2.0" + "@chakra-ui/provider" "2.4.2" + "@chakra-ui/radio" "2.1.2" + "@chakra-ui/react-env" "3.1.0" + "@chakra-ui/select" "2.1.2" + "@chakra-ui/skeleton" "2.1.0" + "@chakra-ui/skip-nav" "2.1.0" + "@chakra-ui/slider" "2.1.0" + "@chakra-ui/spinner" "2.1.0" + "@chakra-ui/stat" "2.1.1" + "@chakra-ui/stepper" "2.3.1" + "@chakra-ui/styled-system" "2.9.2" + "@chakra-ui/switch" "2.1.2" + "@chakra-ui/system" "2.6.2" + "@chakra-ui/table" "2.1.0" + "@chakra-ui/tabs" "3.0.0" + "@chakra-ui/tag" "3.1.1" + "@chakra-ui/textarea" "2.1.2" + "@chakra-ui/theme" "3.3.1" + "@chakra-ui/theme-utils" "2.0.21" + "@chakra-ui/toast" "7.0.2" + "@chakra-ui/tooltip" "2.3.1" + "@chakra-ui/transition" "2.1.0" + "@chakra-ui/utils" "2.0.15" + "@chakra-ui/visually-hidden" "2.2.0" + +"@chakra-ui/select@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz" + integrity sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA== + dependencies: + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/shared-utils@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz" + integrity sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q== + +"@chakra-ui/skeleton@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz" + integrity sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ== + dependencies: + "@chakra-ui/media-query" "3.3.0" + "@chakra-ui/react-use-previous" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/skip-nav@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz" + integrity sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug== + +"@chakra-ui/slider@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz" + integrity sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ== + dependencies: + "@chakra-ui/number-utils" "2.0.7" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-latest-ref" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-pan-event" "2.1.0" + "@chakra-ui/react-use-size" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + +"@chakra-ui/spinner@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz" + integrity sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/stat@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz" + integrity sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q== + dependencies: + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/stepper@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz" + integrity sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q== + dependencies: + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/styled-system@2.9.2": + version "2.9.2" + resolved "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz" + integrity sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + csstype "^3.1.2" + lodash.mergewith "4.6.2" + +"@chakra-ui/switch@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz" + integrity sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA== + dependencies: + "@chakra-ui/checkbox" "2.3.2" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/system@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz" + integrity sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ== + dependencies: + "@chakra-ui/color-mode" "2.2.0" + "@chakra-ui/object-utils" "2.1.0" + "@chakra-ui/react-utils" "2.0.12" + "@chakra-ui/styled-system" "2.9.2" + "@chakra-ui/theme-utils" "2.0.21" + "@chakra-ui/utils" "2.0.15" + react-fast-compare "3.2.2" + +"@chakra-ui/table@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz" + integrity sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ== + dependencies: + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/tabs@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz" + integrity sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw== + dependencies: + "@chakra-ui/clickable" "2.1.0" + "@chakra-ui/descendant" "3.1.0" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-controllable-state" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/react-use-safe-layout-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/tag@3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz" + integrity sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ== + dependencies: + "@chakra-ui/icon" "3.2.0" + "@chakra-ui/react-context" "2.1.0" + +"@chakra-ui/textarea@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz" + integrity sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA== + dependencies: + "@chakra-ui/form-control" "2.2.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/theme-tools@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz" + integrity sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA== + dependencies: + "@chakra-ui/anatomy" "2.2.2" + "@chakra-ui/shared-utils" "2.0.5" + color2k "^2.0.2" + +"@chakra-ui/theme-utils@2.0.21": + version "2.0.21" + resolved "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz" + integrity sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/styled-system" "2.9.2" + "@chakra-ui/theme" "3.3.1" + lodash.mergewith "4.6.2" + +"@chakra-ui/theme@3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz" + integrity sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ== + dependencies: + "@chakra-ui/anatomy" "2.2.2" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/theme-tools" "2.1.2" + +"@chakra-ui/toast@7.0.2": + version "7.0.2" + resolved "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz" + integrity sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA== + dependencies: + "@chakra-ui/alert" "2.2.2" + "@chakra-ui/close-button" "2.1.1" + "@chakra-ui/portal" "2.1.0" + "@chakra-ui/react-context" "2.1.0" + "@chakra-ui/react-use-timeout" "2.1.0" + "@chakra-ui/react-use-update-effect" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/styled-system" "2.9.2" + "@chakra-ui/theme" "3.3.1" + +"@chakra-ui/tooltip@2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz" + integrity sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A== + dependencies: + "@chakra-ui/dom-utils" "2.1.0" + "@chakra-ui/popper" "3.1.0" + "@chakra-ui/portal" "2.1.0" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-disclosure" "2.1.0" + "@chakra-ui/react-use-event-listener" "2.1.0" + "@chakra-ui/react-use-merge-refs" "2.1.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/transition@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz" + integrity sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/utils@2.0.15": + version "2.0.15" + resolved "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz" + integrity sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA== + dependencies: + "@types/lodash.mergewith" "4.6.7" + css-box-model "1.2.1" + framesync "6.1.2" + lodash.mergewith "4.6.2" + +"@chakra-ui/visually-hidden@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz" + integrity sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ== + +"@emnapi/runtime@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" + integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== + dependencies: + tslib "^2.4.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@11.11.3": + version "11.11.3" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" + integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/react@^11.10.5", "@emotion/react@^11.8.1": + version "11.11.4" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz" + integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@11.11.0", "@emotion/styled@^11.10.5": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0": + version "4.10.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint-community/regexpp@^4.6.1": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.0.1": + version "1.6.3" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@hutson/parse-repository-url@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz" + integrity sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg== + +"@img/sharp-darwin-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz#a1cf4a7febece334f16e0328b9689f05797d7aec" + integrity sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.2" + +"@img/sharp-darwin-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz#f77be2d7c3609d3e77cd337b199a772e07b87bd2" + integrity sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.2" + +"@img/sharp-libvips-darwin-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz#b69f49fecbe9572378675769b189410721b0fa53" + integrity sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA== + +"@img/sharp-libvips-darwin-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz#5665da7360d8e5ed7bee314491c8fe736b6a3c39" + integrity sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw== + +"@img/sharp-libvips-linux-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz#8a05e5e9e9b760ff46561e32f19bd5e035fa881c" + integrity sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw== + +"@img/sharp-libvips-linux-arm@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz#0fd33b9bf3221948ce0ca7a5a725942626577a03" + integrity sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw== + +"@img/sharp-libvips-linux-s390x@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz#4b89150ec91b256ee2cbb5bb125321bf029a4770" + integrity sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog== + +"@img/sharp-libvips-linux-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz#947ccc22ca5bc8c8cfe921b39a5fdaebc5e39f3f" + integrity sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz#821d58ce774f0f8bed065b69913a62f65d512f2f" + integrity sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ== + +"@img/sharp-libvips-linuxmusl-x64@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz#4309474bd8b728a61af0b3b4fad0c476b5f3ccbe" + integrity sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw== + +"@img/sharp-linux-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz#bd390113e256487041411b988ded13a26cfc5f95" + integrity sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.2" + +"@img/sharp-linux-arm@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz#14ecc81f38f75fb4cd7571bc83311746d6745fca" + integrity sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.2" + +"@img/sharp-linux-s390x@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz#119e8081e2c6741b5ac908fe02244e4c559e525f" + integrity sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.2" + +"@img/sharp-linux-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz#21d4c137b8da9a313b069ff5c920ded709f853d7" + integrity sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.2" + +"@img/sharp-linuxmusl-arm64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz#f3fde68fd67b85a32da6f1155818c3b58b8e7ae0" + integrity sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" + +"@img/sharp-linuxmusl-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz#44373724aecd7b69900e0578228144e181db7892" + integrity sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.2" + +"@img/sharp-wasm32@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz#88e3f18d7e7cd8cfe1af98e9963db4d7b6491435" + integrity sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ== + dependencies: + "@emnapi/runtime" "^1.1.1" + +"@img/sharp-win32-ia32@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz#b1c772dd2952e983980b1eb85808fa8129484d46" + integrity sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw== + +"@img/sharp-win32-x64@0.33.4": + version "0.33.4" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz#106f911134035b4157ec92a0c154a6b6f88fa4c1" + integrity sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@motionone/animation@^10.12.0": + version "10.17.0" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.17.0.tgz" + integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== + dependencies: + "@motionone/easing" "^10.17.0" + "@motionone/types" "^10.17.0" + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/dom@10.12.0": + version "10.12.0" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz" + integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== + dependencies: + "@motionone/animation" "^10.12.0" + "@motionone/generators" "^10.12.0" + "@motionone/types" "^10.12.0" + "@motionone/utils" "^10.12.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.17.0": + version "10.17.0" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.17.0.tgz" + integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== + dependencies: + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/generators@^10.12.0": + version "10.17.0" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.17.0.tgz" + integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== + dependencies: + "@motionone/types" "^10.17.0" + "@motionone/utils" "^10.17.0" + tslib "^2.3.1" + +"@motionone/types@^10.12.0", "@motionone/types@^10.17.0": + version "10.17.0" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.17.0.tgz" + integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== + +"@motionone/utils@^10.12.0", "@motionone/utils@^10.17.0": + version "10.17.0" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.17.0.tgz" + integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== + dependencies: + "@motionone/types" "^10.17.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@next/env@14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz" + integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== + +"@next/eslint-plugin-next@14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz" + integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== + dependencies: + glob "10.3.10" + +"@next/swc-darwin-arm64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" + integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== + +"@next/swc-darwin-x64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" + integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== + +"@next/swc-linux-arm64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" + integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== + +"@next/swc-linux-arm64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" + integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== + +"@next/swc-linux-x64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz" + integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== + +"@next/swc-linux-x64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz" + integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== + +"@next/swc-win32-arm64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" + integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== + +"@next/swc-win32-ia32-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" + integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== + +"@next/swc-win32-x64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" + integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== + +"@next/third-parties@14.1.3": + version "14.1.3" + resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.1.3.tgz#5e14d1873638be10cbf2bb4f73038012f2131120" + integrity sha512-c3l0JnJzB5L2xXWK9DbH6nFpV1Z9vPFCiFan5l/pbwHjWGKxS8Q532MLAOW6EHB00vhCre8F/okBjGyPAGYpnw== + dependencies: + third-party-capital "1.0.20" + +"@nikolovlazar/chakra-ui-prose@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@nikolovlazar/chakra-ui-prose/-/chakra-ui-prose-1.2.1.tgz#1271da3b35ada4a2b4346f38604ff30136ee94ee" + integrity sha512-I8EZiKDGkOnzBOkPquLWir1gvHoKpo7x23O+VusK2WhPcWtgR7p56On+e/QPMCitMbV4xW997ecivCohOxGk9Q== + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-wasm@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz" + integrity sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + napi-wasm "^1.1.0" + +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@popperjs/core@^2.11.6", "@popperjs/core@^2.9.3": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@rushstack/eslint-patch@^1.3.3": + version "1.7.2" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz" + integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== + +"@scure/base@~1.1.3": + version "1.1.5" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@scure/starknet@~1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.0.0.tgz" + integrity sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.3" + +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + +"@starknet-react/chains@0.1.7", "@starknet-react/chains@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@starknet-react/chains/-/chains-0.1.7.tgz#58503379e2ffabe33b4f6e0f2aef775e84745a4d" + integrity sha512-UNh97I1SvuJKaAhKOmpEk8JcWuZWMlPG/ba2HcvFYL9x/47BKndJ+Da9V+iJFtkHUjreVnajT1snsaz1XMG+UQ== + +"@starknet-react/core@2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@starknet-react/core/-/core-2.8.0.tgz#5ad0ff09ec2095a17e285cd6d736ff6303f4a3ff" + integrity sha512-fTvTK/YdXLjb/sJ61Z1JpdO0CjtRgsfF4MTh4QioPmmqWCcOyLtoPipgxMDLDMTzNEsqxrDYjZfhYPHqUyoaag== + dependencies: + "@starknet-react/chains" "^0.1.7" + "@tanstack/react-query" "^5.0.1" + eventemitter3 "^5.0.1" + immutable "^4.3.4" + zod "^3.22.2" + +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== + dependencies: + tslib "^2.4.0" + +"@tanstack/query-core@5.28.0": + version "5.28.0" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.0.tgz" + integrity sha512-BfltXqnoIAXTCFrQCu40M3Ch7odQ6IJraTy0t8n12jAwXMYKIgDwOBWTqkSUYD+vxMi8Ag0+9F8lw9wZKhi2Yg== + +"@tanstack/react-query@^5.0.1": + version "5.28.0" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.28.0.tgz" + integrity sha512-nF4E4rFMQdh30gECGkTfyzgjgfSr4MLVgYoIsf7KqVkjUjEQHPpi9jyx10kO3Yq/OQMKOLMHAzD31st/lxDPbQ== + dependencies: + "@tanstack/query-core" "5.28.0" + +"@trpc/client@^10.38.1": + version "10.45.2" + resolved "https://registry.npmjs.org/@trpc/client/-/client-10.45.2.tgz" + integrity sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg== + +"@trpc/server@^10.38.1": + version "10.45.2" + resolved "https://registry.npmjs.org/@trpc/server/-/server-10.45.2.tgz" + integrity sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash.mergewith@4.6.7": + version "4.6.7" + resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz" + integrity sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.0" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + +"@types/mixpanel-browser@2.49.0": + version "2.49.0" + resolved "https://registry.yarnpkg.com/@types/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz#ad92ecc36fad63b9c0aed80b6283d86dbf52e49e" + integrity sha512-StmgUnS58d44DmIAEX9Kk8qwisAYCl6E2qulIjYyHXUPuJCPOuyUMTTKBp+aU2F2do+kxAzCxiBtsB4fnBT9Fg== + +"@types/mustache@4.2.5": + version "4.2.5" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.5.tgz#9129f0d6857f976e00e171bbb3460e4b702f84ef" + integrity sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA== + +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + +"@types/node@20": + version "20.14.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.7.tgz#342cada27f97509eb8eb2dbc003edf21ce8ab5a8" + integrity sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ== + dependencies: + undici-types "~5.26.4" + +"@types/normalize-package-data@^2.4.1": + version "2.4.4" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@18": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.0": + version "4.4.10" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.2.65" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz" + integrity sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@18": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@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" + integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/type-utils" "7.7.0" + "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" + integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== + dependencies: + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/typescript-estree" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" + debug "^4.3.4" + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/scope-manager@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" + integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== + dependencies: + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" + +"@typescript-eslint/type-utils@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" + integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== + dependencies: + "@typescript-eslint/typescript-estree" "7.7.0" + "@typescript-eslint/utils" "7.7.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/types@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" + integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/typescript-estree@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" + integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== + dependencies: + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" + integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/typescript-estree" "7.7.0" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@typescript-eslint/visitor-keys@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" + integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== + dependencies: + "@typescript-eslint/types" "7.7.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vercel/analytics@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-1.2.2.tgz#715d8f203a170c06ba36b363e03b048c03060d5d" + integrity sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A== + dependencies: + server-only "^0.0.1" + +"@vercel/speed-insights@^1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@vercel/speed-insights/-/speed-insights-1.0.12.tgz#71c2edffdedae98d34e306d7b0a573e6816898b4" + integrity sha512-ZGQ+a7bcfWJD2VYEp2R1LHvRAMyyaFBYytZXsfnbOMkeOvzGNVxUL7aVUvisIrTZjXTSsxG45DKX7yiw6nq2Jw== + +"@walletconnect/core@2.13.1": + version "2.13.1" + resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.13.1.tgz" + integrity sha512-h0MSYKJu9i1VEs5koCTT7c5YeQ1Kj0ncTFiMqANbDnB1r3mBulXn+FKtZ2fCmf1j7KDpgluuUzpSs+sQfPcv4Q== + dependencies: + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + "@walletconnect/relay-api" "1.0.10" + "@walletconnect/relay-auth" "1.0.4" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.1" + "@walletconnect/utils" "2.13.1" + events "3.3.0" + isomorphic-unfetch "3.1.0" + lodash.isequal "4.5.0" + uint8arrays "3.1.0" + +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" + +"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/heartbeat@1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz" + integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + events "^3.3.0" + +"@walletconnect/jsonrpc-provider@1.0.14": + version "1.0.14" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz" + integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + +"@walletconnect/jsonrpc-types@1.0.4", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz" + integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== + dependencies: + events "^3.3.0" + keyvaluestorage-interface "^1.0.0" + +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== + dependencies: + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.3" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== + dependencies: + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" + +"@walletconnect/logger@2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz" + integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== + dependencies: + "@walletconnect/safe-json" "^1.0.2" + pino "7.11.0" + +"@walletconnect/relay-api@1.0.10": + version "1.0.10" + resolved "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.10.tgz" + integrity sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + +"@walletconnect/relay-auth@1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" + +"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" + +"@walletconnect/sign-client@^2.10.1": + version "2.13.1" + resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.13.1.tgz" + integrity sha512-e+dcqcLsedB4ZjnePFM5Cy8oxu0dyz5iZfhfKH/MOrQV/hyhZ+hJwh4MmkO2QyEu2PERKs9o2Uc6x8RZdi0UAQ== + dependencies: + "@walletconnect/core" "2.13.1" + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.1" + "@walletconnect/utils" "2.13.1" + events "3.3.0" + +"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== + dependencies: + tslib "1.14.1" + +"@walletconnect/types@2.13.1": + version "2.13.1" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.13.1.tgz" + integrity sha512-CIrdt66d38xdunGCy5peOOP17EQkCEGKweXc3+Gn/RWeSiRU35I7wjC/Bp4iWcgAQ6iBTZv4jGGST5XyrOp+Pg== + dependencies: + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + events "3.3.0" + +"@walletconnect/utils@2.13.1": + version "2.13.1" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.13.1.tgz" + integrity sha512-EcooXXlqy5hk9hy/nK2wBF/qxe7HjH0K8ZHzjKkXRkwAE5pCvy0IGXIXWmUR9sw8LFJEqZyd8rZdWLKNUe8hqA== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "1.0.3" + "@walletconnect/relay-api" "1.0.10" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.1" + "@walletconnect/window-getters" "1.0.1" + "@walletconnect/window-metadata" "1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "3.1.0" + +"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + +"@walletconnect/window-metadata@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== + dependencies: + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" + +"@zag-js/dom-query@0.16.0": + version "0.16.0" + resolved "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz" + integrity sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ== + +"@zag-js/element-size@0.10.5": + version "0.10.5" + resolved "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz" + integrity sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w== + +"@zag-js/focus-visible@0.16.0": + version "0.16.0" + resolved "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz" + integrity sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA== + dependencies: + "@zag-js/dom-query" "0.16.0" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abi-wan-kanabi@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.1.tgz" + integrity sha512-W3RNuu2tG10W4AY63uq89JX/MsZSOxvpmsitQ3pbdVn3e8RxXR2oegN0QmGpgfyT0KlPdreydHsqq/u+2Pt2PQ== + dependencies: + ansicolors "^0.3.2" + cardinal "^2.1.1" + fs-extra "^10.0.0" + yargs "^17.7.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.11.3: + version "8.11.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansicolors@^0.3.2, ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.1.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.filter@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz" + integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.findlast@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz" + integrity sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.4" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz" + integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +autoprefixer@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.0.1.tgz#e2d9000f84ebd98d77b7bc16f8adb2ff1f7bb946" + integrity sha512-aQo2BDIsoOdemXUAOBpFv4ZQa2DrOtEufarYhtFsK1088Ca0TUwu/aQWf0M3mrILXZ3mTIVn1lR3hPW8acacsw== + dependencies: + browserslist "^4.14.5" + caniuse-lite "^1.0.30001137" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axios@1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bignumber.js@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.4.tgz#7c40f5abcd2d6623ab7b99682ee7db81b11889a4" + integrity sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== + dependencies: + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" + node-releases "^2.0.14" + update-browserslist-db "^1.0.16" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001137, caniuse-lite@^1.0.30001629: + version "1.0.30001636" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" + integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== + +caniuse-lite@^1.0.30001579: + version "1.0.30001597" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz" + integrity sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w== + +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chroma.ts@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/chroma.ts/-/chroma.ts-1.0.10.tgz#2b965d8f2c2eee44d25072902e5787fe259d4565" + integrity sha512-0FOQiB6LaiOwoyaxP+a4d3sCIOSf7YvBKj3TfeQM4ZBb2yskRxe4FlT2P4YNpHz7kIB5rXsfmpyniyrYRRyVHw== + +citty@^0.1.5, citty@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz" + integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== + dependencies: + consola "^3.2.3" + +classnames@^2.2.5, classnames@^2.3.2: + version "2.5.1" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +client-only@0.0.1, client-only@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clipboardy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz" + integrity sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w== + dependencies: + execa "^8.0.1" + is-wsl "^3.1.0" + is64bit "^2.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color2k@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" + integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colorette@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +compute-scroll-into-view@3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz" + integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confbox@^0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz" + integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== + +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + +conventional-changelog-angular@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-atom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz" + integrity sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw== + +conventional-changelog-codemirror@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz" + integrity sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q== + +conventional-changelog-conventionalcommits@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz" + integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-core@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz" + integrity sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg== + dependencies: + "@hutson/parse-repository-url" "^5.0.0" + add-stream "^1.0.0" + conventional-changelog-writer "^7.0.0" + conventional-commits-parser "^5.0.0" + git-raw-commits "^4.0.0" + git-semver-tags "^7.0.0" + hosted-git-info "^7.0.0" + normalize-package-data "^6.0.0" + read-pkg "^8.0.0" + read-pkg-up "^10.0.0" + +conventional-changelog-ember@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz" + integrity sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA== + +conventional-changelog-eslint@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz" + integrity sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA== + +conventional-changelog-express@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz" + integrity sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw== + +conventional-changelog-jquery@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz" + integrity sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw== + +conventional-changelog-jshint@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz" + integrity sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-preset-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz" + integrity sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA== + +conventional-changelog-writer@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz" + integrity sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA== + dependencies: + conventional-commits-filter "^4.0.0" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + meow "^12.0.1" + semver "^7.5.2" + split2 "^4.0.0" + +conventional-changelog@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-5.1.0.tgz#04b36a5ad0518e0323e9d629e3b86e34f7abb7eb" + integrity sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg== + dependencies: + conventional-changelog-angular "^7.0.0" + conventional-changelog-atom "^4.0.0" + conventional-changelog-codemirror "^4.0.0" + conventional-changelog-conventionalcommits "^7.0.2" + conventional-changelog-core "^7.0.0" + conventional-changelog-ember "^4.0.0" + conventional-changelog-eslint "^5.0.0" + conventional-changelog-express "^4.0.0" + conventional-changelog-jquery "^5.0.0" + conventional-changelog-jshint "^4.0.0" + conventional-changelog-preset-loader "^4.1.0" + +conventional-commits-filter@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz" + integrity sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A== + +conventional-commits-parser@5.0.0, conventional-commits-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" + integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== + dependencies: + JSONStream "^1.3.5" + is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-es@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz" + integrity sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw== + +copy-to-clipboard@3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crossws@^0.2.0, crossws@^0.2.2: + version "0.2.4" + resolved "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz" + integrity sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg== + +css-box-model@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dargs@^8.0.0: + version "8.1.0" + resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" + integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== + +debug@^2.1.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defu@^6.1.3, defu@^6.1.4: + version "6.1.4" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destr@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== + +detect-browser@5.3.0, detect-browser@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexify@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz" + integrity sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.796: + version "1.4.808" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz#85b2f93a5e32c2949a1a4d39375851945c936835" + integrity sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ== + +embla-carousel-autoplay@8.1.6: + version "8.1.6" + resolved "https://registry.yarnpkg.com/embla-carousel-autoplay/-/embla-carousel-autoplay-8.1.6.tgz#24696cb6037bbb3e894f51a8bcf6698c81ea38cf" + integrity sha512-e5n9f4q+DVeBPiPPT3gwzqpiqfae8aP8fQACS4OZkPFvFLdsVhnWcw+cwtewryP7snWJGKPXEMA1GOjieEKv+w== + +embla-carousel-react@8.1.6: + version "8.1.6" + resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.1.6.tgz#4de0cef2888443f4203408df73af2707e5c961e9" + integrity sha512-DHxwFzF63yVrU95Eo58E9Xr5b6Y9ul6TTsqb/rtwMi+jXudAmIqN1i9iBxQ73i8jKuUVxll/ziNYMmnWvrdQJQ== + dependencies: + embla-carousel "8.1.6" + embla-carousel-reactive-utils "8.1.6" + +embla-carousel-reactive-utils@8.1.6: + version "8.1.6" + resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.1.6.tgz#51c4a1dc6df1e608e9480f7a5fc3328e95926f91" + integrity sha512-Wg+J2YoqLqkaqsXi7fTJaLmXm6BpgDRJ0EfTdvQ4KE/ip5OsUuKGpJsEQDTt4waGXSDyZhIBlfoQtgGJeyYQ1Q== + +embla-carousel@8.1.6: + version "8.1.6" + resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.1.6.tgz#a67f0b51f0cb51131299c47dff18e2d08165d44a" + integrity sha512-9n7FVsbPAs1KD+JmO84DnEDOZMXPBQbLujjMQqvsBRN2CDWwgZ9hRSNapztdPnyJfzOIxowGmj0BUQ8ACYAPkA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.12.0: + version "5.16.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-ex@^1.3.1, error-ex@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: + version "1.22.5" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.14" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.0.0, es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.17" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz" + integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.22.4" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.0" + +es-set-tostringtag@^2.0.2, es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz" + integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== + dependencies: + "@next/eslint-plugin-next" "14.1.0" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.34.0" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz" + integrity sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-plugin-unused-imports@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz#db015b569d3774e17a482388c95c17bd303bc602" + integrity sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethers@6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" + integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@3.3.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.0.0: + version "3.5.0" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fetch-cookie@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz" + 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" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +focus-lock@^1.3.2: + version "1.3.4" + resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.4.tgz" + integrity sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA== + dependencies: + tslib "^2.0.3" + +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +framer-motion@11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.5.tgz#2ae1341d8605a01c50009d3bb195a67e4e2bfc69" + integrity sha512-Lb0EYbQcSK/pgyQUJm+KzsQrKrJRX9sFRyzl9hSr9gFG4Mk8yP7BjhuxvRXzblOM/+JxycrJdCDVmOQBsjpYlw== + dependencies: + tslib "^2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framer-motion@^6.3.11: + version "6.5.1" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz" + integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== + dependencies: + "@motionone/dom" "10.12.0" + framesync "6.0.1" + hey-listen "^1.0.8" + popmotion "11.0.3" + style-value-types "5.0.0" + tslib "^2.1.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz" + integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== + dependencies: + tslib "^2.1.0" + +framesync@6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz" + integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== + dependencies: + tslib "2.4.0" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-port-please@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz" + integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== + +get-starknet-core@3.2.0, get-starknet-core@^3.0.1, get-starknet-core@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/get-starknet-core/-/get-starknet-core-3.2.0.tgz" + integrity sha512-SZhxtLlKoPKLZ2H3l9WIU7CiNmkL3qLWGksALmvZdAXa/9PykYfLtvIB5B8A2UZMpf2ojTZlWLfuo1KhgmVobA== + +get-starknet@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/get-starknet/-/get-starknet-3.0.1.tgz#46a4ece33defcedf83d8e006e1222bb868132116" + integrity sha512-EyUl+DVQH5PXW2OUdY06/yaqlMizzLKRLzp3S+VhYz+l6wGvW5pmhTXHLaYI4hWfebIDfFkFvAPxVPv/TkWLyA== + dependencies: + bowser "^2.11.0" + get-starknet-core "^3.0.1" + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.3" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + +git-raw-commits@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" + integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== + dependencies: + dargs "^8.0.0" + meow "^12.0.1" + split2 "^4.0.0" + +git-semver-tags@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz" + integrity sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q== + dependencies: + meow "^12.0.1" + semver "^7.5.2" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10, glob@^10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +goober@^2.1.10: + version "2.1.14" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +h3@^1.10.2, h3@^1.11.1: + version "1.11.1" + resolved "https://registry.npmjs.org/h3/-/h3-1.11.1.tgz" + integrity sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A== + dependencies: + cookie-es "^1.0.0" + crossws "^0.2.2" + defu "^6.1.4" + destr "^2.0.3" + iron-webcrypto "^1.0.0" + ohash "^1.1.3" + radix3 "^1.1.0" + ufo "^1.4.0" + uncrypto "^0.1.3" + unenv "^1.9.0" + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + +http-shutdown@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz" + integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +husky@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.1.tgz#73f8f1b58329f377654293148c1a6458f54ca224" + integrity sha512-fCqlqLXcBnXa/TJXmT93/A36tJsjdJkibQ1MuIiFyCCYUlpYpIaj2mv1w+3KR6Rzu1IC3slFTje5f6DUp2A2rg== + +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +immutable@^4.3.4: + version "4.3.5" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +iron-webcrypto@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz" + integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +is64bit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz" + integrity sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw== + dependencies: + system-architecture "^0.1.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +isomorphic-unfetch@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.17.2: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +jotai-tanstack-query@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/jotai-tanstack-query/-/jotai-tanstack-query-0.8.5.tgz#12616f18a7623cc3786f3e2d7b1e1b2dc60394b2" + integrity sha512-cFq+1sE7Qkt7Kh9Db2KE8LXdbPiGwCiy8S5YSEnjUDxF59A4XhoXTDJBuPiMIA1dD1/yMsNKr1ADfN5CvscYZw== + +jotai@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.6.4.tgz#a68a76f0e5cd2b614afae7112cfc52a77dbfe038" + integrity sha512-RniwQPX4893YlNR1muOtyUGHYaTD1fhEN4qnOuZJSrDHj6xdEMrqlRSN/hCm2fshwk78ruecB/P2l+NCVWe6TQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz" + integrity sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw== + dependencies: + debug "^2.1.3" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lines-and-columns@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== + +listhen@^1.7.2: + version "1.7.2" + resolved "https://registry.npmjs.org/listhen/-/listhen-1.7.2.tgz" + integrity sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g== + dependencies: + "@parcel/watcher" "^2.4.1" + "@parcel/watcher-wasm" "^2.4.1" + citty "^0.1.6" + clipboardy "^4.0.0" + consola "^3.2.3" + crossws "^0.2.0" + defu "^6.1.4" + get-port-please "^3.1.2" + h3 "^1.10.2" + http-shutdown "^1.2.2" + jiti "^1.21.0" + mlly "^1.6.1" + node-forge "^1.3.1" + pathe "^1.1.2" + std-env "^3.7.0" + ufo "^1.4.0" + untun "^0.1.3" + uqr "^0.1.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz" + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lossless-json@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lossless-json/-/lossless-json-4.0.1.tgz" + integrity sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA== + +lru-cache@^10.0.1, lru-cache@^10.2.0, "lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +mixpanel-browser@2.49.0: + version "2.49.0" + resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz#de3f4f2d0f3a32b4babf6d827ef983a9fd48a711" + integrity sha512-RZJCO7XXuuHBAWG5fd9Mavz994M7v7W3Qiaq8NzmN631pa4BQ0vNZQtRFqKcCCOBn4xqOZbX2GkuC7ZkQoL4cQ== + +mlly@^1.6.1, mlly@^1.7.0: + version "1.7.1" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz" + integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== + dependencies: + acorn "^8.11.3" + pathe "^1.1.2" + pkg-types "^1.1.1" + ufo "^1.5.3" + +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +mustache@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-wasm@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" + integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next@14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/next/-/next-14.1.0.tgz" + integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== + dependencies: + "@next/env" "14.1.0" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.1.0" + "@next/swc-darwin-x64" "14.1.0" + "@next/swc-linux-arm64-gnu" "14.1.0" + "@next/swc-linux-arm64-musl" "14.1.0" + "@next/swc-linux-x64-gnu" "14.1.0" + "@next/swc-linux-x64-musl" "14.1.0" + "@next/swc-win32-arm64-msvc" "14.1.0" + "@next/swc-win32-ia32-msvc" "14.1.0" + "@next/swc-win32-x64-msvc" "14.1.0" + +node-addon-api@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz" + integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== + +node-fetch-native@^1.6.1, node-fetch-native@^1.6.2, node-fetch-native@^1.6.3: + version "1.6.4" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz" + integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-package-data@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz" + integrity sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ== + dependencies: + hosted-git-info "^7.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz" + integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== + dependencies: + array.prototype.filter "^1.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + +object.hasown@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +ofetch@^1.3.3: + version "1.3.4" + resolved "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz" + integrity sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw== + dependencies: + destr "^2.0.3" + node-fetch-native "^1.6.3" + ufo "^1.5.3" + +ohash@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz" + integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== + +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +pako@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-json@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz" + integrity sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw== + dependencies: + "@babel/code-frame" "^7.21.4" + error-ex "^1.3.2" + json-parse-even-better-errors "^3.0.0" + lines-and-columns "^2.0.3" + type-fest "^3.8.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-types@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz" + integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== + dependencies: + confbox "^0.1.7" + mlly "^1.7.0" + pathe "^1.1.2" + +popmotion@11.0.3: + version "11.0.3" + resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz" + integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== + dependencies: + framesync "6.0.1" + hey-listen "^1.0.8" + style-value-types "5.0.0" + tslib "^2.1.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11: + version "6.0.16" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8, postcss@^8.0.9: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +radix3@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz" + integrity sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== + +react-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== + 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" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-easy-swipe@^0.0.21: + version "0.0.21" + resolved "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.21.tgz" + integrity sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg== + dependencies: + prop-types "^15.5.8" + +react-fast-compare@3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-focus-lock@^2.9.4: + version "2.11.2" + resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.2.tgz" + integrity sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^1.3.2" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-hot-toast@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" + integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== + dependencies: + goober "^2.1.10" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-mixpanel@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-mixpanel/-/react-mixpanel-1.0.5.tgz#38c0078577dddd6ac01fbaa8a638d6b291f76446" + integrity sha512-2ZLXO01ZEVGSIHN62OrsBQ5zmuKV9QUNJy5jeCOmKEhZUcxT49hOd5dbSB+W8epjMS/eBcw9RsPk8TJlPadwhQ== + +react-pro-sidebar@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-pro-sidebar/-/react-pro-sidebar-1.1.0.tgz#e8f4ca0d7c4ff9fd2c38f8a0b85664083173b7ac" + integrity sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ== + dependencies: + "@emotion/react" "^11.10.5" + "@emotion/styled" "^11.10.5" + "@popperjs/core" "^2.11.6" + classnames "^2.3.2" + +react-remove-scroll-bar@^2.3.4: + version "2.3.6" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.6: + version "2.5.7" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz" + integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== + dependencies: + react-remove-scroll-bar "^2.3.4" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-responsive-carousel@3.2.23: + version "3.2.23" + resolved "https://registry.yarnpkg.com/react-responsive-carousel/-/react-responsive-carousel-3.2.23.tgz#4c0016ff54603e604bb5c1f9e7ef2d1eda133f1d" + integrity sha512-pqJLsBaKHWJhw/ItODgbVoziR2z4lpcJg+YwmRlSk4rKH32VE633mAtZZ9kDXjy4wFO+pgUZmDKPsPe1fPmHCg== + dependencies: + classnames "^2.2.5" + prop-types "^15.5.8" + react-easy-swipe "^0.0.21" + +react-select@5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.8.0.tgz#bd5c467a4df223f079dd720be9498076a3f085b5" + integrity sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.1.2" + +react-share@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/react-share/-/react-share-5.1.0.tgz#27eff763e5c233c8765cacf595b039093cb9b408" + integrity sha512-OvyfMtj/0UzH1wi90OdHhZVJ6WUC/+IeWvBwppeZozwIGyAjQgyR0QXlHOrxVHVECqnGvcpBaFTXVrqouTieaw== + dependencies: + classnames "^2.3.2" + jsonp "^0.2.1" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-transition-group@^4.3.0: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@18: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-pkg-up@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz" + integrity sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA== + dependencies: + find-up "^6.3.0" + read-pkg "^8.1.0" + type-fest "^4.2.0" + +read-pkg@^8.0.0, read-pkg@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz" + integrity sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ== + dependencies: + "@types/normalize-package-data" "^2.4.1" + normalize-package-data "^6.0.0" + parse-json "^7.0.0" + type-fest "^4.2.0" + +readable-stream@^3.1.1: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + +reflect.getprototypeof@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz" + integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + get-intrinsic "^1.2.3" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.5.2, semver@^7.5.4, semver@^7.6.0: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +server-only@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz" + integrity sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA== + +set-cookie-parser@^2.4.8: + version "2.6.0" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +sharp@0.33.4: + version "0.33.4" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.4.tgz#b88e6e843e095c6ab5e1a0c59c4885e580cd8405" + integrity sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.0" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.4" + "@img/sharp-darwin-x64" "0.33.4" + "@img/sharp-libvips-darwin-arm64" "1.0.2" + "@img/sharp-libvips-darwin-x64" "1.0.2" + "@img/sharp-libvips-linux-arm" "1.0.2" + "@img/sharp-libvips-linux-arm64" "1.0.2" + "@img/sharp-libvips-linux-s390x" "1.0.2" + "@img/sharp-libvips-linux-x64" "1.0.2" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" + "@img/sharp-libvips-linuxmusl-x64" "1.0.2" + "@img/sharp-linux-arm" "0.33.4" + "@img/sharp-linux-arm64" "0.33.4" + "@img/sharp-linux-s390x" "0.33.4" + "@img/sharp-linux-x64" "0.33.4" + "@img/sharp-linuxmusl-arm64" "0.33.4" + "@img/sharp-linuxmusl-x64" "0.33.4" + "@img/sharp-wasm32" "0.33.4" + "@img/sharp-win32-ia32" "0.33.4" + "@img/sharp-win32-x64" "0.33.4" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.17" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +starknet@6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.4.1.tgz#bcb3f98c091cde67946f09393775a1a8276e36c2" + integrity sha512-CtjSzkI0P6O0FuYsW39+m+a00xKtQFYfz4rdZGn3JgEoR78X691OlscA+Q0yq285NwjjFvPn6WJxlRs2q3aL2w== + dependencies: + "@noble/curves" "~1.3.0" + "@scure/base" "~1.1.3" + "@scure/starknet" "~1.0.0" + abi-wan-kanabi "^2.2.1" + fetch-cookie "^3.0.0" + isomorphic-fetch "^3.0.0" + lossless-json "^4.0.1" + pako "^2.0.4" + ts-mixer "^6.0.3" + url-join "^4.0.1" + +starknetkit@1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/starknetkit/-/starknetkit-1.1.9.tgz#92ff7536b2bdc36017e4b16067f4c5ba264b4981" + integrity sha512-KarnNS9sJoImTdpTKizyNzDlQSAOutbzuZ6CzHQpJHWzaf8ION9aIf+d87sY7hSlbmD7cqGRUG28Hpke24arCg== + dependencies: + "@trpc/client" "^10.38.1" + "@trpc/server" "^10.38.1" + "@walletconnect/sign-client" "^2.10.1" + bowser "^2.11.0" + detect-browser "^5.3.0" + eventemitter3 "^5.0.1" + events "^3.3.0" + get-starknet-core "^3.1.0" + lodash-es "^4.17.21" + svelte-forms "^2.3.1" + trpc-browser "^1.3.2" + +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +stream-shift@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.10: + version "4.0.10" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-value-types@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz" + integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== + dependencies: + hey-listen "^1.0.8" + tslib "^2.1.0" + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +sucrase@^3.29.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svelte-forms@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/svelte-forms/-/svelte-forms-2.3.1.tgz" + integrity sha512-ExX9PM0JgvdOWlHl2ztD7XzLNPOPt9U5hBKV8sUAisMfcYWpPRnyz+6EFmh35BOBGJJmuhTDBGm5/7seLjOTIA== + dependencies: + is-promise "^4.0.0" + +swr@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" + integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg== + dependencies: + client-only "^0.0.1" + use-sync-external-store "^1.2.0" + +system-architecture@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz" + integrity sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA== + +tailwindcss@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.0.tgz#8cab40e5a10a10648118c0859ba8bfbc744a761e" + integrity sha512-hOXlFx+YcklJ8kXiCAfk/FMyr4Pm9ck477G0m/us2344Vuj355IpoEDB5UmGAsSpTBmr+4ZhjzW04JuFXkb/fw== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.17.2" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.0.9" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + sucrase "^3.29.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-extensions@^2.0.0: + version "2.4.0" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" + integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +third-party-capital@1.0.20: + version "1.0.20" + resolved "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz" + integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== + +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-invariant@^1.0.6: + version "1.3.3" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trpc-browser@^1.3.2: + version "1.4.2" + resolved "https://registry.npmjs.org/trpc-browser/-/trpc-browser-1.4.2.tgz" + integrity sha512-A4p5LtEiI81fEBi/RduirnXx6MrbKab+qpu9lzYONVEVHeWkXzmIzGlG2gfowWgBmxtKKjku8F3fZTrPxl93Gw== + +ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +ts-mixer@^6.0.3: + version "6.0.4" + resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" + integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@1.14.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^3.8.0: + version "3.13.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + +type-fest@^4.2.0: + version "4.18.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz" + integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@5: + version "5.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" + integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== + +ua-parser-js@^1.0.33: + version "1.0.37" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== + +ufo@^1.4.0, ufo@^1.5.3: + version "1.5.3" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz" + integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +uint8arrays@3.1.0, uint8arrays@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz" + integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== + dependencies: + multiformats "^9.4.2" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unenv@^1.9.0: + version "1.9.0" + resolved "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz" + integrity sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g== + dependencies: + consola "^3.2.3" + defu "^6.1.3" + mime "^3.0.0" + node-fetch-native "^1.6.1" + pathe "^1.1.1" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unstorage@^1.9.0: + version "1.10.2" + resolved "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz" + integrity sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ== + dependencies: + anymatch "^3.1.3" + chokidar "^3.6.0" + destr "^2.0.3" + h3 "^1.11.1" + listhen "^1.7.2" + lru-cache "^10.2.0" + mri "^1.2.0" + node-fetch-native "^1.6.2" + ofetch "^1.3.3" + ufo "^1.4.0" + +untun@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz" + integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== + dependencies: + citty "^0.1.5" + consola "^3.2.3" + pathe "^1.1.1" + +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uqr@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz" + integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.1" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz" + integrity sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ== + dependencies: + tslib "^2.0.0" + +use-isomorphic-layout-effect@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wonka@6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/wonka/-/wonka-6.3.4.tgz#76eb9316e3d67d7febf4945202b5bdb2db534594" + integrity sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^7.5.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zod@^3.22.2: + version "3.22.4" + resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== From 336810320e44eb04f8105d974c8e47e141686e43 Mon Sep 17 00:00:00 2001 From: akira-zkdice Date: Tue, 6 Aug 2024 16:31:09 +0530 Subject: [PATCH 13/13] lintfix --- .eslintrc.json | 294 ++++---- .husky/pre-commit | 3 +- package.json | 170 ++--- src/app/api/stats/[address]/route.ts | 80 +- src/app/api/stats/route.ts | 62 +- src/app/api/strategies/route.ts | 34 +- src/app/layout.tsx | 90 +-- src/app/page.tsx | 470 ++++++------ src/app/slinks/layout.tsx | 116 +-- src/app/slinks/page.tsx | 278 +++---- src/app/slinks/template.tsx | 248 +++---- src/app/strategy/components/Strategy.tsx | 900 +++++++++++------------ src/app/strategy/page.tsx | 78 +- src/app/template.tsx | 248 +++---- src/components/Deposit.tsx | 698 +++++++++--------- src/components/Navbar.tsx | 534 +++++++------- src/components/Strategies.tsx | 686 ++++++++--------- src/components/TxButton.tsx | 244 +++--- src/constants.ts | 336 ++++----- src/store/IDapp.store.ts | 154 ++-- src/store/balance.atoms.ts | 384 +++++----- src/store/carmine.store.ts | 354 ++++----- src/store/ekobu.store.ts | 802 ++++++++++---------- src/store/hashstack.store.ts | 194 ++--- src/store/lending.base.ts | 328 ++++----- src/store/nimbora.store.ts | 90 +-- src/store/nostralending.store.ts | 312 ++++---- src/store/pools.ts | 542 +++++++------- src/store/strategies.atoms.ts | 252 +++---- src/store/zklend.store.ts | 180 ++--- src/strategies/IStrategy.ts | 660 ++++++++--------- src/strategies/auto_strk.strat.ts | 618 ++++++++-------- src/strategies/delta_neutral_mm.ts | 796 ++++++++++---------- src/strategies/simple.stable.strat.ts | 178 ++--- src/utils/MyNumber.ts | 224 +++--- tsconfig.json | 56 +- 36 files changed, 5846 insertions(+), 5847 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 4fd5089..e253f9b 100755 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,147 +1,147 @@ -{ - "parser": "@typescript-eslint/parser", - "env": { - "browser": true, - "node": true, - "es6": true, - "jest": true, - "mocha": true - }, - "plugins": ["@typescript-eslint", "unused-imports"], - "extends": [ - "next/core-web-vitals", - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "parserOptions": { - "ecmaVersion": 2018 - }, - "rules": { - "no-unused-vars": "off", - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "warn", - { - "vars": "all", - "varsIgnorePattern": "^_", - "args": "after-used", - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-namespace": "off", - "strict": 0, - "no-underscore-dangle": 0, - "no-mixed-requires": 0, - "no-process-exit": 0, - "no-warning-comments": 0, - "no-use-before-define": 0, - "curly": 0, - "no-multi-spaces": 0, - "no-alert": 0, - "consistent-return": 0, - "consistent-this": [0, "self"], - "func-style": 0, - "max-nested-callbacks": 0, - "camelcase": 0, - "no-dupe-class-members": 0, - - // Warnings - "no-debugger": 1, - "no-empty": 1, - "no-invalid-regexp": 1, - "no-unused-expressions": 1, - "no-native-reassign": 1, - "no-fallthrough": 1, - - // Errors - "eqeqeq": ["warn"], - "no-undef": 2, - "no-dupe-keys": 2, - "no-empty-character-class": 2, - "no-self-compare": 2, - "valid-typeof": 2, - "handle-callback-err": 2, - "no-shadow-restricted-names": 2, - "no-new-require": 2, - "no-mixed-spaces-and-tabs": 2, - "block-scoped-var": 2, - "no-else-return": 2, - "no-throw-literal": 2, - "no-void": 2, - "radix": 2, - "wrap-iife": [2, "outside"], - "no-shadow": 0, - "no-path-concat": 2, - "valid-jsdoc": [ - 0, - { - "requireReturn": false, - "requireParamDescription": false, - "requireReturnDescription": false - } - ], - - // stylistic errors - "no-spaced-func": 2, - "semi-spacing": 2, - "key-spacing": [2, { "beforeColon": false, "afterColon": true }], - "no-lonely-if": 2, - "no-floating-decimal": 2, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - // "comma": [2, "last"], - "no-multiple-empty-lines": [2, { "max": 1 }], - // "no-nested-ternary": 2, - "operator-assignment": [2, "always"], - "padded-blocks": [2, "never"], - "quote-props": [2, "as-needed"], - "keyword-spacing": [2, { "before": true, "after": true, "overrides": {} }], - "space-before-blocks": [2, "always"], - "array-bracket-spacing": [2, "never"], - "computed-property-spacing": [2, "never"], - "space-in-parens": [2, "never"], - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "wrap-regex": 2, - "linebreak-style": 0, - "semi": [2, "always"], - "arrow-spacing": [2, { "before": true, "after": true }], - "no-class-assign": 2, - "no-const-assign": 2, - "no-this-before-super": 2, - "no-var": 2, - "object-shorthand": [2, "always"], - "prefer-arrow-callback": 2, - "prefer-const": 2, - "prefer-spread": 2, - "prefer-template": 2, - - // typescript - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-use-before-define": ["off"], - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-unnecessary-type-constraint": "off", - "@typescript-eslint/ban-types": "off" - }, - "overrides": [ - { - "files": [ - "test/**", - "*.spec.ts", - "*.test.ts", - "*.jsx", - "*.tsx", - "*.ts", - "*.js" - ], - "rules": { - "prefer-arrow-callback": 0, - "@typescript-eslint/no-non-null-assertion": 0, - "@typescript-eslint/no-unused-vars": 0 - } - } - ] -} +{ + "parser": "@typescript-eslint/parser", + "env": { + "browser": true, + "node": true, + "es6": true, + "jest": true, + "mocha": true + }, + "plugins": ["@typescript-eslint", "unused-imports"], + "extends": [ + "next/core-web-vitals", + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "no-unused-vars": "off", + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": [ + "warn", + { + "vars": "all", + "varsIgnorePattern": "^_", + "args": "after-used", + "argsIgnorePattern": "^_" + } + ], + "@typescript-eslint/no-namespace": "off", + "strict": 0, + "no-underscore-dangle": 0, + "no-mixed-requires": 0, + "no-process-exit": 0, + "no-warning-comments": 0, + "no-use-before-define": 0, + "curly": 0, + "no-multi-spaces": 0, + "no-alert": 0, + "consistent-return": 0, + "consistent-this": [0, "self"], + "func-style": 0, + "max-nested-callbacks": 0, + "camelcase": 0, + "no-dupe-class-members": 0, + + // Warnings + "no-debugger": 1, + "no-empty": 1, + "no-invalid-regexp": 1, + "no-unused-expressions": 1, + "no-native-reassign": 1, + "no-fallthrough": 1, + + // Errors + "eqeqeq": ["warn"], + "no-undef": 2, + "no-dupe-keys": 2, + "no-empty-character-class": 2, + "no-self-compare": 2, + "valid-typeof": 2, + "handle-callback-err": 2, + "no-shadow-restricted-names": 2, + "no-new-require": 2, + "no-mixed-spaces-and-tabs": 2, + "block-scoped-var": 2, + "no-else-return": 2, + "no-throw-literal": 2, + "no-void": 2, + "radix": 2, + "wrap-iife": [2, "outside"], + "no-shadow": 0, + "no-path-concat": 2, + "valid-jsdoc": [ + 0, + { + "requireReturn": false, + "requireParamDescription": false, + "requireReturnDescription": false + } + ], + + // stylistic errors + "no-spaced-func": 2, + "semi-spacing": 2, + "key-spacing": [2, { "beforeColon": false, "afterColon": true }], + "no-lonely-if": 2, + "no-floating-decimal": 2, + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + // "comma": [2, "last"], + "no-multiple-empty-lines": [2, { "max": 1 }], + // "no-nested-ternary": 2, + "operator-assignment": [2, "always"], + "padded-blocks": [2, "never"], + "quote-props": [2, "as-needed"], + "keyword-spacing": [2, { "before": true, "after": true, "overrides": {} }], + "space-before-blocks": [2, "always"], + "array-bracket-spacing": [2, "never"], + "computed-property-spacing": [2, "never"], + "space-in-parens": [2, "never"], + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "wrap-regex": 2, + "linebreak-style": 0, + "semi": [2, "always"], + "arrow-spacing": [2, { "before": true, "after": true }], + "no-class-assign": 2, + "no-const-assign": 2, + "no-this-before-super": 2, + "no-var": 2, + "object-shorthand": [2, "always"], + "prefer-arrow-callback": 2, + "prefer-const": 2, + "prefer-spread": 2, + "prefer-template": 2, + + // typescript + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-use-before-define": ["off"], + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-unnecessary-type-constraint": "off", + "@typescript-eslint/ban-types": "off" + }, + "overrides": [ + { + "files": [ + "test/**", + "*.spec.ts", + "*.test.ts", + "*.jsx", + "*.tsx", + "*.ts", + "*.js" + ], + "rules": { + "prefer-arrow-callback": 0, + "@typescript-eslint/no-non-null-assertion": 0, + "@typescript-eslint/no-unused-vars": 0 + } + } + ] +} diff --git a/.husky/pre-commit b/.husky/pre-commit index 6c59a24..e72aa91 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1 @@ -yarn run lint:fix -yarn run format:fix +yarn run lint:fix && yarn run format:fix \ No newline at end of file diff --git a/package.json b/package.json index 3d5e869..4beee7f 100755 --- a/package.json +++ b/package.json @@ -1,85 +1,85 @@ -{ - "name": "strkfarm-client", - "version": "0.1.1", - "private": true, - "scripts": { - "dev": "next dev", - "start": "next start", - "lint": "next lint", - "build": "next build", - "lint:check": "eslint --config .eslintrc.json .", - "lint:fix": "eslint --config .eslintrc.json . --fix", - "format:check": "prettier --check \"**/*.{ts,tsx,json}\"", - "format:fix": "prettier --write \"**/*.{ts,tsx,json}\"", - "prepare": "husky" - }, - "files": [ - "CHANGELOG.md", - "dist" - ], - "dependencies": { - "@ajna/pagination": "1.4.19", - "@chakra-ui/icons": "2.1.1", - "@chakra-ui/react": "2.8.2", - "@emotion/react": "11.11.3", - "@emotion/styled": "11.11.0", - "@next/third-parties": "14.1.3", - "@nikolovlazar/chakra-ui-prose": "1.2.1", - "@starknet-react/chains": "0.1.7", - "@starknet-react/core": "2.8.0", - "@tanstack/query-core": "5.28.0", - "@types/mixpanel-browser": "2.49.0", - "@types/mustache": "4.2.5", - "@vercel/analytics": "1.2.2", - "@vercel/speed-insights": "^1.0.12", - "axios": "1.6.7", - "bignumber.js": "4.0.4", - "chroma.ts": "1.0.10", - "ethers": "6.11.1", - "framer-motion": "11.0.5", - "get-starknet": "3.0.1", - "get-starknet-core": "3.2.0", - "jotai": "2.6.4", - "jotai-tanstack-query": "0.8.5", - "mixpanel-browser": "2.49.0", - "mustache": "4.2.0", - "next": "14.1.0", - "react": "18", - "react-device-detect": "2.2.3", - "react-dom": "18", - "react-hot-toast": "2.4.1", - "react-mixpanel": "1.0.5", - "react-pro-sidebar": "1.1.0", - "react-responsive-carousel": "3.2.23", - "react-select": "5.8.0", - "react-share": "5.1.0", - "sharp": "0.33.4", - "starknet": "6.4.1", - "starknetkit": "1.1.9", - "swr": "2.2.5", - "wonka": "6.3.4" - }, - "devDependencies": { - "@types/node": "20", - "@types/react": "18", - "@types/react-dom": "18", - "@typescript-eslint/eslint-plugin": "7.7.0", - "@typescript-eslint/parser": "7.7.0", - "autoprefixer": "10.0.1", - "conventional-changelog": "5.1.0", - "conventional-commits-parser": "5.0.0", - "embla-carousel-autoplay": "8.1.6", - "embla-carousel-react": "8.1.6", - "eslint": "8", - "eslint-config-next": "14.1.0", - "eslint-plugin-unused-imports": "3.1.0", - "husky": "^9.1.1", - "postcss": "8", - "prettier": "3.3.3", - "tailwindcss": "3.3.0", - "typescript": "5" - }, - "engines": { - "node": "20.x" - } -} +{ + "name": "strkfarm-client", + "version": "0.1.1", + "private": true, + "scripts": { + "dev": "next dev", + "start": "next start", + "lint": "next lint", + "build": "next build", + "lint:check": "eslint --config .eslintrc.json .", + "lint:fix": "eslint --config .eslintrc.json . --fix", + "format:check": "prettier --check \"**/*.{ts,tsx,json}\"", + "format:fix": "prettier --write \"**/*.{ts,tsx,json}\"", + "prepare": "husky" + }, + "files": [ + "CHANGELOG.md", + "dist" + ], + "dependencies": { + "@ajna/pagination": "1.4.19", + "@chakra-ui/icons": "2.1.1", + "@chakra-ui/react": "2.8.2", + "@emotion/react": "11.11.3", + "@emotion/styled": "11.11.0", + "@next/third-parties": "14.1.3", + "@nikolovlazar/chakra-ui-prose": "1.2.1", + "@starknet-react/chains": "0.1.7", + "@starknet-react/core": "2.8.0", + "@tanstack/query-core": "5.28.0", + "@types/mixpanel-browser": "2.49.0", + "@types/mustache": "4.2.5", + "@vercel/analytics": "1.2.2", + "@vercel/speed-insights": "^1.0.12", + "axios": "1.6.7", + "bignumber.js": "4.0.4", + "chroma.ts": "1.0.10", + "ethers": "6.11.1", + "framer-motion": "11.0.5", + "get-starknet": "3.0.1", + "get-starknet-core": "3.2.0", + "jotai": "2.6.4", + "jotai-tanstack-query": "0.8.5", + "mixpanel-browser": "2.49.0", + "mustache": "4.2.0", + "next": "14.1.0", + "react": "18", + "react-device-detect": "2.2.3", + "react-dom": "18", + "react-hot-toast": "2.4.1", + "react-mixpanel": "1.0.5", + "react-pro-sidebar": "1.1.0", + "react-responsive-carousel": "3.2.23", + "react-select": "5.8.0", + "react-share": "5.1.0", + "sharp": "0.33.4", + "starknet": "6.4.1", + "starknetkit": "1.1.9", + "swr": "2.2.5", + "wonka": "6.3.4" + }, + "devDependencies": { + "@types/node": "20", + "@types/react": "18", + "@types/react-dom": "18", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", + "autoprefixer": "10.0.1", + "conventional-changelog": "5.1.0", + "conventional-commits-parser": "5.0.0", + "embla-carousel-autoplay": "8.1.6", + "embla-carousel-react": "8.1.6", + "eslint": "8", + "eslint-config-next": "14.1.0", + "eslint-plugin-unused-imports": "3.1.0", + "husky": "^9.1.1", + "postcss": "8", + "prettier": "3.3.3", + "tailwindcss": "3.3.0", + "typescript": "5" + }, + "engines": { + "node": "20.x" + } +} diff --git a/src/app/api/stats/[address]/route.ts b/src/app/api/stats/[address]/route.ts index b006ff1..c2786a3 100755 --- a/src/app/api/stats/[address]/route.ts +++ b/src/app/api/stats/[address]/route.ts @@ -1,40 +1,40 @@ -import { NextResponse } from 'next/server'; -import { num } from 'starknet'; -import { getStrategies } from '@/store/strategies.atoms'; - -export const revalidate = 0; - -function standariseAddress(address: string | bigint) { - return num.getHexString(num.getDecimalString(address.toString())); -} - -export async function GET(req: Request, context: any) { - const { params } = context; - const addr = params.address; - - // standardised address - let pAddr = addr; - try { - pAddr = standariseAddress(addr); - } catch (e) { - throw new Error('Invalid address'); - } - - const strategies = getStrategies(); - const values = strategies.map(async (strategy) => { - const balanceInfo = await strategy.getUserTVL(pAddr); - return { - id: strategy.id, - usdValue: balanceInfo.usdValue, - amount: balanceInfo.amount.toEtherStr(), - }; - }); - - const result = await Promise.all(values); - const sum = result.reduce((acc, item) => acc + item.usdValue, 0); - console.log({ pAddr, sum }); - return NextResponse.json({ - holdingsUSD: sum, - strategyWise: result, - }); -} +import { NextResponse } from 'next/server'; +import { num } from 'starknet'; +import { getStrategies } from '@/store/strategies.atoms'; + +export const revalidate = 0; + +function standariseAddress(address: string | bigint) { + return num.getHexString(num.getDecimalString(address.toString())); +} + +export async function GET(req: Request, context: any) { + const { params } = context; + const addr = params.address; + + // standardised address + let pAddr = addr; + try { + pAddr = standariseAddress(addr); + } catch (e) { + throw new Error('Invalid address'); + } + + const strategies = getStrategies(); + const values = strategies.map(async (strategy) => { + const balanceInfo = await strategy.getUserTVL(pAddr); + return { + id: strategy.id, + usdValue: balanceInfo.usdValue, + amount: balanceInfo.amount.toEtherStr(), + }; + }); + + const result = await Promise.all(values); + const sum = result.reduce((acc, item) => acc + item.usdValue, 0); + console.log({ pAddr, sum }); + return NextResponse.json({ + holdingsUSD: sum, + strategyWise: result, + }); +} diff --git a/src/app/api/stats/route.ts b/src/app/api/stats/route.ts index 751b63c..65396f1 100755 --- a/src/app/api/stats/route.ts +++ b/src/app/api/stats/route.ts @@ -1,31 +1,31 @@ -import { NextResponse } from 'next/server'; -import { getStrategies } from '@/store/strategies.atoms'; - -export const revalidate = 60; - -export async function GET(req: Request) { - const strategies = getStrategies(); - console.log('strategies', strategies.length); - const values = strategies.map(async (strategy, index) => { - let retry = 0; - while (retry < 3) { - try { - const tvlInfo = await strategy.getTVL(); - console.log('tvlInfo', index, tvlInfo); - return tvlInfo.usdValue; - } catch (e) { - console.log(e); - if (retry < 3) { - await new Promise((resolve) => setTimeout(resolve, 1000)); - retry++; - } - } - } - throw new Error('Failed to fetch data'); - }); - - const result = await Promise.all(values); - return NextResponse.json({ - tvl: result.reduce((a, b) => a + b, 0), - }); -} +import { NextResponse } from 'next/server'; +import { getStrategies } from '@/store/strategies.atoms'; + +export const revalidate = 60; + +export async function GET(req: Request) { + const strategies = getStrategies(); + console.log('strategies', strategies.length); + const values = strategies.map(async (strategy, index) => { + let retry = 0; + while (retry < 3) { + try { + const tvlInfo = await strategy.getTVL(); + console.log('tvlInfo', index, tvlInfo); + return tvlInfo.usdValue; + } catch (e) { + console.log(e); + if (retry < 3) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + retry++; + } + } + } + throw new Error('Failed to fetch data'); + }); + + const result = await Promise.all(values); + return NextResponse.json({ + tvl: result.reduce((a, b) => a + b, 0), + }); +} diff --git a/src/app/api/strategies/route.ts b/src/app/api/strategies/route.ts index 73e2654..06c3463 100755 --- a/src/app/api/strategies/route.ts +++ b/src/app/api/strategies/route.ts @@ -1,17 +1,17 @@ -import { NextResponse } from 'next/server'; - -export const revalidate = 3600; // 1 hr - -export async function GET(req: Request) { - try { - return NextResponse.json({ - status: true, - }); - } catch (err) { - console.error('Error /api/strategies', err); - return NextResponse.json({ - status: false, - strategies: [], - }); - } -} +import { NextResponse } from 'next/server'; + +export const revalidate = 3600; // 1 hr + +export async function GET(req: Request) { + try { + return NextResponse.json({ + status: true, + }); + } catch (err) { + console.error('Error /api/strategies', err); + return NextResponse.json({ + status: false, + strategies: [], + }); + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 165532d..6b9a104 100755 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,45 +1,45 @@ -import { GoogleAnalytics } from '@next/third-parties/google'; -import { Analytics } from '@vercel/analytics/react'; -import type { Metadata } from 'next'; -import React from 'react'; - -import './globals.css'; - -export const metadata: Metadata = { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - openGraph: { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], - }, - twitter: { - creator: '@akiraonstarknet', - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', - card: 'player', - images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], - }, -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - - - {children} - - - - - ); -} +import { GoogleAnalytics } from '@next/third-parties/google'; +import { Analytics } from '@vercel/analytics/react'; +import type { Metadata } from 'next'; +import React from 'react'; + +import './globals.css'; + +export const metadata: Metadata = { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + openGraph: { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], + }, + twitter: { + creator: '@akiraonstarknet', + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', + card: 'player', + images: ['https://static-assets-8zct.onrender.com/strkfarm/preview.png'], + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + + {children} + + + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 51f457d..80c19b5 100755 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,235 +1,235 @@ -'use client'; - -import tg from '@/assets/tg.svg'; -import { useDotButton } from '@/components/EmblaCarouselDotButton'; -import Pools from '@/components/Pools'; -import Strategies from '@/components/Strategies'; -import CONSTANTS from '@/constants'; -import { useWindowSize } from '@/utils/useWindowSize'; - -import { - Box, - Center, - Image as ChakraImage, - Container, - Link, - Tab, - TabIndicator, - TabList, - TabPanel, - TabPanels, - Tabs, - Text, -} from '@chakra-ui/react'; -import Autoplay from 'embla-carousel-autoplay'; -import useEmblaCarousel from 'embla-carousel-react'; -import mixpanel from 'mixpanel-browser'; -import { useRouter, useSearchParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; -import { isMobile } from 'react-device-detect'; - -export default function Home() { - useEffect(() => { - mixpanel.track('Page open'); - }, []); - - const searchParams = useSearchParams(); - const [tabIndex, setTabIndex] = useState(0); - const size = useWindowSize(); - - useEffect(() => { - const tab = searchParams.get('tab'); - console.log('tab', tab); - if (tab === 'pools') { - setTabIndex(1); - } else { - setTabIndex(0); - } - }, [searchParams]); - - const router = useRouter(); - - function setRoute(value: string) { - router.push(`?tab=${value}`); - } - - function handleTabsChange(index: number) { - if (index === 1) { - setRoute('pools'); - } else { - setRoute('strategies'); - } - } - - const [emblaRef, emblaApi] = useEmblaCarousel( - { - loop: true, - }, - [Autoplay({ playOnInit: true, delay: 8000 })], - ); - - const { selectedIndex, scrollSnaps, onDotButtonClick } = - useDotButton(emblaApi); - - const banner_images = [ - { - desktop: '/banners/ognft.svg', - mobile: '/banners/ognft_small.svg', - link: 'https://x.com/strkfarm/status/1788558092109775029', - }, - { - desktop: '/banners/seed_grant.svg', - mobile: '/banners/seed_grant_small.jpg', - link: 'https://x.com/strkfarm/status/1787783906982260881', - }, - ]; - - return ( - - - - {"Starknet's"} Yield Powerhouse🚀 - - - Identify & Invest in the best $STRK rewarding pools and maximize your - rewards - - - - - - {banner_images.map((banner, index) => ( - - - 450) || size.width == 0 - ? banner.desktop - : banner.mobile - } - height={'auto'} - boxShadow={'0px 0px 2px #484848'} - width="100%" - alt="Banner" - style={{ objectFit: 'cover', borderRadius: '10px' }} - /> - - - ))} - - - - - - {scrollSnaps.map((_, index) => ( - onDotButtonClick(index)} - width="0.8rem" - height="0.8rem" - borderRadius="50%" - display="flex" - alignItems="center" - justifyContent="center" - cursor="pointer" - backgroundColor={index === selectedIndex ? '#4D59E8' : 'black'} - padding="0" - margin="0" - border="1px solid #373A5D" - textDecoration="none" - appearance="none" - /> - ))} - - - - - - { - mixpanel.track('Strategies opened'); - }} - > - Strategies✨ - - { - mixpanel.track('All pools clicked'); - }} - > - Find yields - - - - - - - - - - - - - {/*
*/} -
- - - -
-
- - Made with ❤️ on Starknet - -
-
- ); -} +'use client'; + +import tg from '@/assets/tg.svg'; +import { useDotButton } from '@/components/EmblaCarouselDotButton'; +import Pools from '@/components/Pools'; +import Strategies from '@/components/Strategies'; +import CONSTANTS from '@/constants'; +import { useWindowSize } from '@/utils/useWindowSize'; + +import { + Box, + Center, + Image as ChakraImage, + Container, + Link, + Tab, + TabIndicator, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, +} from '@chakra-ui/react'; +import Autoplay from 'embla-carousel-autoplay'; +import useEmblaCarousel from 'embla-carousel-react'; +import mixpanel from 'mixpanel-browser'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { isMobile } from 'react-device-detect'; + +export default function Home() { + useEffect(() => { + mixpanel.track('Page open'); + }, []); + + const searchParams = useSearchParams(); + const [tabIndex, setTabIndex] = useState(0); + const size = useWindowSize(); + + useEffect(() => { + const tab = searchParams.get('tab'); + console.log('tab', tab); + if (tab === 'pools') { + setTabIndex(1); + } else { + setTabIndex(0); + } + }, [searchParams]); + + const router = useRouter(); + + function setRoute(value: string) { + router.push(`?tab=${value}`); + } + + function handleTabsChange(index: number) { + if (index === 1) { + setRoute('pools'); + } else { + setRoute('strategies'); + } + } + + const [emblaRef, emblaApi] = useEmblaCarousel( + { + loop: true, + }, + [Autoplay({ playOnInit: true, delay: 8000 })], + ); + + const { selectedIndex, scrollSnaps, onDotButtonClick } = + useDotButton(emblaApi); + + const banner_images = [ + { + desktop: '/banners/ognft.svg', + mobile: '/banners/ognft_small.svg', + link: 'https://x.com/strkfarm/status/1788558092109775029', + }, + { + desktop: '/banners/seed_grant.svg', + mobile: '/banners/seed_grant_small.jpg', + link: 'https://x.com/strkfarm/status/1787783906982260881', + }, + ]; + + return ( + + + + {"Starknet's"} Yield Powerhouse🚀 + + + Identify & Invest in the best $STRK rewarding pools and maximize your + rewards + + + + + + {banner_images.map((banner, index) => ( + + + 450) || size.width == 0 + ? banner.desktop + : banner.mobile + } + height={'auto'} + boxShadow={'0px 0px 2px #484848'} + width="100%" + alt="Banner" + style={{ objectFit: 'cover', borderRadius: '10px' }} + /> + + + ))} + + + + + + {scrollSnaps.map((_, index) => ( + onDotButtonClick(index)} + width="0.8rem" + height="0.8rem" + borderRadius="50%" + display="flex" + alignItems="center" + justifyContent="center" + cursor="pointer" + backgroundColor={index === selectedIndex ? '#4D59E8' : 'black'} + padding="0" + margin="0" + border="1px solid #373A5D" + textDecoration="none" + appearance="none" + /> + ))} + + + + + + { + mixpanel.track('Strategies opened'); + }} + > + Strategies✨ + + { + mixpanel.track('All pools clicked'); + }} + > + Find yields + + + + + + + + + + + + + {/*
*/} +
+ + + +
+
+ + Made with ❤️ on Starknet + +
+
+ ); +} diff --git a/src/app/slinks/layout.tsx b/src/app/slinks/layout.tsx index 44f92a2..f47aaad 100755 --- a/src/app/slinks/layout.tsx +++ b/src/app/slinks/layout.tsx @@ -1,58 +1,58 @@ -import { GoogleAnalytics } from '@next/third-parties/google'; -import { Analytics } from '@vercel/analytics/react'; -import React from 'react'; - -import '../globals.css'; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - - - - - - - - - - - - - - - - {children} - - - - - ); -} +import { GoogleAnalytics } from '@next/third-parties/google'; +import { Analytics } from '@vercel/analytics/react'; +import React from 'react'; + +import '../globals.css'; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + + + + + + + + + + + + + + + {children} + + + + + ); +} diff --git a/src/app/slinks/page.tsx b/src/app/slinks/page.tsx index 70663ec..c4267f7 100755 --- a/src/app/slinks/page.tsx +++ b/src/app/slinks/page.tsx @@ -1,139 +1,139 @@ -'use client'; -import TxButton from '@/components/TxButton'; -import { addressAtom } from '@/store/claims.atoms'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { StrategyTxProps } from '@/store/transactions.atom'; -import MyNumber from '@/utils/MyNumber'; -import { - Avatar, - Box, - Button, - Card, - Link, - Container, - Flex, - Input, - Text, - Center, -} from '@chakra-ui/react'; -import { useProvider } from '@starknet-react/core'; -import { useAtomValue } from 'jotai'; -import { Metadata } from 'next'; -import { useMemo, useState } from 'react'; - -const metadata: Metadata = { - title: 'STRKFarm | Yield aggregator on Starknet', - description: - 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', -}; - -function GetCardSimple(strat: StrategyInfo) { - const [amount, setAmount] = useState(MyNumber.fromZero()); - const address = useAtomValue(addressAtom); - const { provider } = useProvider(); - const depositMethods = strat.depositMethods(amount, address || '', provider); - - const balData = useAtomValue(depositMethods[0].balanceAtom); - - const balance = useMemo(() => { - return balData.data?.amount || MyNumber.fromZero(); - }, [balData]); - - const txInfo: StrategyTxProps = useMemo(() => { - return { - strategyId: strat.id, - actionType: 'deposit', - amount, - tokenAddr: depositMethods[0].tokenInfo.token, - }; - }, [amount, balData]); - - const maxAmount: MyNumber = useMemo(() => { - return balance; - }, [balance]); - - return ( - - - - - {strat.name}{' '} - - {(strat.netYield * 100).toFixed(2)}% APY - - - - Bal: {balance.toEtherToFixedDecimals(2)}{' '} - {depositMethods[0].tokenInfo.name} - - - - { - const value = event.target.value; - if (value && Number(value) > 0) - setAmount( - MyNumber.fromEther(value, depositMethods[0].tokenInfo.decimals), - ); - else { - setAmount( - new MyNumber('0', depositMethods[0].tokenInfo.decimals), - ); - } - }} - width={'40%'} - /> - - - - - - ); -} - -export default function Slinks() { - const strategies = useAtomValue(strategiesAtom); - return ( - - Choose a strategy and invest - {strategies - .filter((s) => s.isLive()) - .map((strat) => GetCardSimple(strat))} - - -
- -
- -
- ); -} +'use client'; +import TxButton from '@/components/TxButton'; +import { addressAtom } from '@/store/claims.atoms'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { StrategyTxProps } from '@/store/transactions.atom'; +import MyNumber from '@/utils/MyNumber'; +import { + Avatar, + Box, + Button, + Card, + Link, + Container, + Flex, + Input, + Text, + Center, +} from '@chakra-ui/react'; +import { useProvider } from '@starknet-react/core'; +import { useAtomValue } from 'jotai'; +import { Metadata } from 'next'; +import { useMemo, useState } from 'react'; + +const metadata: Metadata = { + title: 'STRKFarm | Yield aggregator on Starknet', + description: + 'Find and invest in high yield pools. STRKFarm is the best yield aggregator on Starknet.', +}; + +function GetCardSimple(strat: StrategyInfo) { + const [amount, setAmount] = useState(MyNumber.fromZero()); + const address = useAtomValue(addressAtom); + const { provider } = useProvider(); + const depositMethods = strat.depositMethods(amount, address || '', provider); + + const balData = useAtomValue(depositMethods[0].balanceAtom); + + const balance = useMemo(() => { + return balData.data?.amount || MyNumber.fromZero(); + }, [balData]); + + const txInfo: StrategyTxProps = useMemo(() => { + return { + strategyId: strat.id, + actionType: 'deposit', + amount, + tokenAddr: depositMethods[0].tokenInfo.token, + }; + }, [amount, balData]); + + const maxAmount: MyNumber = useMemo(() => { + return balance; + }, [balance]); + + return ( + + + + + {strat.name}{' '} + + {(strat.netYield * 100).toFixed(2)}% APY + + + + Bal: {balance.toEtherToFixedDecimals(2)}{' '} + {depositMethods[0].tokenInfo.name} + + + + { + const value = event.target.value; + if (value && Number(value) > 0) + setAmount( + MyNumber.fromEther(value, depositMethods[0].tokenInfo.decimals), + ); + else { + setAmount( + new MyNumber('0', depositMethods[0].tokenInfo.decimals), + ); + } + }} + width={'40%'} + /> + + + + + + ); +} + +export default function Slinks() { + const strategies = useAtomValue(strategiesAtom); + return ( + + Choose a strategy and invest + {strategies + .filter((s) => s.isLive()) + .map((strat) => GetCardSimple(strat))} + + +
+ +
+ +
+ ); +} diff --git a/src/app/slinks/template.tsx b/src/app/slinks/template.tsx index 3cb7fef..6fa8e5b 100755 --- a/src/app/slinks/template.tsx +++ b/src/app/slinks/template.tsx @@ -1,124 +1,124 @@ -'use client'; - -import { - Center, - ChakraBaseProvider, - Container, - Flex, - extendTheme, -} from '@chakra-ui/react'; -import { mainnet } from '@starknet-react/chains'; -import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; -import { Provider as JotaiProvider } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import Image from 'next/image'; -import * as React from 'react'; -import { RpcProviderOptions, constants } from 'starknet'; -import { ArgentMobileConnector } from 'starknetkit/argentMobile'; -import { InjectedConnector } from 'starknetkit/injected'; -import Navbar from '@/components/Navbar'; -import { Toaster } from 'react-hot-toast'; -import { usePathname } from 'next/navigation'; - -// ! make page view more dynamic -mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); - -const theme = extendTheme({ - colors: { - transparent: 'rgba(0, 0, 0, 0)', - opacity_50p: 'rgba(0, 0, 0, 0.5)', - color1: 'rgba(86, 118, 254, 1)', - color1_65p: 'rgba(86, 118, 254, 0.65)', - color1_50p: 'rgba(86, 118, 254, 0.5)', - color1_35p: 'rgba(86, 118, 254, 0.35)', - color1_light: '#bcc9ff80', - color2: 'rgb(127 73 229)', - color2Text: 'rgb(165 118 255)', - color2_65p: 'rgba(104, 51, 205, 0.65)', - color2_50p: 'rgba(104, 51, 205, 0.5)', - highlight: '#272932', // light grey - light_grey: '#9d9d9d', - disabled_text: '#818181', - disabled_bg: '#5f5f5f', - purple: '#6F4FF2', - cyan: '#22F3DF', - bg: '#1A1C26', // dark blue - }, - fontSizes: { - large: '50px', - }, - space: { - large: '50px', - }, - sizes: { - prose: '100%', - }, - components: { - MenuItem: { - bg: 'highlight', - }, - }, - fonts: { - heading: `'Courier New', Courier, monospace`, - body: `'Courier New', Courier, monospace`, - }, -}); - -// @ts-ignore -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; -export const MYCONNECTORS = [ - new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), - new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), - new ArgentMobileConnector(), - // new WebWalletConnector({ url: 'https://web.argent.xyz' }), -]; - -export default function Template({ children }: { children: React.ReactNode }) { - const chains = [mainnet]; - const provider = jsonRpcProvider({ - rpc: (chain) => { - const args: RpcProviderOptions = { - nodeUrl: - 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', - chainId: constants.StarknetChainId.SN_MAIN, - }; - return args; - }, - }); - const pathname = usePathname(); - - function getIconNode(icon: typeof import('*.svg'), alt: string) { - return ( -
- {alt} -
- ); - } - - return ( - - - - - - - {children} - - - - - - - ); -} +'use client'; + +import { + Center, + ChakraBaseProvider, + Container, + Flex, + extendTheme, +} from '@chakra-ui/react'; +import { mainnet } from '@starknet-react/chains'; +import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; +import { Provider as JotaiProvider } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import Image from 'next/image'; +import * as React from 'react'; +import { RpcProviderOptions, constants } from 'starknet'; +import { ArgentMobileConnector } from 'starknetkit/argentMobile'; +import { InjectedConnector } from 'starknetkit/injected'; +import Navbar from '@/components/Navbar'; +import { Toaster } from 'react-hot-toast'; +import { usePathname } from 'next/navigation'; + +// ! make page view more dynamic +mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); + +const theme = extendTheme({ + colors: { + transparent: 'rgba(0, 0, 0, 0)', + opacity_50p: 'rgba(0, 0, 0, 0.5)', + color1: 'rgba(86, 118, 254, 1)', + color1_65p: 'rgba(86, 118, 254, 0.65)', + color1_50p: 'rgba(86, 118, 254, 0.5)', + color1_35p: 'rgba(86, 118, 254, 0.35)', + color1_light: '#bcc9ff80', + color2: 'rgb(127 73 229)', + color2Text: 'rgb(165 118 255)', + color2_65p: 'rgba(104, 51, 205, 0.65)', + color2_50p: 'rgba(104, 51, 205, 0.5)', + highlight: '#272932', // light grey + light_grey: '#9d9d9d', + disabled_text: '#818181', + disabled_bg: '#5f5f5f', + purple: '#6F4FF2', + cyan: '#22F3DF', + bg: '#1A1C26', // dark blue + }, + fontSizes: { + large: '50px', + }, + space: { + large: '50px', + }, + sizes: { + prose: '100%', + }, + components: { + MenuItem: { + bg: 'highlight', + }, + }, + fonts: { + heading: `'Courier New', Courier, monospace`, + body: `'Courier New', Courier, monospace`, + }, +}); + +// @ts-ignore +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; +export const MYCONNECTORS = [ + new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), + new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), + new ArgentMobileConnector(), + // new WebWalletConnector({ url: 'https://web.argent.xyz' }), +]; + +export default function Template({ children }: { children: React.ReactNode }) { + const chains = [mainnet]; + const provider = jsonRpcProvider({ + rpc: (chain) => { + const args: RpcProviderOptions = { + nodeUrl: + 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', + chainId: constants.StarknetChainId.SN_MAIN, + }; + return args; + }, + }); + const pathname = usePathname(); + + function getIconNode(icon: typeof import('*.svg'), alt: string) { + return ( +
+ {alt} +
+ ); + } + + return ( + + + + + + + {children} + + + + + + + ); +} diff --git a/src/app/strategy/components/Strategy.tsx b/src/app/strategy/components/Strategy.tsx index 36188aa..25de8d5 100755 --- a/src/app/strategy/components/Strategy.tsx +++ b/src/app/strategy/components/Strategy.tsx @@ -1,450 +1,450 @@ -'use client'; - -import { - Avatar, - Box, - Card, - Center, - Flex, - Grid, - GridItem, - Link, - ListItem, - OrderedList, - Spinner, - Stat, - StatHelpText, - StatLabel, - StatNumber, - Tab, - TabIndicator, - TabList, - TabPanel, - TabPanels, - Tabs, - Text, - VStack, - Wrap, - WrapItem, -} from '@chakra-ui/react'; -import { useAccount } from '@starknet-react/core'; -import { atom, useAtomValue, useSetAtom } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import { useSearchParams } from 'next/navigation'; -import { useEffect, useMemo } from 'react'; -import { isMobile } from 'react-device-detect'; - -import Deposit from '@/components/Deposit'; -import CONSTANTS from '@/constants'; -import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { - StrategyTxPropsToMessageWithStrategies, - transactionsAtom, -} from '@/store/transactions.atom'; -import { getUniqueById, shortAddress } from '@/utils'; - -const Strategy = () => { - const { address } = useAccount(); - const searchParams = useSearchParams(); - const strategies = useAtomValue(strategiesAtom); - const transactions = useAtomValue(transactionsAtom); - - useEffect(() => { - console.log('txs', transactions); - }, [transactions]); - const strategy: StrategyInfo | undefined = useMemo(() => { - const id = searchParams.get('id'); - console.log('id', id); - return strategies.find((s) => s.id === id); - }, [searchParams, strategies]); - - const setBalQueryEnable = useSetAtom(strategy?.balEnabled || atom(false)); - useEffect(() => { - setBalQueryEnable(true); - }, []); - - // const balAtom = getBalanceAtom(strategy?.holdingTokens[0]); - const balData = useAtomValue(strategy?.balanceAtom || DUMMY_BAL_ATOM); - // cons{ balance, underlyingTokenInfo, isLoading, isError } - useEffect(() => { - console.log( - 'balData', - balData.isError, - balData.isLoading, - balData.isPending, - balData.data, - balData.error, - ); - }, [balData]); - - useEffect(() => { - mixpanel.track('Strategy page open', { name: searchParams.get('name') }); - }, [searchParams]); - - const colSpan1: any = { base: '5', md: '3' }; - const colSpan2: any = { base: '5', md: '2' }; - return ( - <> - - - - {strategy ? strategy.name : 'Strategy Not found'} - - - {strategy && ( - - - - - - - - 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} -
-
- ))} -
-
- - - - APY - - - {(strategy.netYield * 100).toFixed(2)}% - - - {strategy.leverage.toFixed(2)}x boosted - - - -
- - {!balData.isLoading && - !balData.isError && - !balData.isPending && - balData.data && - balData.data.tokenInfo && ( - - Your Holdings: - {address - ? `${balData.data.amount.toEtherToFixedDecimals(4)} ${balData.data.tokenInfo?.name}` - : isMobile - ? CONSTANTS.MOBILE_MSG - : 'Connect wallet'} - - )} - {(balData.isLoading || - balData.isPending || - !balData.data?.tokenInfo) && ( - - Your Holdings: - {address ? ( - - ) : isMobile ? ( - CONSTANTS.MOBILE_MSG - ) : ( - 'Connect wallet' - )} - - )} - {balData.isError && ( - - Your Holdings: Error - - )} - -
-
- - - - - { - // mixpanel.track('All pools clicked') - }} - > - Deposit - - { - // mixpanel.track('Strategies opened') - }} - > - Withdraw - - - - - - - - - - - - - - -
- - - Behind the scenes - - - Actions done automatically by the strategy (smart-contract) with - an investment of $1000 - - - - Action - - - Protocol - - - Amount - - - Yield - - - {strategy.actions.map((action, index) => ( - - - {index + 1} - {')'} {action.name} - - - {' '} - {action.pool.pool.name} on - {' '} - {action.pool.protocol.name} - - - ${Number(action.amount).toLocaleString()} yields{' '} - {action.isDeposit - ? (action.pool.apr * 100).toFixed(2) - : -(action.pool.borrow.apr * 100).toFixed(2)} - % - - - ${Number(action.amount).toLocaleString()} - - - {action.isDeposit - ? (action.pool.apr * 100).toFixed(2) - : -(action.pool.borrow.apr * 100).toFixed(2)} - % - - - ))} - - - {/* Risks card */} - - - Risks - - - {strategy.risks.map((r) => ( - - {r} - - ))} - - - - {/* Transaction history card */} - - - Transaction history - - - {/* If more than 1 filtered tx */} - {transactions.filter((tx) => tx.info.strategyId == strategy.id) - .length > 0 && ( - <> - - Note: This feature saves and shows transactions made on this - device since it was added. Clearing your browser cache will - remove this data. - - - {transactions - .filter((tx) => tx.info.strategyId == strategy.id) - .map((tx, index) => { - return ( - - - {/* The default msg contains strategy name, since this for a specific strategy, replace it */} - {index + 1}){' '} - {StrategyTxPropsToMessageWithStrategies( - tx.info, - strategies, - ).replace(` in ${strategy.name}`, '')} - - - {/* The default msg contains strategy name, since this for a specific strategy, replace it */} - Transacted on {tx.createdAt.toLocaleDateString()} [ - - {shortAddress(tx.txHash)} - - ] - - - ); - })} - - )} - - {/* If no filtered tx */} - {transactions.filter((tx) => tx.info.strategyId == strategy.id) - .length == 0 && ( - - No transactions recorded since this feature was added. We use - your {"browser's"} storage to save your transaction history. - Make a deposit or withdrawal to see your transactions here. - Clearning browser cache will remove this data. - - )} - -
- )} - - ); -}; - -export default Strategy; +'use client'; + +import { + Avatar, + Box, + Card, + Center, + Flex, + Grid, + GridItem, + Link, + ListItem, + OrderedList, + Spinner, + Stat, + StatHelpText, + StatLabel, + StatNumber, + Tab, + TabIndicator, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, + VStack, + Wrap, + WrapItem, +} from '@chakra-ui/react'; +import { useAccount } from '@starknet-react/core'; +import { atom, useAtomValue, useSetAtom } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import { useSearchParams } from 'next/navigation'; +import { useEffect, useMemo } from 'react'; +import { isMobile } from 'react-device-detect'; + +import Deposit from '@/components/Deposit'; +import CONSTANTS from '@/constants'; +import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { + StrategyTxPropsToMessageWithStrategies, + transactionsAtom, +} from '@/store/transactions.atom'; +import { getUniqueById, shortAddress } from '@/utils'; + +const Strategy = () => { + const { address } = useAccount(); + const searchParams = useSearchParams(); + const strategies = useAtomValue(strategiesAtom); + const transactions = useAtomValue(transactionsAtom); + + useEffect(() => { + console.log('txs', transactions); + }, [transactions]); + const strategy: StrategyInfo | undefined = useMemo(() => { + const id = searchParams.get('id'); + console.log('id', id); + return strategies.find((s) => s.id === id); + }, [searchParams, strategies]); + + const setBalQueryEnable = useSetAtom(strategy?.balEnabled || atom(false)); + useEffect(() => { + setBalQueryEnable(true); + }, []); + + // const balAtom = getBalanceAtom(strategy?.holdingTokens[0]); + const balData = useAtomValue(strategy?.balanceAtom || DUMMY_BAL_ATOM); + // cons{ balance, underlyingTokenInfo, isLoading, isError } + useEffect(() => { + console.log( + 'balData', + balData.isError, + balData.isLoading, + balData.isPending, + balData.data, + balData.error, + ); + }, [balData]); + + useEffect(() => { + mixpanel.track('Strategy page open', { name: searchParams.get('name') }); + }, [searchParams]); + + const colSpan1: any = { base: '5', md: '3' }; + const colSpan2: any = { base: '5', md: '2' }; + return ( + <> + + + + {strategy ? strategy.name : 'Strategy Not found'} + + + {strategy && ( + + + + + + + + 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} +
+
+ ))} +
+
+ + + + APY + + + {(strategy.netYield * 100).toFixed(2)}% + + + {strategy.leverage.toFixed(2)}x boosted + + + +
+ + {!balData.isLoading && + !balData.isError && + !balData.isPending && + balData.data && + balData.data.tokenInfo && ( + + Your Holdings: + {address + ? `${balData.data.amount.toEtherToFixedDecimals(4)} ${balData.data.tokenInfo?.name}` + : isMobile + ? CONSTANTS.MOBILE_MSG + : 'Connect wallet'} + + )} + {(balData.isLoading || + balData.isPending || + !balData.data?.tokenInfo) && ( + + Your Holdings: + {address ? ( + + ) : isMobile ? ( + CONSTANTS.MOBILE_MSG + ) : ( + 'Connect wallet' + )} + + )} + {balData.isError && ( + + Your Holdings: Error + + )} + +
+
+ + + + + { + // mixpanel.track('All pools clicked') + }} + > + Deposit + + { + // mixpanel.track('Strategies opened') + }} + > + Withdraw + + + + + + + + + + + + + + +
+ + + Behind the scenes + + + Actions done automatically by the strategy (smart-contract) with + an investment of $1000 + + + + Action + + + Protocol + + + Amount + + + Yield + + + {strategy.actions.map((action, index) => ( + + + {index + 1} + {')'} {action.name} + + + {' '} + {action.pool.pool.name} on + {' '} + {action.pool.protocol.name} + + + ${Number(action.amount).toLocaleString()} yields{' '} + {action.isDeposit + ? (action.pool.apr * 100).toFixed(2) + : -(action.pool.borrow.apr * 100).toFixed(2)} + % + + + ${Number(action.amount).toLocaleString()} + + + {action.isDeposit + ? (action.pool.apr * 100).toFixed(2) + : -(action.pool.borrow.apr * 100).toFixed(2)} + % + + + ))} + + + {/* Risks card */} + + + Risks + + + {strategy.risks.map((r) => ( + + {r} + + ))} + + + + {/* Transaction history card */} + + + Transaction history + + + {/* If more than 1 filtered tx */} + {transactions.filter((tx) => tx.info.strategyId == strategy.id) + .length > 0 && ( + <> + + Note: This feature saves and shows transactions made on this + device since it was added. Clearing your browser cache will + remove this data. + + + {transactions + .filter((tx) => tx.info.strategyId == strategy.id) + .map((tx, index) => { + return ( + + + {/* The default msg contains strategy name, since this for a specific strategy, replace it */} + {index + 1}){' '} + {StrategyTxPropsToMessageWithStrategies( + tx.info, + strategies, + ).replace(` in ${strategy.name}`, '')} + + + {/* The default msg contains strategy name, since this for a specific strategy, replace it */} + Transacted on {tx.createdAt.toLocaleDateString()} [ + + {shortAddress(tx.txHash)} + + ] + + + ); + })} + + )} + + {/* If no filtered tx */} + {transactions.filter((tx) => tx.info.strategyId == strategy.id) + .length == 0 && ( + + No transactions recorded since this feature was added. We use + your {"browser's"} storage to save your transaction history. + Make a deposit or withdrawal to see your transactions here. + Clearning browser cache will remove this data. + + )} + +
+ )} + + ); +}; + +export default Strategy; diff --git a/src/app/strategy/page.tsx b/src/app/strategy/page.tsx index c2edd54..6d09a27 100755 --- a/src/app/strategy/page.tsx +++ b/src/app/strategy/page.tsx @@ -1,39 +1,39 @@ -import { Container } from '@chakra-ui/react'; - -import Strategy from './components/Strategy'; -import { getStrategies } from '@/store/strategies.atoms'; - -type Props = { - params: { name: string }; - searchParams?: { [key: string]: string | string[] | undefined }; -}; - -export async function generateMetadata({ searchParams }: Props) { - const strategies = getStrategies(); - const strategy = strategies.find((s) => s.id === searchParams?.id); - if (strategy) { - return { - title: `${strategy.name} | STRKFarm`, - description: strategy.description, - }; - } - - return { - title: 'Yield Strategy | STRKFarm', - 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.", - }; -} - -export default function StrategyPage() { - return ( - - - - ); -} +import { Container } from '@chakra-ui/react'; + +import Strategy from './components/Strategy'; +import { getStrategies } from '@/store/strategies.atoms'; + +type Props = { + params: { name: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}; + +export async function generateMetadata({ searchParams }: Props) { + const strategies = getStrategies(); + const strategy = strategies.find((s) => s.id === searchParams?.id); + if (strategy) { + return { + title: `${strategy.name} | STRKFarm`, + description: strategy.description, + }; + } + + return { + title: 'Yield Strategy | STRKFarm', + 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.", + }; +} + +export default function StrategyPage() { + return ( + + + + ); +} diff --git a/src/app/template.tsx b/src/app/template.tsx index 3cb7fef..6fa8e5b 100755 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -1,124 +1,124 @@ -'use client'; - -import { - Center, - ChakraBaseProvider, - Container, - Flex, - extendTheme, -} from '@chakra-ui/react'; -import { mainnet } from '@starknet-react/chains'; -import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; -import { Provider as JotaiProvider } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import Image from 'next/image'; -import * as React from 'react'; -import { RpcProviderOptions, constants } from 'starknet'; -import { ArgentMobileConnector } from 'starknetkit/argentMobile'; -import { InjectedConnector } from 'starknetkit/injected'; -import Navbar from '@/components/Navbar'; -import { Toaster } from 'react-hot-toast'; -import { usePathname } from 'next/navigation'; - -// ! make page view more dynamic -mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); - -const theme = extendTheme({ - colors: { - transparent: 'rgba(0, 0, 0, 0)', - opacity_50p: 'rgba(0, 0, 0, 0.5)', - color1: 'rgba(86, 118, 254, 1)', - color1_65p: 'rgba(86, 118, 254, 0.65)', - color1_50p: 'rgba(86, 118, 254, 0.5)', - color1_35p: 'rgba(86, 118, 254, 0.35)', - color1_light: '#bcc9ff80', - color2: 'rgb(127 73 229)', - color2Text: 'rgb(165 118 255)', - color2_65p: 'rgba(104, 51, 205, 0.65)', - color2_50p: 'rgba(104, 51, 205, 0.5)', - highlight: '#272932', // light grey - light_grey: '#9d9d9d', - disabled_text: '#818181', - disabled_bg: '#5f5f5f', - purple: '#6F4FF2', - cyan: '#22F3DF', - bg: '#1A1C26', // dark blue - }, - fontSizes: { - large: '50px', - }, - space: { - large: '50px', - }, - sizes: { - prose: '100%', - }, - components: { - MenuItem: { - bg: 'highlight', - }, - }, - fonts: { - heading: `'Courier New', Courier, monospace`, - body: `'Courier New', Courier, monospace`, - }, -}); - -// @ts-ignore -BigInt.prototype.toJSON = function () { - return this.toString(); -}; - -export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; -export const MYCONNECTORS = [ - new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), - new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), - new ArgentMobileConnector(), - // new WebWalletConnector({ url: 'https://web.argent.xyz' }), -]; - -export default function Template({ children }: { children: React.ReactNode }) { - const chains = [mainnet]; - const provider = jsonRpcProvider({ - rpc: (chain) => { - const args: RpcProviderOptions = { - nodeUrl: - 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', - chainId: constants.StarknetChainId.SN_MAIN, - }; - return args; - }, - }); - const pathname = usePathname(); - - function getIconNode(icon: typeof import('*.svg'), alt: string) { - return ( -
- {alt} -
- ); - } - - return ( - - - - - - - {children} - - - - - - - ); -} +'use client'; + +import { + Center, + ChakraBaseProvider, + Container, + Flex, + extendTheme, +} from '@chakra-ui/react'; +import { mainnet } from '@starknet-react/chains'; +import { StarknetConfig, jsonRpcProvider } from '@starknet-react/core'; +import { Provider as JotaiProvider } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import Image from 'next/image'; +import * as React from 'react'; +import { RpcProviderOptions, constants } from 'starknet'; +import { ArgentMobileConnector } from 'starknetkit/argentMobile'; +import { InjectedConnector } from 'starknetkit/injected'; +import Navbar from '@/components/Navbar'; +import { Toaster } from 'react-hot-toast'; +import { usePathname } from 'next/navigation'; + +// ! make page view more dynamic +mixpanel.init('118f29da6a372f0ccb6f541079cad56b'); + +const theme = extendTheme({ + colors: { + transparent: 'rgba(0, 0, 0, 0)', + opacity_50p: 'rgba(0, 0, 0, 0.5)', + color1: 'rgba(86, 118, 254, 1)', + color1_65p: 'rgba(86, 118, 254, 0.65)', + color1_50p: 'rgba(86, 118, 254, 0.5)', + color1_35p: 'rgba(86, 118, 254, 0.35)', + color1_light: '#bcc9ff80', + color2: 'rgb(127 73 229)', + color2Text: 'rgb(165 118 255)', + color2_65p: 'rgba(104, 51, 205, 0.65)', + color2_50p: 'rgba(104, 51, 205, 0.5)', + highlight: '#272932', // light grey + light_grey: '#9d9d9d', + disabled_text: '#818181', + disabled_bg: '#5f5f5f', + purple: '#6F4FF2', + cyan: '#22F3DF', + bg: '#1A1C26', // dark blue + }, + fontSizes: { + large: '50px', + }, + space: { + large: '50px', + }, + sizes: { + prose: '100%', + }, + components: { + MenuItem: { + bg: 'highlight', + }, + }, + fonts: { + heading: `'Courier New', Courier, monospace`, + body: `'Courier New', Courier, monospace`, + }, +}); + +// @ts-ignore +BigInt.prototype.toJSON = function () { + return this.toString(); +}; + +export const CONNECTOR_NAMES = ['Braavos', 'Argent X', 'Argent (mobile)']; // 'Argent Web Wallet']; +export const MYCONNECTORS = [ + new InjectedConnector({ options: { id: 'braavos', name: 'Braavos' } }), + new InjectedConnector({ options: { id: 'argentX', name: 'Argent X' } }), + new ArgentMobileConnector(), + // new WebWalletConnector({ url: 'https://web.argent.xyz' }), +]; + +export default function Template({ children }: { children: React.ReactNode }) { + const chains = [mainnet]; + const provider = jsonRpcProvider({ + rpc: (chain) => { + const args: RpcProviderOptions = { + nodeUrl: + 'https://rpc.nethermind.io/mainnet-juno?apikey=t1HPjhplOyEQpxqVMhpwLGuwmOlbXN0XivWUiPAxIBs0kHVK', + chainId: constants.StarknetChainId.SN_MAIN, + }; + return args; + }, + }); + const pathname = usePathname(); + + function getIconNode(icon: typeof import('*.svg'), alt: string) { + return ( +
+ {alt} +
+ ); + } + + return ( + + + + + + + {children} + + + + + + + ); +} diff --git a/src/components/Deposit.tsx b/src/components/Deposit.tsx index be11dbf..bb3297b 100755 --- a/src/components/Deposit.tsx +++ b/src/components/Deposit.tsx @@ -1,349 +1,349 @@ -import { ChevronDownIcon } from '@chakra-ui/icons'; -import { - Box, - Button, - Center, - Flex, - Grid, - GridItem, - Image as ImageC, - Menu, - MenuButton, - MenuItem, - MenuList, - NumberDecrementStepper, - NumberIncrementStepper, - NumberInput, - NumberInputField, - NumberInputStepper, - Progress, - Spinner, - Text, - Tooltip, -} from '@chakra-ui/react'; -import LoadingWrap from './LoadingWrap'; -import { IStrategyActionHook, TokenInfo } from '@/strategies/IStrategy'; -import { StrategyInfo } from '@/store/strategies.atoms'; -import { useMemo, useState } from 'react'; -import MyNumber from '@/utils/MyNumber'; -import TxButton from './TxButton'; -import { MyMenuItemProps, MyMenuListProps } from '@/utils'; -import { useAccount, useProvider } from '@starknet-react/core'; -import { ProviderInterface } from 'starknet'; -import mixpanel from 'mixpanel-browser'; -import { StrategyTxProps } from '@/store/transactions.atom'; -import { useAtomValue } from 'jotai'; -import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; - -interface DepositProps { - strategy: StrategyInfo; - // ? If you want to add more button text, you can add here - // ? @dev ensure below actionType is updated accordingly - buttonText: 'Deposit' | 'Redeem'; - callsInfo: ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => IStrategyActionHook[]; -} - -export default function Deposit(props: DepositProps) { - const { address } = useAccount(); - const { provider } = useProvider(); - const [dirty, setDirty] = useState(false); - - const tvlInfo = useAtomValue(props.strategy.tvlAtom); - - // This is the selected market token - const [selectedMarket, setSelectedMarket] = useState( - props.callsInfo(MyNumber.fromZero(), address || '0x0', provider)[0] - .tokenInfo, - ); - - // This is processed amount stored in MyNumber format and meant for sending tx - const [amount, setAmount] = useState( - MyNumber.fromEther('0', selectedMarket.decimals), - ); - - // This is used to store the raw amount entered by the user - const [rawAmount, setRawAmount] = useState(''); - - // use to maintain tx history and show toasts - const txInfo: StrategyTxProps = useMemo(() => { - return { - strategyId: props.strategy.id, - actionType: props.buttonText == 'Deposit' ? 'deposit' : 'withdraw', - amount, - tokenAddr: selectedMarket.token, - }; - }, [amount, props]); - - // constructs tx calls - const { calls, actions } = useMemo(() => { - const actions = props.callsInfo(amount, address || '0x0', provider); - const hook = actions.find((a) => a.tokenInfo.name === selectedMarket.name); - if (!hook) return { calls: [], actions }; - return { calls: hook.calls, actions }; - }, [selectedMarket, amount, address, provider]); - - const balData = useAtomValue( - actions.find((a) => a.tokenInfo.name === selectedMarket.name) - ?.balanceAtom || DUMMY_BAL_ATOM, - ); - const balance = useMemo(() => { - return balData.data?.amount || MyNumber.fromZero(); - }, [balData]); - // const { balance, isLoading, isError } = useERC20Balance(selectedMarket); - const maxAmount: MyNumber = useMemo(() => { - const currentTVl = tvlInfo.data?.amount || MyNumber.fromZero(); - const maxAllowed = - props.strategy.settings.maxTVL - Number(currentTVl.toEtherStr()); - const adjustedMaxAllowed = MyNumber.fromEther( - maxAllowed.toFixed(6), - selectedMarket.decimals, - ); - let reducedBalance = balance; - - if (selectedMarket.name === 'STRK') { - reducedBalance = balance.subtract( - MyNumber.fromEther('1.5', selectedMarket.decimals), - ); - } else if (selectedMarket.name === 'ETH') { - reducedBalance = balance.subtract( - MyNumber.fromEther('0.001', selectedMarket.decimals), - ); - } - console.log('Deposit:: reducedBalance2', reducedBalance.toEtherStr()); - const min = MyNumber.min(reducedBalance, adjustedMaxAllowed); - return MyNumber.max(min, MyNumber.fromEther('0', selectedMarket.decimals)); - }, [balance, props.strategy, selectedMarket]); - - function BalanceComponent(props: { - token: TokenInfo; - strategy: StrategyInfo; - buttonText: string; - }) { - return ( - - Available balance - - - - {balance.toEtherToFixedDecimals(4)} - - - - - - ); - } - - return ( - - - - - } - bgColor={'highlight'} - borderColor={'bg'} - borderWidth={'1px'} - color="color2Text" - _hover={{ - bg: 'bg', - }} - > -
- {/* */} - {balData.data && balData.data.tokenInfo - ? balData.data.tokenInfo.name - : '-'} -
-
- - {actions.map((dep) => ( - { - if (selectedMarket.name != dep.tokenInfo.name) { - setSelectedMarket(dep.tokenInfo); - setAmount(new MyNumber('0', dep.tokenInfo.decimals)); - setDirty(false); - setRawAmount(''); - } - }} - > -
- {' '} - {dep.tokenInfo.name} -
-
- ))} -
-
-
- - - -
- - {/* add min max validations and show err */} - { - if (value && Number(value) > 0) - setAmount(MyNumber.fromEther(value, selectedMarket.decimals)); - else { - setAmount(new MyNumber('0', selectedMarket.decimals)); - } - setRawAmount(value); - setDirty(true); - mixpanel.track('Enter amount', { - strategy: props.strategy.name, - buttonText: props.buttonText, - amount: amount.toEtherStr(), - token: selectedMarket.name, - maxAmount: maxAmount.toEtherStr(), - address, - }); - }} - marginTop={'10px'} - keepWithinRange={false} - clampValueOnBlur={false} - value={rawAmount} - isDisabled={maxAmount.isZero()} - > - - - - - - - {amount.isZero() && dirty && ( - - Require amount {'>'} 0 - - )} - {amount.compare(maxAmount.toEtherStr(), 'gt') && ( - - Amount to be less than {maxAmount.toEtherToFixedDecimals(2)} - - )} - -
- -
- - - No additional fees by STRKFarm - - - - - - Current TVL Limit: - - - {!tvlInfo || !tvlInfo?.data ? ( - - ) : ( - Number(tvlInfo.data?.amount.toFixedStr(0)).toLocaleString() - )} - {' / '} - {props.strategy.settings.maxTVL.toLocaleString()}{' '} - {selectedMarket.name} - - - - {/* {tvlInfo.isError ? 1 : 0}{tvlInfo.isLoading ? 1 : 0} {JSON.stringify(tvlInfo.error)} */} - -
- ); -} +import { ChevronDownIcon } from '@chakra-ui/icons'; +import { + Box, + Button, + Center, + Flex, + Grid, + GridItem, + Image as ImageC, + Menu, + MenuButton, + MenuItem, + MenuList, + NumberDecrementStepper, + NumberIncrementStepper, + NumberInput, + NumberInputField, + NumberInputStepper, + Progress, + Spinner, + Text, + Tooltip, +} from '@chakra-ui/react'; +import LoadingWrap from './LoadingWrap'; +import { IStrategyActionHook, TokenInfo } from '@/strategies/IStrategy'; +import { StrategyInfo } from '@/store/strategies.atoms'; +import { useMemo, useState } from 'react'; +import MyNumber from '@/utils/MyNumber'; +import TxButton from './TxButton'; +import { MyMenuItemProps, MyMenuListProps } from '@/utils'; +import { useAccount, useProvider } from '@starknet-react/core'; +import { ProviderInterface } from 'starknet'; +import mixpanel from 'mixpanel-browser'; +import { StrategyTxProps } from '@/store/transactions.atom'; +import { useAtomValue } from 'jotai'; +import { DUMMY_BAL_ATOM } from '@/store/balance.atoms'; + +interface DepositProps { + strategy: StrategyInfo; + // ? If you want to add more button text, you can add here + // ? @dev ensure below actionType is updated accordingly + buttonText: 'Deposit' | 'Redeem'; + callsInfo: ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => IStrategyActionHook[]; +} + +export default function Deposit(props: DepositProps) { + const { address } = useAccount(); + const { provider } = useProvider(); + const [dirty, setDirty] = useState(false); + + const tvlInfo = useAtomValue(props.strategy.tvlAtom); + + // This is the selected market token + const [selectedMarket, setSelectedMarket] = useState( + props.callsInfo(MyNumber.fromZero(), address || '0x0', provider)[0] + .tokenInfo, + ); + + // This is processed amount stored in MyNumber format and meant for sending tx + const [amount, setAmount] = useState( + MyNumber.fromEther('0', selectedMarket.decimals), + ); + + // This is used to store the raw amount entered by the user + const [rawAmount, setRawAmount] = useState(''); + + // use to maintain tx history and show toasts + const txInfo: StrategyTxProps = useMemo(() => { + return { + strategyId: props.strategy.id, + actionType: props.buttonText == 'Deposit' ? 'deposit' : 'withdraw', + amount, + tokenAddr: selectedMarket.token, + }; + }, [amount, props]); + + // constructs tx calls + const { calls, actions } = useMemo(() => { + const actions = props.callsInfo(amount, address || '0x0', provider); + const hook = actions.find((a) => a.tokenInfo.name === selectedMarket.name); + if (!hook) return { calls: [], actions }; + return { calls: hook.calls, actions }; + }, [selectedMarket, amount, address, provider]); + + const balData = useAtomValue( + actions.find((a) => a.tokenInfo.name === selectedMarket.name) + ?.balanceAtom || DUMMY_BAL_ATOM, + ); + const balance = useMemo(() => { + return balData.data?.amount || MyNumber.fromZero(); + }, [balData]); + // const { balance, isLoading, isError } = useERC20Balance(selectedMarket); + const maxAmount: MyNumber = useMemo(() => { + const currentTVl = tvlInfo.data?.amount || MyNumber.fromZero(); + const maxAllowed = + props.strategy.settings.maxTVL - Number(currentTVl.toEtherStr()); + const adjustedMaxAllowed = MyNumber.fromEther( + maxAllowed.toFixed(6), + selectedMarket.decimals, + ); + let reducedBalance = balance; + + if (selectedMarket.name === 'STRK') { + reducedBalance = balance.subtract( + MyNumber.fromEther('1.5', selectedMarket.decimals), + ); + } else if (selectedMarket.name === 'ETH') { + reducedBalance = balance.subtract( + MyNumber.fromEther('0.001', selectedMarket.decimals), + ); + } + console.log('Deposit:: reducedBalance2', reducedBalance.toEtherStr()); + const min = MyNumber.min(reducedBalance, adjustedMaxAllowed); + return MyNumber.max(min, MyNumber.fromEther('0', selectedMarket.decimals)); + }, [balance, props.strategy, selectedMarket]); + + function BalanceComponent(props: { + token: TokenInfo; + strategy: StrategyInfo; + buttonText: string; + }) { + return ( + + Available balance + + + + {balance.toEtherToFixedDecimals(4)} + + + + + + ); + } + + return ( + + + + + } + bgColor={'highlight'} + borderColor={'bg'} + borderWidth={'1px'} + color="color2Text" + _hover={{ + bg: 'bg', + }} + > +
+ {/* */} + {balData.data && balData.data.tokenInfo + ? balData.data.tokenInfo.name + : '-'} +
+
+ + {actions.map((dep) => ( + { + if (selectedMarket.name != dep.tokenInfo.name) { + setSelectedMarket(dep.tokenInfo); + setAmount(new MyNumber('0', dep.tokenInfo.decimals)); + setDirty(false); + setRawAmount(''); + } + }} + > +
+ {' '} + {dep.tokenInfo.name} +
+
+ ))} +
+
+
+ + + +
+ + {/* add min max validations and show err */} + { + if (value && Number(value) > 0) + setAmount(MyNumber.fromEther(value, selectedMarket.decimals)); + else { + setAmount(new MyNumber('0', selectedMarket.decimals)); + } + setRawAmount(value); + setDirty(true); + mixpanel.track('Enter amount', { + strategy: props.strategy.name, + buttonText: props.buttonText, + amount: amount.toEtherStr(), + token: selectedMarket.name, + maxAmount: maxAmount.toEtherStr(), + address, + }); + }} + marginTop={'10px'} + keepWithinRange={false} + clampValueOnBlur={false} + value={rawAmount} + isDisabled={maxAmount.isZero()} + > + + + + + + + {amount.isZero() && dirty && ( + + Require amount {'>'} 0 + + )} + {amount.compare(maxAmount.toEtherStr(), 'gt') && ( + + Amount to be less than {maxAmount.toEtherToFixedDecimals(2)} + + )} + +
+ +
+ + + No additional fees by STRKFarm + + + + + + Current TVL Limit: + + + {!tvlInfo || !tvlInfo?.data ? ( + + ) : ( + Number(tvlInfo.data?.amount.toFixedStr(0)).toLocaleString() + )} + {' / '} + {props.strategy.settings.maxTVL.toLocaleString()}{' '} + {selectedMarket.name} + + + + {/* {tvlInfo.isError ? 1 : 0}{tvlInfo.isLoading ? 1 : 0} {JSON.stringify(tvlInfo.error)} */} + +
+ ); +} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e9e54b5..b9a5410 100755 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,267 +1,267 @@ -import { ChevronDownIcon } from '@chakra-ui/icons'; -import { - Avatar, - Box, - Button, - Center, - Container, - Flex, - IconButton, - Image, - Link, - Menu, - MenuButton, - MenuItem, - MenuList, - Text, -} from '@chakra-ui/react'; -import { useAtom, useSetAtom } from 'jotai'; -import { useStarknetkitConnectModal } from 'starknetkit'; - -import tg from '@/assets/tg.svg'; -import fulllogo from '@public/fulllogo.png'; -import CONSTANTS from '@/constants'; -import { addressAtom } from '@/store/claims.atoms'; -import { MyMenuItemProps, MyMenuListProps, shortAddress } from '@/utils'; -import { useEffect } from 'react'; -import { lastWalletAtom } from '@/store/utils.atoms'; -import { useAccount, useConnect, useDisconnect } from '@starknet-react/core'; -import { CONNECTOR_NAMES, MYCONNECTORS } from '@/app/template'; -import { isMobile } from 'react-device-detect'; - -interface NavbarProps { - hideTg?: boolean; - forceShowConnect?: boolean; -} - -export default function Navbar(props: NavbarProps) { - const { address, connector } = useAccount(); - const { connect, connectors } = useConnect(); - const { disconnectAsync } = useDisconnect(); - const setAddress = useSetAtom(addressAtom); - const [lastWallet, setLastWallet] = useAtom(lastWalletAtom); - const { starknetkitConnectModal: starknetkitConnectModal1 } = - useStarknetkitConnectModal({ - modalMode: 'canAsk', - modalTheme: 'dark', - connectors: MYCONNECTORS, - }); - - // backup - const { starknetkitConnectModal: starknetkitConnectModal2 } = - useStarknetkitConnectModal({ - modalMode: 'alwaysAsk', - modalTheme: 'dark', - connectors: MYCONNECTORS, - }); - - // Connect wallet using starknetkit - const connectWallet = async () => { - try { - const result = await starknetkitConnectModal1(); - await connect({ connector: result.connector }); - } catch (error) { - console.warn('connectWallet error', error); - try { - const result = await starknetkitConnectModal2(); - await connect({ connector: result.connector }); - } catch (error) { - console.error('connectWallet error', error); - alert('Error connecting wallet'); - } - } - }; - - function autoConnect(retry = 0) { - console.log('lastWallet', lastWallet, connectors); - try { - if (!address && lastWallet) { - const connectorIndex = CONNECTOR_NAMES.findIndex( - (name) => name === lastWallet, - ); - if (connectorIndex >= 0) { - connect({ connector: MYCONNECTORS[connectorIndex] }); - } - } - } catch (error) { - console.error('lastWallet error', error); - if (retry < 10) { - setTimeout(() => { - autoConnect(retry + 1); - }, 1000); - } - } - } - // Auto-connects to last wallet - useEffect(() => { - autoConnect(); - }, [lastWallet]); - - // Set last wallet when a new wallet is connected - useEffect(() => { - console.log('lastWallet connector', connector?.name); - if (connector) { - const name: string = connector.name; - setLastWallet(name); - } - }, [connector]); - - // set address atom - useEffect(() => { - setAddress(address); - }, [address]); - - return ( - -
- - {''} - Report bugs & share feedback in our Telegram group. - {''} - -
- - - - logo - - {/* - - */} - {!props.hideTg && ( - - - - } - /> - - )} - {(!isMobile || props.forceShowConnect) && ( - - : <>} - iconSpacing={{ base: '1px', sm: '5px' }} - bgColor={'purple'} - color="white" - borderColor={'purple'} - borderWidth="1px" - _hover={{ - bg: 'bg', - borderColor: 'purple', - borderWidth: '1px', - color: 'purple', - }} - _active={{ - bg: 'bg', - borderColor: 'purple', - color: 'purple', - }} - marginLeft={'10px'} - display={{ base: 'flex' }} - height={{ base: '2rem', sm: '2.5rem' }} - my={{ base: 'auto', sm: 'initial' }} - paddingX={{ base: '0.5rem', sm: '1rem' }} - fontSize={{ base: '0.8rem', sm: '1rem' }} - onClick={address ? undefined : connectWallet} - size="xs" - > -
{address ? shortAddress(address) : 'Connect'}
-
- - {address && ( - { - disconnectAsync().then((data) => { - console.log('wallet disconnected'); - setLastWallet(null); - }); - }} - > - Disconnect - - )} - -
- )} -
-
-
- ); -} +import { ChevronDownIcon } from '@chakra-ui/icons'; +import { + Avatar, + Box, + Button, + Center, + Container, + Flex, + IconButton, + Image, + Link, + Menu, + MenuButton, + MenuItem, + MenuList, + Text, +} from '@chakra-ui/react'; +import { useAtom, useSetAtom } from 'jotai'; +import { useStarknetkitConnectModal } from 'starknetkit'; + +import tg from '@/assets/tg.svg'; +import fulllogo from '@public/fulllogo.png'; +import CONSTANTS from '@/constants'; +import { addressAtom } from '@/store/claims.atoms'; +import { MyMenuItemProps, MyMenuListProps, shortAddress } from '@/utils'; +import { useEffect } from 'react'; +import { lastWalletAtom } from '@/store/utils.atoms'; +import { useAccount, useConnect, useDisconnect } from '@starknet-react/core'; +import { CONNECTOR_NAMES, MYCONNECTORS } from '@/app/template'; +import { isMobile } from 'react-device-detect'; + +interface NavbarProps { + hideTg?: boolean; + forceShowConnect?: boolean; +} + +export default function Navbar(props: NavbarProps) { + const { address, connector } = useAccount(); + const { connect, connectors } = useConnect(); + const { disconnectAsync } = useDisconnect(); + const setAddress = useSetAtom(addressAtom); + const [lastWallet, setLastWallet] = useAtom(lastWalletAtom); + const { starknetkitConnectModal: starknetkitConnectModal1 } = + useStarknetkitConnectModal({ + modalMode: 'canAsk', + modalTheme: 'dark', + connectors: MYCONNECTORS, + }); + + // backup + const { starknetkitConnectModal: starknetkitConnectModal2 } = + useStarknetkitConnectModal({ + modalMode: 'alwaysAsk', + modalTheme: 'dark', + connectors: MYCONNECTORS, + }); + + // Connect wallet using starknetkit + const connectWallet = async () => { + try { + const result = await starknetkitConnectModal1(); + await connect({ connector: result.connector }); + } catch (error) { + console.warn('connectWallet error', error); + try { + const result = await starknetkitConnectModal2(); + await connect({ connector: result.connector }); + } catch (error) { + console.error('connectWallet error', error); + alert('Error connecting wallet'); + } + } + }; + + function autoConnect(retry = 0) { + console.log('lastWallet', lastWallet, connectors); + try { + if (!address && lastWallet) { + const connectorIndex = CONNECTOR_NAMES.findIndex( + (name) => name === lastWallet, + ); + if (connectorIndex >= 0) { + connect({ connector: MYCONNECTORS[connectorIndex] }); + } + } + } catch (error) { + console.error('lastWallet error', error); + if (retry < 10) { + setTimeout(() => { + autoConnect(retry + 1); + }, 1000); + } + } + } + // Auto-connects to last wallet + useEffect(() => { + autoConnect(); + }, [lastWallet]); + + // Set last wallet when a new wallet is connected + useEffect(() => { + console.log('lastWallet connector', connector?.name); + if (connector) { + const name: string = connector.name; + setLastWallet(name); + } + }, [connector]); + + // set address atom + useEffect(() => { + setAddress(address); + }, [address]); + + return ( + +
+ + {''} + Report bugs & share feedback in our Telegram group. + {''} + +
+ + + + logo + + {/* + + */} + {!props.hideTg && ( + + + + } + /> + + )} + {(!isMobile || props.forceShowConnect) && ( + + : <>} + iconSpacing={{ base: '1px', sm: '5px' }} + bgColor={'purple'} + color="white" + borderColor={'purple'} + borderWidth="1px" + _hover={{ + bg: 'bg', + borderColor: 'purple', + borderWidth: '1px', + color: 'purple', + }} + _active={{ + bg: 'bg', + borderColor: 'purple', + color: 'purple', + }} + marginLeft={'10px'} + display={{ base: 'flex' }} + height={{ base: '2rem', sm: '2.5rem' }} + my={{ base: 'auto', sm: 'initial' }} + paddingX={{ base: '0.5rem', sm: '1rem' }} + fontSize={{ base: '0.8rem', sm: '1rem' }} + onClick={address ? undefined : connectWallet} + size="xs" + > +
{address ? shortAddress(address) : 'Connect'}
+
+ + {address && ( + { + disconnectAsync().then((data) => { + console.log('wallet disconnected'); + setLastWallet(null); + }); + }} + > + Disconnect + + )} + +
+ )} +
+
+
+ ); +} diff --git a/src/components/Strategies.tsx b/src/components/Strategies.tsx index 15757b6..e620db2 100755 --- a/src/components/Strategies.tsx +++ b/src/components/Strategies.tsx @@ -1,343 +1,343 @@ -import { allPoolsAtomUnSorted } from '@/store/pools'; -import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; -import { getUniqueById } from '@/utils'; -import { AddIcon } from '@chakra-ui/icons'; -import { - Avatar, - AvatarGroup, - Badge, - Box, - Button, - Card, - CardBody, - Center, - Container, - HStack, - Heading, - Link, - LinkBox, - LinkOverlay, - Popover, - PopoverArrow, - PopoverBody, - PopoverCloseButton, - PopoverContent, - PopoverTrigger, - Skeleton, - Stack, - Text, - Tooltip, - Wrap, - WrapItem, -} from '@chakra-ui/react'; -import { useAtomValue } from 'jotai'; -import React from 'react'; -import mixpanel from 'mixpanel-browser'; -import TVL from './TVL'; -import CONSTANTS from '@/constants'; -import { IStrategyProps, StrategyLiveStatus } from '@/strategies/IStrategy'; - -export default function Strategies() { - const allPools = useAtomValue(allPoolsAtomUnSorted); - const strategies = useAtomValue(strategiesAtom); - - function getStratCardBg(strat: IStrategyProps, index: number) { - if ( - strat.liveStatus == StrategyLiveStatus.ACTIVE || - strat.liveStatus == StrategyLiveStatus.NEW - ) { - return index % 2 === 0 ? 'color1_50p' : 'color2_50p'; - } - return 'bg'; - } - - function getStratCardBgHover(strat: IStrategyProps, index: number) { - if (strat.liveStatus == StrategyLiveStatus.ACTIVE) { - return index % 2 === 0 ? 'color1_65p' : 'color2_65p'; - } - return 'bg'; - } - - function DepositButton(strat: StrategyInfo) { - // const { isOpen, onOpen, onClose } = useDisclosure() - return ( - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.pool.name, - logo: p.pool.pool.logos[0], - })), - ).map((p: any) => ( - - ))} - - - {strat.description} - - - - - - - - - - - Thanks for showing interest in{' '} - `One Click Deposit` feature. We are developing this as - you read this message and will be available soon. The button is - to let you know that we will be supporting this soon. 😎 - - - - - Join our Telegram group to get instant updates. Link on the - top. - - - - - - - ); - } - - function isLive(strat: StrategyInfo) { - return ( - strat.liveStatus == StrategyLiveStatus.ACTIVE || - strat.liveStatus == StrategyLiveStatus.NEW - ); - } - - function getStratCard(strat: StrategyInfo) { - return ( - - { - mixpanel.track('Strategy expanded', { name: strat.name }); - }} - > - - - - - - {strat.name} - - {strat.liveStatus != StrategyLiveStatus.ACTIVE && ( - - {strat.liveStatus.valueOf()} - - )} - - - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.protocol.name, - logo: p.pool.protocol.logo, - })), - ).map((p) => ( - -
- - {p.id} -
-
- ))} -
-
-
-
-
- - - - - {(strat.netYield * 100).toFixed(2)}% - - - - - {getUniqueById( - strat.actions.map((p) => ({ - id: p.pool.pool.name, - logo: p.pool.pool.logos[0], - })), - ).map((p: any) => ( - - ))} - - - - - {strat.leverage.toFixed(1)}x - - - - {/* - {getAPRWithToolTip(pool)} - ${Math.round(pool.tvl).toLocaleString()} - */} -
- ); - } - - return ( - - - - What are strategies? Strategies are combination of investment - steps that combine various pools and risk combinations to maximize - yield. We currently have one High yield low risk strategy, and adding - more as you read this. - - - - - - Strategy - - - - APR(%)/Leverage - - - - - - {allPools.length && strategies.length > 0 && ( - - {strategies.map((strat, index) => ( - - - - {getStratCard(strat)} - - {/* {DepositButton(strat)} */} - - - ))} - - )} - {allPools.length > 0 && strategies.length === 0 && ( - - - No strategies. Check back soon. - - - )} - {allPools.length === 0 && ( - - - - - - - )} - - More strategies coming soon. Join our{' '} - - Telegram channel - {' '} - to stay upto date. - - - ); -} +import { allPoolsAtomUnSorted } from '@/store/pools'; +import { StrategyInfo, strategiesAtom } from '@/store/strategies.atoms'; +import { getUniqueById } from '@/utils'; +import { AddIcon } from '@chakra-ui/icons'; +import { + Avatar, + AvatarGroup, + Badge, + Box, + Button, + Card, + CardBody, + Center, + Container, + HStack, + Heading, + Link, + LinkBox, + LinkOverlay, + Popover, + PopoverArrow, + PopoverBody, + PopoverCloseButton, + PopoverContent, + PopoverTrigger, + Skeleton, + Stack, + Text, + Tooltip, + Wrap, + WrapItem, +} from '@chakra-ui/react'; +import { useAtomValue } from 'jotai'; +import React from 'react'; +import mixpanel from 'mixpanel-browser'; +import TVL from './TVL'; +import CONSTANTS from '@/constants'; +import { IStrategyProps, StrategyLiveStatus } from '@/strategies/IStrategy'; + +export default function Strategies() { + const allPools = useAtomValue(allPoolsAtomUnSorted); + const strategies = useAtomValue(strategiesAtom); + + function getStratCardBg(strat: IStrategyProps, index: number) { + if ( + strat.liveStatus == StrategyLiveStatus.ACTIVE || + strat.liveStatus == StrategyLiveStatus.NEW + ) { + return index % 2 === 0 ? 'color1_50p' : 'color2_50p'; + } + return 'bg'; + } + + function getStratCardBgHover(strat: IStrategyProps, index: number) { + if (strat.liveStatus == StrategyLiveStatus.ACTIVE) { + return index % 2 === 0 ? 'color1_65p' : 'color2_65p'; + } + return 'bg'; + } + + function DepositButton(strat: StrategyInfo) { + // const { isOpen, onOpen, onClose } = useDisclosure() + return ( + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.pool.name, + logo: p.pool.pool.logos[0], + })), + ).map((p: any) => ( + + ))} + + + {strat.description} + + + + + + + + + + + Thanks for showing interest in{' '} + `One Click Deposit` feature. We are developing this as + you read this message and will be available soon. The button is + to let you know that we will be supporting this soon. 😎 + + + + + Join our Telegram group to get instant updates. Link on the + top. + + + + + + + ); + } + + function isLive(strat: StrategyInfo) { + return ( + strat.liveStatus == StrategyLiveStatus.ACTIVE || + strat.liveStatus == StrategyLiveStatus.NEW + ); + } + + function getStratCard(strat: StrategyInfo) { + return ( + + { + mixpanel.track('Strategy expanded', { name: strat.name }); + }} + > + + + + + + {strat.name} + + {strat.liveStatus != StrategyLiveStatus.ACTIVE && ( + + {strat.liveStatus.valueOf()} + + )} + + + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.protocol.name, + logo: p.pool.protocol.logo, + })), + ).map((p) => ( + +
+ + {p.id} +
+
+ ))} +
+
+
+
+
+ + + + + {(strat.netYield * 100).toFixed(2)}% + + + + + {getUniqueById( + strat.actions.map((p) => ({ + id: p.pool.pool.name, + logo: p.pool.pool.logos[0], + })), + ).map((p: any) => ( + + ))} + + + + + {strat.leverage.toFixed(1)}x + + + + {/* + {getAPRWithToolTip(pool)} + ${Math.round(pool.tvl).toLocaleString()} + */} +
+ ); + } + + return ( + + + + What are strategies? Strategies are combination of investment + steps that combine various pools and risk combinations to maximize + yield. We currently have one High yield low risk strategy, and adding + more as you read this. + + + + + + Strategy + + + + APR(%)/Leverage + + + + + + {allPools.length && strategies.length > 0 && ( + + {strategies.map((strat, index) => ( + + + + {getStratCard(strat)} + + {/* {DepositButton(strat)} */} + + + ))} + + )} + {allPools.length > 0 && strategies.length === 0 && ( + + + No strategies. Check back soon. + + + )} + {allPools.length === 0 && ( + + + + + + + )} + + More strategies coming soon. Join our{' '} + + Telegram channel + {' '} + to stay upto date. + + + ); +} diff --git a/src/components/TxButton.tsx b/src/components/TxButton.tsx index 72fa8ab..8e6cef9 100755 --- a/src/components/TxButton.tsx +++ b/src/components/TxButton.tsx @@ -1,122 +1,122 @@ -import CONSTANTS from '@/constants'; -import { StrategyTxProps, monitorNewTxAtom } from '@/store/transactions.atom'; -import { Box, Button, ButtonProps, Spinner } from '@chakra-ui/react'; -import { useAccount, useContractWrite } from '@starknet-react/core'; -import { useSetAtom } from 'jotai'; -import mixpanel from 'mixpanel-browser'; -import { useEffect, useMemo } from 'react'; -import { isMobile } from 'react-device-detect'; -import { Call } from 'starknet'; - -interface TxButtonProps { - txInfo: StrategyTxProps; - text: string; - calls: Call[]; - buttonProps: ButtonProps; - justDisableIfNoWalletConnect?: boolean; -} - -export default function TxButton(props: TxButtonProps) { - const { address } = useAccount(); - const monitorNewTx = useSetAtom(monitorNewTxAtom); - const disabledStyle = { - bg: 'var(--chakra-colors-disabled_bg)', - color: 'var(--chakra-colors-disabled_text)', - borderColor: 'var(--chakra-colors-disabled_bg)', - borderWidth: '1px', - }; - - const { writeAsync, data, status, isSuccess, isPending, error, isError } = - useContractWrite({ - calls: props.calls, - }); - - useEffect(() => { - console.log( - 'TxButton status', - isPending, - status, - isSuccess, - data, - error, - isError, - ); - if (data && data.transaction_hash) { - console.log('TxButton txHash', data.transaction_hash); - // initiates a toast and adds the tx to tx history if successful - monitorNewTx({ - txHash: data.transaction_hash, - info: props.txInfo, - status: 'pending', // 'success' | 'failed' - createdAt: new Date(), - }); - } - }, [status, data]); - - // useEffect(() => { - // console.log('TxButton props calls', props.calls); - // }, [props]) - - const disabledText = useMemo(() => { - if (props.justDisableIfNoWalletConnect) { - if (!address) return props.text; - return ''; - } - if (isMobile) return CONSTANTS.MOBILE_MSG; - if (!address) return 'Wallet not connected'; - return ''; - }, [isMobile, address, props]); - - if (disabledText) { - return ( - - ); - } - - return ( - - - - ); -} +import CONSTANTS from '@/constants'; +import { StrategyTxProps, monitorNewTxAtom } from '@/store/transactions.atom'; +import { Box, Button, ButtonProps, Spinner } from '@chakra-ui/react'; +import { useAccount, useContractWrite } from '@starknet-react/core'; +import { useSetAtom } from 'jotai'; +import mixpanel from 'mixpanel-browser'; +import { useEffect, useMemo } from 'react'; +import { isMobile } from 'react-device-detect'; +import { Call } from 'starknet'; + +interface TxButtonProps { + txInfo: StrategyTxProps; + text: string; + calls: Call[]; + buttonProps: ButtonProps; + justDisableIfNoWalletConnect?: boolean; +} + +export default function TxButton(props: TxButtonProps) { + const { address } = useAccount(); + const monitorNewTx = useSetAtom(monitorNewTxAtom); + const disabledStyle = { + bg: 'var(--chakra-colors-disabled_bg)', + color: 'var(--chakra-colors-disabled_text)', + borderColor: 'var(--chakra-colors-disabled_bg)', + borderWidth: '1px', + }; + + const { writeAsync, data, status, isSuccess, isPending, error, isError } = + useContractWrite({ + calls: props.calls, + }); + + useEffect(() => { + console.log( + 'TxButton status', + isPending, + status, + isSuccess, + data, + error, + isError, + ); + if (data && data.transaction_hash) { + console.log('TxButton txHash', data.transaction_hash); + // initiates a toast and adds the tx to tx history if successful + monitorNewTx({ + txHash: data.transaction_hash, + info: props.txInfo, + status: 'pending', // 'success' | 'failed' + createdAt: new Date(), + }); + } + }, [status, data]); + + // useEffect(() => { + // console.log('TxButton props calls', props.calls); + // }, [props]) + + const disabledText = useMemo(() => { + if (props.justDisableIfNoWalletConnect) { + if (!address) return props.text; + return ''; + } + if (isMobile) return CONSTANTS.MOBILE_MSG; + if (!address) return 'Wallet not connected'; + return ''; + }, [isMobile, address, props]); + + if (disabledText) { + return ( + + ); + } + + return ( + + + + ); +} diff --git a/src/constants.ts b/src/constants.ts index fcad544..470b204 100755 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,168 +1,168 @@ -import { NFTInfo, TokenInfo } from './strategies/IStrategy'; -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', -}; - -export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; -const CONSTANTS = { - DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', - NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', - CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', - CARMINE_URL: '/carmine/api/v2/mainnet', - LENDING_INCENTIVES_URL: - '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', - LOGOS, - COMMUNITY_TG: 'https://t.me/+HQ_eHaXmF-1lZDc1', - NOSTRA: { - LENDING_GRAPH_URL: '/nostra/app/data-yqlpb/endpoint/data/v1/action/find', - }, - ZKLEND: { - BASE_APR_API: '/zklend/api/pools', - }, - JEDI: { - BASE_API: '/jediswap/graphql', - }, - EKUBO: { - CLAIMS_URL: - '/ekubo/airdrops/{{address}}?token=0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - BASE_API: '/ekubo', - }, - HAIKO: { - BASE_APR_API: 'haiko/markets?network=mainnet', - }, - MY_SWAP: { - POOLS_API: '/myswap/data/pools/all.json', - BASE_APR_API: '/myswap/data/pools', - }, - CONTRACTS: { - Master: '0x50314707690c31597849ed66a494fb4279dc060f8805f21593f52906846e28e', - AutoStrkFarm: - '0x541681b9ad63dff1b35f79c78d8477f64857de29a27902f7298f7b620838ea', - AutoUsdcFarm: - '0x16912b22d5696e95ffde888ede4bd69fbbc60c5f873082857a47c543172694f', - DeltaNeutralMMUSDCETH: - '0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422', - DeltaNeutralMMSTRKETH: - '0x20d5fc4c9df4f943ebb36078e703369c04176ed00accf290e8295b659d2cea6', - }, - MOBILE_MSG: 'Desktop/Tablet only', -}; - -export const TOKENS: TokenInfo[] = [ - { - token: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', - name: 'ETH', - decimals: 18, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.ETH, - minAmount: MyNumber.fromEther('10', 18), - maxAmount: MyNumber.fromEther('10000', 18), - stepAmount: MyNumber.fromEther('10', 18), - isERC4626: false, - }, - { - token: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - name: 'STRK', - 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, - }, - { - token: '0x06d8fa671ef84f791b7f601fa79fea8f6ceb70b5fa84189e3159d532162efc21', - name: 'zSTRK', - 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, - }, - { - token: CONSTANTS.CONTRACTS.AutoStrkFarm, - name: 'frmzSTRK', - decimals: 18, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.STRK, - minAmount: MyNumber.fromEther('10', 18), - maxAmount: MyNumber.fromEther('10000', 18), - stepAmount: MyNumber.fromEther('10', 18), - isERC4626: true, - }, - { - token: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', - name: 'USDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', - name: 'USDT', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDT, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: '0x047ad51726d891f972e74e4ad858a261b43869f7126ce7436ee0b2529a98f486', - name: 'zUSDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: false, - }, - { - token: CONSTANTS.CONTRACTS.AutoUsdcFarm, - name: 'frmzUSDC', - decimals: 6, - displayDecimals: 2, - logo: CONSTANTS.LOGOS.USDC, - minAmount: MyNumber.fromEther('10', 6), - maxAmount: MyNumber.fromEther('10000', 6), - stepAmount: MyNumber.fromEther('10', 6), - isERC4626: true, - }, -]; - -export const NFTS: NFTInfo[] = [ - { - name: 'frmDNMMUSDCETH', - address: CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - logo: CONSTANTS.LOGOS.USDC, - config: { - mainTokenName: 'USDC', - }, - }, - { - name: 'frmDNMMSTRKETH', - address: CONSTANTS.CONTRACTS.DeltaNeutralMMSTRKETH, - logo: CONSTANTS.LOGOS.STRK, - config: { - mainTokenName: 'STRK', - }, - }, -]; - -export default CONSTANTS; +import { NFTInfo, TokenInfo } from './strategies/IStrategy'; +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', +}; + +export type TokenName = 'USDT' | 'USDC' | 'ETH' | 'STRK' | 'WBTC' | 'DAI'; +const CONSTANTS = { + DEX_INCENTIVE_URL: '/strk-incentives/fetchFile?file=strk_grant.json', + NOSTRA_DEGEN_INCENTIVE_URL: 'https://api.nostra.finance/query/pool_aprs', + CARMINE_INCENTIVES_URL: '/carmine/api/v1/mainnet/defispring', + CARMINE_URL: '/carmine/api/v2/mainnet', + LENDING_INCENTIVES_URL: + '/strk-incentives/fetchFile?file=prod-api/lending/lending_strk_grant.json', + LOGOS, + COMMUNITY_TG: 'https://t.me/+HQ_eHaXmF-1lZDc1', + NOSTRA: { + LENDING_GRAPH_URL: '/nostra/app/data-yqlpb/endpoint/data/v1/action/find', + }, + ZKLEND: { + BASE_APR_API: '/zklend/api/pools', + }, + JEDI: { + BASE_API: '/jediswap/graphql', + }, + EKUBO: { + CLAIMS_URL: + '/ekubo/airdrops/{{address}}?token=0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + BASE_API: '/ekubo', + }, + HAIKO: { + BASE_APR_API: 'haiko/markets?network=mainnet', + }, + MY_SWAP: { + POOLS_API: '/myswap/data/pools/all.json', + BASE_APR_API: '/myswap/data/pools', + }, + CONTRACTS: { + Master: '0x50314707690c31597849ed66a494fb4279dc060f8805f21593f52906846e28e', + AutoStrkFarm: + '0x541681b9ad63dff1b35f79c78d8477f64857de29a27902f7298f7b620838ea', + AutoUsdcFarm: + '0x16912b22d5696e95ffde888ede4bd69fbbc60c5f873082857a47c543172694f', + DeltaNeutralMMUSDCETH: + '0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422', + DeltaNeutralMMSTRKETH: + '0x20d5fc4c9df4f943ebb36078e703369c04176ed00accf290e8295b659d2cea6', + }, + MOBILE_MSG: 'Desktop/Tablet only', +}; + +export const TOKENS: TokenInfo[] = [ + { + token: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', + name: 'ETH', + decimals: 18, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.ETH, + minAmount: MyNumber.fromEther('10', 18), + maxAmount: MyNumber.fromEther('10000', 18), + stepAmount: MyNumber.fromEther('10', 18), + isERC4626: false, + }, + { + token: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + name: 'STRK', + 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, + }, + { + token: '0x06d8fa671ef84f791b7f601fa79fea8f6ceb70b5fa84189e3159d532162efc21', + name: 'zSTRK', + 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, + }, + { + token: CONSTANTS.CONTRACTS.AutoStrkFarm, + name: 'frmzSTRK', + decimals: 18, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.STRK, + minAmount: MyNumber.fromEther('10', 18), + maxAmount: MyNumber.fromEther('10000', 18), + stepAmount: MyNumber.fromEther('10', 18), + isERC4626: true, + }, + { + token: '0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', + name: 'USDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: '0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', + name: 'USDT', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDT, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: '0x047ad51726d891f972e74e4ad858a261b43869f7126ce7436ee0b2529a98f486', + name: 'zUSDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: false, + }, + { + token: CONSTANTS.CONTRACTS.AutoUsdcFarm, + name: 'frmzUSDC', + decimals: 6, + displayDecimals: 2, + logo: CONSTANTS.LOGOS.USDC, + minAmount: MyNumber.fromEther('10', 6), + maxAmount: MyNumber.fromEther('10000', 6), + stepAmount: MyNumber.fromEther('10', 6), + isERC4626: true, + }, +]; + +export const NFTS: NFTInfo[] = [ + { + name: 'frmDNMMUSDCETH', + address: CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + logo: CONSTANTS.LOGOS.USDC, + config: { + mainTokenName: 'USDC', + }, + }, + { + name: 'frmDNMMSTRKETH', + address: CONSTANTS.CONTRACTS.DeltaNeutralMMSTRKETH, + logo: CONSTANTS.LOGOS.STRK, + config: { + mainTokenName: 'STRK', + }, + }, +]; + +export default CONSTANTS; diff --git a/src/store/IDapp.store.ts b/src/store/IDapp.store.ts index bec38b9..f9b7e02 100755 --- a/src/store/IDapp.store.ts +++ b/src/store/IDapp.store.ts @@ -1,77 +1,77 @@ -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { APRSplit, PoolInfo, PoolMetadata } from './pools'; -import { TokenName } from '@/constants'; -import { StrategyAction } from '@/strategies/IStrategy'; - -export interface APRInfo { - asset: TokenName; - apr: number; -} - -export class IDapp { - name: string = ''; - link: string = ''; - logo: string = ''; - - incentiveDataKey: string = ''; - _computePoolsInfo(data: any): PoolInfo[] { - throw new Error('not implemented: _computePoolsInfo'); - } - - addBaseAPYs( - pools: PoolInfo[], - data: AtomWithQueryResult, - ): PoolInfo[] { - console.log(`lending: ${this.name}`, data); - if (data.isError) { - console.error('Error fetching lending base', data.error); - } - return pools.map((p) => { - const { baseAPY, splitApr, metadata } = this.getBaseAPY(p, data); - const aprSplits = p.aprSplits; - if (splitApr) p.aprSplits.unshift(splitApr); - return { - ...p, - isLoading: data.isLoading, - aprSplits, - apr: baseAPY !== 'Err' ? p.apr + baseAPY : p.apr, - ...metadata, - }; - }); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ): { - baseAPY: number | 'Err'; - splitApr: APRSplit | null; - metadata: PoolMetadata | null; - } { - throw new Error('not implemented: getBaseAPY'); - } - - getHF(positions: StrategyAction[]): { hf: number; isLiquidable: boolean } { - throw new Error('not implemented: getHF'); - } - - getMaxFactoredOut(positions: StrategyAction[], minHf: number): number { - throw new Error('not implemented: getMaxFactoredOut'); - } - - commonVaultFilter(poolName: string) { - const supportedPools = [ - 'ETH/USDC', - 'STRK/USDC', - 'STRK/ETH', - 'USDC/USDT', - 'USDC', - 'USDT', - 'ETH', - 'STRK', - ]; - console.log('filter', poolName, supportedPools.includes(poolName)); - // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); - return supportedPools.includes(poolName); - } -} +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { APRSplit, PoolInfo, PoolMetadata } from './pools'; +import { TokenName } from '@/constants'; +import { StrategyAction } from '@/strategies/IStrategy'; + +export interface APRInfo { + asset: TokenName; + apr: number; +} + +export class IDapp { + name: string = ''; + link: string = ''; + logo: string = ''; + + incentiveDataKey: string = ''; + _computePoolsInfo(data: any): PoolInfo[] { + throw new Error('not implemented: _computePoolsInfo'); + } + + addBaseAPYs( + pools: PoolInfo[], + data: AtomWithQueryResult, + ): PoolInfo[] { + console.log(`lending: ${this.name}`, data); + if (data.isError) { + console.error('Error fetching lending base', data.error); + } + return pools.map((p) => { + const { baseAPY, splitApr, metadata } = this.getBaseAPY(p, data); + const aprSplits = p.aprSplits; + if (splitApr) p.aprSplits.unshift(splitApr); + return { + ...p, + isLoading: data.isLoading, + aprSplits, + apr: baseAPY !== 'Err' ? p.apr + baseAPY : p.apr, + ...metadata, + }; + }); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ): { + baseAPY: number | 'Err'; + splitApr: APRSplit | null; + metadata: PoolMetadata | null; + } { + throw new Error('not implemented: getBaseAPY'); + } + + getHF(positions: StrategyAction[]): { hf: number; isLiquidable: boolean } { + throw new Error('not implemented: getHF'); + } + + getMaxFactoredOut(positions: StrategyAction[], minHf: number): number { + throw new Error('not implemented: getMaxFactoredOut'); + } + + commonVaultFilter(poolName: string) { + const supportedPools = [ + 'ETH/USDC', + 'STRK/USDC', + 'STRK/ETH', + 'USDC/USDT', + 'USDC', + 'USDT', + 'ETH', + 'STRK', + ]; + console.log('filter', poolName, supportedPools.includes(poolName)); + // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); + return supportedPools.includes(poolName); + } +} diff --git a/src/store/balance.atoms.ts b/src/store/balance.atoms.ts index 6317b03..e794d48 100755 --- a/src/store/balance.atoms.ts +++ b/src/store/balance.atoms.ts @@ -1,192 +1,192 @@ -import ERC4626Abi from '@/abi/erc4626.abi.json'; -import { NFTInfo, TokenInfo } from '@/strategies/IStrategy'; -import MyNumber from '@/utils/MyNumber'; -import { NFTS } from '@/constants'; -import { Contract, RpcProvider, num, uint256 } from 'starknet'; -import { atomWithQuery } from 'jotai-tanstack-query'; -import { addressAtom } from '@/store/claims.atoms'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; -import { Atom } from 'jotai'; -import { - getTokenInfoFromAddr, - getTokenInfoFromName, - standariseAddress, -} from '@/utils'; - -export interface BalanceResult { - amount: MyNumber; - tokenInfo: TokenInfo | undefined; -} - -function returnEmptyBal(): BalanceResult { - return { - amount: MyNumber.fromZero(), - tokenInfo: undefined, - }; -} - -export async function getERC20Balance( - token: TokenInfo | undefined, - address: string | undefined, -) { - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc20Contract = new Contract(ERC20Abi, token.token, provider); - const balance = await erc20Contract.call('balanceOf', [address]); - console.log('erc20 balData', token.token, balance.toString()); - return { - amount: new MyNumber(balance.toString(), token.decimals), - tokenInfo: token, - }; -} - -export async function getERC4626Balance( - token: TokenInfo | undefined, - address: string | undefined, -) { - console.log('balData isERC4626', token?.token); - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const bal = await getERC20Balance(token, address); - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc4626Contract = new Contract(ERC4626Abi, token.token, provider); - const balance = await erc4626Contract.call('convert_to_assets', [ - uint256.bnToUint256(bal.amount.toString()), - ]); - - const asset = await erc4626Contract.call('asset', []); - console.log( - 'erc4626 balData', - token.token, - balance, - standariseAddress(asset as string), - ); - const assetInfo = getTokenInfoFromAddr(standariseAddress(asset as string)); - if (!assetInfo) { - throw new Error('ERC4626: Asset not found'); - } - return { - amount: new MyNumber(balance.toString(), token.decimals), - tokenInfo: assetInfo, - }; -} - -export async function getERC721PositionValue( - token: NFTInfo | undefined, - address: string | undefined, -) { - if (!token) return returnEmptyBal(); - if (!address) return returnEmptyBal(); - - const provider = new RpcProvider({ - nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, - }); - const erc721Contract = new Contract(DeltaNeutralAbi, token.address, provider); - const tokenId = num.getDecimalString(address); - const result: any = await erc721Contract.call('describe_position', [tokenId]); - console.log('erc721 position balData', token.address, result[1]); - const tokenInfo = getTokenInfoFromName(token.config.mainTokenName); - return { - amount: new MyNumber( - uint256.uint256ToBN(result[1].estimated_size).toString(), - tokenInfo.decimals, - ), - tokenInfo, - }; -} - -export function getERC20BalanceAtom(token: TokenInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC20Balance', token?.token], - queryFn: async ({ queryKey }: any): Promise => { - return getERC20Balance(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -function getERC4626BalanceAtom(token: TokenInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC4626Balance', token?.token], - queryFn: async ({ queryKey }: any): Promise => { - return getERC4626Balance(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -function getERC721PositionValueAtom(token: NFTInfo | undefined) { - return atomWithQuery((get) => { - return { - queryKey: ['getERC721PositionValue', token?.address], - queryFn: async ({ queryKey }: any): Promise => { - return getERC721PositionValue(token, get(addressAtom)); - }, - refetchInterval: 5000, - }; - }); -} - -export async function getBalance( - token: TokenInfo | NFTInfo | undefined, - address: string, -) { - if (token) { - console.log('token getBalance', token); - if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { - const _token = token; - console.log('token getBalance isERC4626', _token.isERC4626); - if (_token.isERC4626) return getERC4626Balance(_token, address); - } else { - const _token = token; - const isNFT = NFTS.find((nft) => nft.address === _token.address); - if (isNFT) return getERC721PositionValue(_token, address); - } - return getERC20Balance(token, address); - } - - return returnEmptyBal(); -} - -export function getBalanceAtom( - token: TokenInfo | NFTInfo | undefined, - enabledAtom: Atom, -) { - if (token) { - console.log('token getBalanceAtom', token); - if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { - const _token = token; - console.log('token getBalanceAtom isERC4626', _token.isERC4626); - if (_token.isERC4626) return getERC4626BalanceAtom(_token); - } else { - const _token = token; - const isNFT = NFTS.find((nft) => nft.address === _token.address); - if (isNFT) return getERC721PositionValueAtom(_token); - } - } - - // fallback option for now. if token is undefined, this will return 0 anyways - return getERC20BalanceAtom(token); -} - -export const DUMMY_BAL_ATOM = atomWithQuery((get) => { - return { - queryKey: ['DUMMY_BAL_ATOM'], - queryFn: async ({ queryKey }: any): Promise => { - return returnEmptyBal(); - }, - refetchInterval: 100000000, - }; -}); +import ERC4626Abi from '@/abi/erc4626.abi.json'; +import { NFTInfo, TokenInfo } from '@/strategies/IStrategy'; +import MyNumber from '@/utils/MyNumber'; +import { NFTS } from '@/constants'; +import { Contract, RpcProvider, num, uint256 } from 'starknet'; +import { atomWithQuery } from 'jotai-tanstack-query'; +import { addressAtom } from '@/store/claims.atoms'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; +import { Atom } from 'jotai'; +import { + getTokenInfoFromAddr, + getTokenInfoFromName, + standariseAddress, +} from '@/utils'; + +export interface BalanceResult { + amount: MyNumber; + tokenInfo: TokenInfo | undefined; +} + +function returnEmptyBal(): BalanceResult { + return { + amount: MyNumber.fromZero(), + tokenInfo: undefined, + }; +} + +export async function getERC20Balance( + token: TokenInfo | undefined, + address: string | undefined, +) { + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc20Contract = new Contract(ERC20Abi, token.token, provider); + const balance = await erc20Contract.call('balanceOf', [address]); + console.log('erc20 balData', token.token, balance.toString()); + return { + amount: new MyNumber(balance.toString(), token.decimals), + tokenInfo: token, + }; +} + +export async function getERC4626Balance( + token: TokenInfo | undefined, + address: string | undefined, +) { + console.log('balData isERC4626', token?.token); + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const bal = await getERC20Balance(token, address); + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc4626Contract = new Contract(ERC4626Abi, token.token, provider); + const balance = await erc4626Contract.call('convert_to_assets', [ + uint256.bnToUint256(bal.amount.toString()), + ]); + + const asset = await erc4626Contract.call('asset', []); + console.log( + 'erc4626 balData', + token.token, + balance, + standariseAddress(asset as string), + ); + const assetInfo = getTokenInfoFromAddr(standariseAddress(asset as string)); + if (!assetInfo) { + throw new Error('ERC4626: Asset not found'); + } + return { + amount: new MyNumber(balance.toString(), token.decimals), + tokenInfo: assetInfo, + }; +} + +export async function getERC721PositionValue( + token: NFTInfo | undefined, + address: string | undefined, +) { + if (!token) return returnEmptyBal(); + if (!address) return returnEmptyBal(); + + const provider = new RpcProvider({ + nodeUrl: process.env.NEXT_PUBLIC_RPC_URL, + }); + const erc721Contract = new Contract(DeltaNeutralAbi, token.address, provider); + const tokenId = num.getDecimalString(address); + const result: any = await erc721Contract.call('describe_position', [tokenId]); + console.log('erc721 position balData', token.address, result[1]); + const tokenInfo = getTokenInfoFromName(token.config.mainTokenName); + return { + amount: new MyNumber( + uint256.uint256ToBN(result[1].estimated_size).toString(), + tokenInfo.decimals, + ), + tokenInfo, + }; +} + +export function getERC20BalanceAtom(token: TokenInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC20Balance', token?.token], + queryFn: async ({ queryKey }: any): Promise => { + return getERC20Balance(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +function getERC4626BalanceAtom(token: TokenInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC4626Balance', token?.token], + queryFn: async ({ queryKey }: any): Promise => { + return getERC4626Balance(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +function getERC721PositionValueAtom(token: NFTInfo | undefined) { + return atomWithQuery((get) => { + return { + queryKey: ['getERC721PositionValue', token?.address], + queryFn: async ({ queryKey }: any): Promise => { + return getERC721PositionValue(token, get(addressAtom)); + }, + refetchInterval: 5000, + }; + }); +} + +export async function getBalance( + token: TokenInfo | NFTInfo | undefined, + address: string, +) { + if (token) { + console.log('token getBalance', token); + if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { + const _token = token; + console.log('token getBalance isERC4626', _token.isERC4626); + if (_token.isERC4626) return getERC4626Balance(_token, address); + } else { + const _token = token; + const isNFT = NFTS.find((nft) => nft.address === _token.address); + if (isNFT) return getERC721PositionValue(_token, address); + } + return getERC20Balance(token, address); + } + + return returnEmptyBal(); +} + +export function getBalanceAtom( + token: TokenInfo | NFTInfo | undefined, + enabledAtom: Atom, +) { + if (token) { + console.log('token getBalanceAtom', token); + if (Object.prototype.hasOwnProperty.call(token, 'isERC4626')) { + const _token = token; + console.log('token getBalanceAtom isERC4626', _token.isERC4626); + if (_token.isERC4626) return getERC4626BalanceAtom(_token); + } else { + const _token = token; + const isNFT = NFTS.find((nft) => nft.address === _token.address); + if (isNFT) return getERC721PositionValueAtom(_token); + } + } + + // fallback option for now. if token is undefined, this will return 0 anyways + return getERC20BalanceAtom(token); +} + +export const DUMMY_BAL_ATOM = atomWithQuery((get) => { + return { + queryKey: ['DUMMY_BAL_ATOM'], + queryFn: async ({ queryKey }: any): Promise => { + return returnEmptyBal(); + }, + refetchInterval: 100000000, + }; +}); diff --git a/src/store/carmine.store.ts b/src/store/carmine.store.ts index 684b47c..afce7de 100755 --- a/src/store/carmine.store.ts +++ b/src/store/carmine.store.ts @@ -1,177 +1,177 @@ -import CONSTANTS from '@/constants'; -import { Category, PoolType } from './pools'; -import { atom } from 'jotai'; -import { PoolInfo, ProtocolAtoms } from './pools'; -import { Jediswap } from './jedi.store'; -import { atomWithQuery } from 'jotai-tanstack-query'; - -const poolConfigs = [ - { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, - { name: 'STRK/USDC Put Pool (USDC)', tokenA: 'STRK', tokenB: 'USDC' }, - { name: 'ETH/STRK Call Pool (ETH)', tokenA: 'ETH', tokenB: 'STRK' }, - { name: 'ETH/STRK Put Pool (STRK)', tokenA: 'ETH', tokenB: 'STRK' }, - { name: 'ETH/USDC Call Pool (ETH)', tokenA: 'ETH', tokenB: 'USDC' }, - { name: 'ETH/USDC Put Pool (USDC)', tokenA: 'ETH', tokenB: 'USDC' }, - { name: 'wBTC/USDC Put Pool (USDC)', tokenA: 'WBTC', tokenB: 'USDC' }, - { name: 'wBTC/USDC Call Pool (wBTC)', tokenA: 'WBTC', tokenB: 'USDC' }, -]; - -export class Carmine extends Jediswap { - name = 'Carmine Options'; - link = 'https://app.carmine.finance/staking'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; - incentiveDataKey = 'isCarmine'; - - _computePoolsInfo(data: any) { - try { - const myData = data; - if (!myData) return []; - const pools: PoolInfo[] = []; - - poolConfigs.forEach((config) => { - const poolData = myData[config.name]; - if (!poolData || !poolData.data) return; - - let category: Category; - if (config.name.endsWith('(USDC)')) { - category = Category.Stable; - } else if (config.name.endsWith('(STRK)')) { - category = Category.STRK; - } else { - category = Category.Others; - } - - const logo1 = - CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; - const logo2 = - CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; - - const baseApr = - poolData.data.week_annualized / 100 === 0 - ? 0.0 - : parseFloat(poolData.data.week_annualized) / 100; - const rewardApr = parseFloat(poolData.rewardApr) || 0; - - const poolInfo: PoolInfo = { - pool: { - name: config.name, - logos: [logo1, logo2], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: baseApr + rewardApr, - tvl: poolData.tvl, - aprSplits: [ - { - apr: baseApr || baseApr.toString() === '' ? baseApr : 0, - title: 'Supply Apy', - description: '', - }, - { - apr: rewardApr ?? 0, - title: 'STRK DeFi Spring rewards', - description: '', - }, - ], - category, - type: PoolType.Derivatives, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } catch (err) { - console.error('Err fetching pools [2]', err); - throw err; - } - } -} - -export const carmine = new Carmine(); - -const poolEndpoints = [ - { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, - { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, - { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, - { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, - { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, - { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, - { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, - { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, -]; - -export const CarmineAtom = atomWithQuery((get) => ({ - queryKey: ['isCarmine'], - queryFn: async ({ queryKey }) => { - const fetchPool = async (endpoint: any) => { - const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const fetchRewardApr = async () => { - const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }; - - const rewardAprData = await fetchRewardApr(); - const rewardApr = rewardAprData.data.apy; - const tvl = rewardAprData.data.tvl; - - const poolData = await Promise.all( - poolEndpoints.map(async (pool) => { - const data = await fetchPool(pool.endpoint); - return { name: pool.name, data }; - }), - ); - - const combinedData = poolData.reduce( - (acc, pool) => { - acc[pool.name] = { - ...pool.data, - rewardApr, - tvl, - }; - return acc; - }, - {} as { [key: string]: any }, - ); - - const specificPools = [ - 'wBTC/USDC Call Pool (wBTC)', - 'wBTC/USDC Put Pool (USDC)', - ]; - specificPools.forEach((poolName) => { - if (combinedData[poolName]) { - combinedData[poolName].rewardApr = 0.0; - } - }); - - return combinedData; - }, -})); - -const CarmineAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(CarmineAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return carmine._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; - -export default CarmineAtoms; +import CONSTANTS from '@/constants'; +import { Category, PoolType } from './pools'; +import { atom } from 'jotai'; +import { PoolInfo, ProtocolAtoms } from './pools'; +import { Jediswap } from './jedi.store'; +import { atomWithQuery } from 'jotai-tanstack-query'; + +const poolConfigs = [ + { name: 'STRK/USDC Call Pool (STRK)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'STRK/USDC Put Pool (USDC)', tokenA: 'STRK', tokenB: 'USDC' }, + { name: 'ETH/STRK Call Pool (ETH)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/STRK Put Pool (STRK)', tokenA: 'ETH', tokenB: 'STRK' }, + { name: 'ETH/USDC Call Pool (ETH)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'ETH/USDC Put Pool (USDC)', tokenA: 'ETH', tokenB: 'USDC' }, + { name: 'wBTC/USDC Put Pool (USDC)', tokenA: 'WBTC', tokenB: 'USDC' }, + { name: 'wBTC/USDC Call Pool (wBTC)', tokenA: 'WBTC', tokenB: 'USDC' }, +]; + +export class Carmine extends Jediswap { + name = 'Carmine Options'; + link = 'https://app.carmine.finance/staking'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/carmine/carmine.jpg'; + incentiveDataKey = 'isCarmine'; + + _computePoolsInfo(data: any) { + try { + const myData = data; + if (!myData) return []; + const pools: PoolInfo[] = []; + + poolConfigs.forEach((config) => { + const poolData = myData[config.name]; + if (!poolData || !poolData.data) return; + + let category: Category; + if (config.name.endsWith('(USDC)')) { + category = Category.Stable; + } else if (config.name.endsWith('(STRK)')) { + category = Category.STRK; + } else { + category = Category.Others; + } + + const logo1 = + CONSTANTS.LOGOS[config.tokenA as keyof typeof CONSTANTS.LOGOS]; + const logo2 = + CONSTANTS.LOGOS[config.tokenB as keyof typeof CONSTANTS.LOGOS]; + + const baseApr = + poolData.data.week_annualized / 100 === 0 + ? 0.0 + : parseFloat(poolData.data.week_annualized) / 100; + const rewardApr = parseFloat(poolData.rewardApr) || 0; + + const poolInfo: PoolInfo = { + pool: { + name: config.name, + logos: [logo1, logo2], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: baseApr + rewardApr, + tvl: poolData.tvl, + aprSplits: [ + { + apr: baseApr || baseApr.toString() === '' ? baseApr : 0, + title: 'Supply Apy', + description: '', + }, + { + apr: rewardApr ?? 0, + title: 'STRK DeFi Spring rewards', + description: '', + }, + ], + category, + type: PoolType.Derivatives, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } catch (err) { + console.error('Err fetching pools [2]', err); + throw err; + } + } +} + +export const carmine = new Carmine(); + +const poolEndpoints = [ + { name: 'STRK/USDC Call Pool (STRK)', endpoint: 'strk-usdc-call' }, + { name: 'STRK/USDC Put Pool (USDC)', endpoint: 'strk-usdc-put' }, + { name: 'ETH/STRK Call Pool (ETH)', endpoint: 'eth-strk-call' }, + { name: 'ETH/STRK Put Pool (STRK)', endpoint: 'eth-strk-put' }, + { name: 'ETH/USDC Call Pool (ETH)', endpoint: 'eth-usdc-call' }, + { name: 'ETH/USDC Put Pool (USDC)', endpoint: 'eth-usdc-put' }, + { name: 'wBTC/USDC Put Pool (USDC)', endpoint: 'btc-usdc-put' }, + { name: 'wBTC/USDC Call Pool (wBTC)', endpoint: 'btc-usdc-call' }, +]; + +export const CarmineAtom = atomWithQuery((get) => ({ + queryKey: ['isCarmine'], + queryFn: async ({ queryKey }) => { + const fetchPool = async (endpoint: any) => { + const res = await fetch(`${CONSTANTS.CARMINE_URL}/${endpoint}/apy`); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const fetchRewardApr = async () => { + const res = await fetch(CONSTANTS.CARMINE_INCENTIVES_URL); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }; + + const rewardAprData = await fetchRewardApr(); + const rewardApr = rewardAprData.data.apy; + const tvl = rewardAprData.data.tvl; + + const poolData = await Promise.all( + poolEndpoints.map(async (pool) => { + const data = await fetchPool(pool.endpoint); + return { name: pool.name, data }; + }), + ); + + const combinedData = poolData.reduce( + (acc, pool) => { + acc[pool.name] = { + ...pool.data, + rewardApr, + tvl, + }; + return acc; + }, + {} as { [key: string]: any }, + ); + + const specificPools = [ + 'wBTC/USDC Call Pool (wBTC)', + 'wBTC/USDC Put Pool (USDC)', + ]; + specificPools.forEach((poolName) => { + if (combinedData[poolName]) { + combinedData[poolName].rewardApr = 0.0; + } + }); + + return combinedData; + }, +})); + +const CarmineAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(CarmineAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return carmine._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; + +export default CarmineAtoms; diff --git a/src/store/ekobu.store.ts b/src/store/ekobu.store.ts index d8a844f..67d7b48 100755 --- a/src/store/ekobu.store.ts +++ b/src/store/ekobu.store.ts @@ -1,401 +1,401 @@ -'use client'; - -import CONSTANTS, { TokenName } from '@/constants'; -import { - APRSplit, - Category, - PoolInfo, - PoolMetadata, - PoolType, - ProtocolAtoms, - StrkDexIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { IDapp } from './IDapp.store'; -const fetcher = (...args: any[]) => { - return fetch(args[0], args[1]).then((res) => res.json()); -}; - -interface EkuboBaseAprDoc { - tokens: Token[]; - defiSpringData: DefiSpringData; - pairData: PairData; - pricesETH: PricesOfToken; - pricesSTRK: PricesOfToken; - pricesUSDC: PricesOfToken; - priceOfStrk: PriceOfToken; - priceOfEth: PriceOfToken; -} - -type Token = { - name: string; - symbol: string; - decimals: number; - l2_token_address: string; - sort_order: number; - total_supply: number; - hidden?: boolean; - logo_url: string; -}; - -type DefiSpringData = { - strkPrice: number; - totalStrk: number; - pairs: [ - { - token0: Token; - token1: Token; - allocations: [ - { - date: string; - allocation: number; - thirty_day_realized_volatility: number; - }, - ]; - currentApr: number; - volatilityInTicks: number; - }, - ]; -}; - -type PairData = { - topPairs: [ - { - token0: string; - token1: string; - volume0_24h: string; - volume1_24h: string; - fees0_24h: string; - fees1_24h: string; - tvl0_total: string; - tvl1_total: string; - tvl0_delta_24h: string; - tvl1_delta_24h: string; - }, - ]; -}; - -type PricesOfToken = { - timestamp: number; - prices: [ - { - token: string; - price: string; - k_volume: string; - }, - ]; -}; - -type PriceOfToken = { - timestamp: string; - price: string; -}; - -export class Ekubo extends IDapp { - name = 'Ekubo'; - link = 'https://app.ekubo.org/positions'; - logo = 'https://app.ekubo.org/logo.svg'; - - incentiveDataKey = 'Ekubo'; - - _computePoolsInfo(data: any) { - try { - const myData = data[0][this.incentiveDataKey]; - const baseInfo = data[1]; - if (!myData) return []; - const pools: PoolInfo[] = []; - - Object.keys(myData) - .filter(this.commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - let category = Category.Others; - if (poolName === 'USDC/USDT') { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const tokens: TokenName[] = poolName.split('/'); - const logo1 = CONSTANTS.LOGOS[tokens[0]]; - const logo2 = CONSTANTS.LOGOS[tokens[1]]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1, logo2], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: arr[arr.length - 1].apr, - tvl: arr[arr.length - 1].tvl_usd, - aprSplits: [ - { - apr: arr[arr.length - 1].apr, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.DEXV3, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - - const { rewardAPY } = this.getBaseAPY(poolInfo, baseInfo); - if (rewardAPY) { - poolInfo.apr = rewardAPY; - poolInfo.aprSplits = [ - { - apr: rewardAPY, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ]; - } - pools.push(poolInfo); - }); - - return pools; - } catch (err) { - console.error('Error fetching pools', err); - throw err; - } - } - - commonVaultFilter(poolName: string) { - const supportedPools = [ - 'ETH/USDC', - 'STRK/USDC', - 'STRK/ETH', - 'USDC/USDT', - 'USDC', - 'USDT', - 'ETH', - 'STRK', - ]; - console.log('filter2', poolName, supportedPools.includes(poolName)); - // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); - return supportedPools.includes(poolName); - } - - getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { - let rewardAPY: number = 0; - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - const metadata: PoolMetadata | null = null; - - if (data.isSuccess) { - const poolName = p.pool.name; - - const { - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - } = data.data; - - const strkToken = tokens.find((t) => t.symbol === 'STRK'); - - const pools = pairData.topPairs - .map((p) => { - const t0 = BigInt(p.token0); - const t1 = BigInt(p.token1); - 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); - if (!token1 || token1.hidden) return; - - const springPair = defiSpringData.pairs.find( - (pair) => - BigInt(pair.token0.l2_token_address) === t0 && - BigInt(pair.token1.l2_token_address) === t1, - ); - - const price0 = - token0.symbol === 'USDC' - ? 1 - : getPrice({ - t: t0, - pricesETH, - pricesUSDC, - pricesSTRK, - priceOfEth, - priceOfStrk, - }); - const price1 = - token1.symbol === 'USDC' - ? 1 - : getPrice({ - t: t1, - pricesETH, - pricesUSDC, - pricesSTRK, - priceOfEth, - priceOfStrk, - }); - const tvlUsd = - ((price0 ?? 0) * Number(p.tvl0_total)) / - Math.pow(10, token0.decimals) + - ((price1 ?? 0) * Number(p.tvl1_total)) / - Math.pow(10, token1.decimals); - - if (tvlUsd < 10000) return; - const feesUsd = - ((price0 ?? 0) * Number(p.fees0_24h)) / - Math.pow(10, token0.decimals) + - ((price1 ?? 0) * Number(p.fees1_24h)) / - Math.pow(10, token1.decimals); - - const apyBase = (feesUsd * 365) / tvlUsd; - const apyReward = springPair ? springPair.currentApr : undefined; - - return { - pool: `${token0.symbol}/${token1.symbol}`, - symbol: `${token0.symbol}/${token1.symbol}`, - rewardTokens: - apyReward && strkToken ? [strkToken.l2_token_address] : [], - underlyingTokens: [ - token0.l2_token_address, - token1.l2_token_address, - ], - tvlUsd, - apyBase, - apyReward, - }; - }) - .filter((p) => !!p) - .sort((a, b) => b.tvlUsd - a.tvlUsd); - - const pool = pools.find((p) => p.pool === poolName); - - baseAPY = pool ? pool.apyBase : 0; - rewardAPY = pool && pool.apyReward ? pool.apyReward : 0; - - splitApr = { - apr: baseAPY, - title: 'Base APR', - description: 'Subject to position range', - }; - } - - return { - baseAPY, - rewardAPY, - splitApr, - metadata, - }; - } -} - -const getPrice = ({ - t, - pricesUSDC, - pricesETH, - pricesSTRK, - priceOfEth, - priceOfStrk, -}: { - t: bigint; - pricesUSDC: PricesOfToken; - pricesETH: PricesOfToken; - pricesSTRK: PricesOfToken; - priceOfEth: PriceOfToken; - priceOfStrk: PriceOfToken; -}) => { - let p = pricesUSDC.prices.find(({ token }) => BigInt(token) === t); - if (p) return Number(p.price); - p = pricesETH.prices.find(({ token }) => BigInt(token) === t); - if (p && priceOfEth) { - return Number(p.price) * Number(priceOfEth.price); - } - p = pricesSTRK.prices.find(({ token }) => BigInt(token) === t); - if (p && priceOfStrk) { - return Number(p.price) * Number(priceOfStrk); - } -}; - -const getData = async (): Promise => { - const [ - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - ] = await Promise.all([ - fetch(`${CONSTANTS.EKUBO.BASE_API}/tokens`).then((response) => - response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/defi-spring-incentives`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/overview/pairs`).then((response) => - response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/USDC?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK/USDC?period=21600`).then( - (response) => response.json(), - ), - fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH/USDC?period=21600`).then( - (response) => response.json(), - ), - ]); - - return { - tokens, - defiSpringData, - pairData, - pricesETH, - pricesSTRK, - pricesUSDC, - priceOfStrk, - priceOfEth, - }; -}; - -export const ekubo = new Ekubo(); -const EkuboAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['ekubo_base_aprs'], - queryFn: async ({ queryKey }) => { - return await getData(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkDexIncentivesAtom); - const empty: PoolInfo[] = []; - if (!EkuboAtoms.baseAPRs) return empty; - const baseInfo = get(EkuboAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = ekubo._computePoolsInfo([poolsInfo.data, baseInfo]); - return ekubo.addBaseAPYs(pools, baseInfo); - } - - return empty; - }), -}; -export default EkuboAtoms; +'use client'; + +import CONSTANTS, { TokenName } from '@/constants'; +import { + APRSplit, + Category, + PoolInfo, + PoolMetadata, + PoolType, + ProtocolAtoms, + StrkDexIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { IDapp } from './IDapp.store'; +const fetcher = (...args: any[]) => { + return fetch(args[0], args[1]).then((res) => res.json()); +}; + +interface EkuboBaseAprDoc { + tokens: Token[]; + defiSpringData: DefiSpringData; + pairData: PairData; + pricesETH: PricesOfToken; + pricesSTRK: PricesOfToken; + pricesUSDC: PricesOfToken; + priceOfStrk: PriceOfToken; + priceOfEth: PriceOfToken; +} + +type Token = { + name: string; + symbol: string; + decimals: number; + l2_token_address: string; + sort_order: number; + total_supply: number; + hidden?: boolean; + logo_url: string; +}; + +type DefiSpringData = { + strkPrice: number; + totalStrk: number; + pairs: [ + { + token0: Token; + token1: Token; + allocations: [ + { + date: string; + allocation: number; + thirty_day_realized_volatility: number; + }, + ]; + currentApr: number; + volatilityInTicks: number; + }, + ]; +}; + +type PairData = { + topPairs: [ + { + token0: string; + token1: string; + volume0_24h: string; + volume1_24h: string; + fees0_24h: string; + fees1_24h: string; + tvl0_total: string; + tvl1_total: string; + tvl0_delta_24h: string; + tvl1_delta_24h: string; + }, + ]; +}; + +type PricesOfToken = { + timestamp: number; + prices: [ + { + token: string; + price: string; + k_volume: string; + }, + ]; +}; + +type PriceOfToken = { + timestamp: string; + price: string; +}; + +export class Ekubo extends IDapp { + name = 'Ekubo'; + link = 'https://app.ekubo.org/positions'; + logo = 'https://app.ekubo.org/logo.svg'; + + incentiveDataKey = 'Ekubo'; + + _computePoolsInfo(data: any) { + try { + const myData = data[0][this.incentiveDataKey]; + const baseInfo = data[1]; + if (!myData) return []; + const pools: PoolInfo[] = []; + + Object.keys(myData) + .filter(this.commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + let category = Category.Others; + if (poolName === 'USDC/USDT') { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const tokens: TokenName[] = poolName.split('/'); + const logo1 = CONSTANTS.LOGOS[tokens[0]]; + const logo2 = CONSTANTS.LOGOS[tokens[1]]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1, logo2], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: arr[arr.length - 1].apr, + tvl: arr[arr.length - 1].tvl_usd, + aprSplits: [ + { + apr: arr[arr.length - 1].apr, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.DEXV3, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + + const { rewardAPY } = this.getBaseAPY(poolInfo, baseInfo); + if (rewardAPY) { + poolInfo.apr = rewardAPY; + poolInfo.aprSplits = [ + { + apr: rewardAPY, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ]; + } + pools.push(poolInfo); + }); + + return pools; + } catch (err) { + console.error('Error fetching pools', err); + throw err; + } + } + + commonVaultFilter(poolName: string) { + const supportedPools = [ + 'ETH/USDC', + 'STRK/USDC', + 'STRK/ETH', + 'USDC/USDT', + 'USDC', + 'USDT', + 'ETH', + 'STRK', + ]; + console.log('filter2', poolName, supportedPools.includes(poolName)); + // return !poolName.includes('DAI') && !poolName.includes('WSTETH') && !poolName.includes('BTC'); + return supportedPools.includes(poolName); + } + + getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { + let rewardAPY: number = 0; + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + const metadata: PoolMetadata | null = null; + + if (data.isSuccess) { + const poolName = p.pool.name; + + const { + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + } = data.data; + + const strkToken = tokens.find((t) => t.symbol === 'STRK'); + + const pools = pairData.topPairs + .map((p) => { + const t0 = BigInt(p.token0); + const t1 = BigInt(p.token1); + 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); + if (!token1 || token1.hidden) return; + + const springPair = defiSpringData.pairs.find( + (pair) => + BigInt(pair.token0.l2_token_address) === t0 && + BigInt(pair.token1.l2_token_address) === t1, + ); + + const price0 = + token0.symbol === 'USDC' + ? 1 + : getPrice({ + t: t0, + pricesETH, + pricesUSDC, + pricesSTRK, + priceOfEth, + priceOfStrk, + }); + const price1 = + token1.symbol === 'USDC' + ? 1 + : getPrice({ + t: t1, + pricesETH, + pricesUSDC, + pricesSTRK, + priceOfEth, + priceOfStrk, + }); + const tvlUsd = + ((price0 ?? 0) * Number(p.tvl0_total)) / + Math.pow(10, token0.decimals) + + ((price1 ?? 0) * Number(p.tvl1_total)) / + Math.pow(10, token1.decimals); + + if (tvlUsd < 10000) return; + const feesUsd = + ((price0 ?? 0) * Number(p.fees0_24h)) / + Math.pow(10, token0.decimals) + + ((price1 ?? 0) * Number(p.fees1_24h)) / + Math.pow(10, token1.decimals); + + const apyBase = (feesUsd * 365) / tvlUsd; + const apyReward = springPair ? springPair.currentApr : undefined; + + return { + pool: `${token0.symbol}/${token1.symbol}`, + symbol: `${token0.symbol}/${token1.symbol}`, + rewardTokens: + apyReward && strkToken ? [strkToken.l2_token_address] : [], + underlyingTokens: [ + token0.l2_token_address, + token1.l2_token_address, + ], + tvlUsd, + apyBase, + apyReward, + }; + }) + .filter((p) => !!p) + .sort((a, b) => b.tvlUsd - a.tvlUsd); + + const pool = pools.find((p) => p.pool === poolName); + + baseAPY = pool ? pool.apyBase : 0; + rewardAPY = pool && pool.apyReward ? pool.apyReward : 0; + + splitApr = { + apr: baseAPY, + title: 'Base APR', + description: 'Subject to position range', + }; + } + + return { + baseAPY, + rewardAPY, + splitApr, + metadata, + }; + } +} + +const getPrice = ({ + t, + pricesUSDC, + pricesETH, + pricesSTRK, + priceOfEth, + priceOfStrk, +}: { + t: bigint; + pricesUSDC: PricesOfToken; + pricesETH: PricesOfToken; + pricesSTRK: PricesOfToken; + priceOfEth: PriceOfToken; + priceOfStrk: PriceOfToken; +}) => { + let p = pricesUSDC.prices.find(({ token }) => BigInt(token) === t); + if (p) return Number(p.price); + p = pricesETH.prices.find(({ token }) => BigInt(token) === t); + if (p && priceOfEth) { + return Number(p.price) * Number(priceOfEth.price); + } + p = pricesSTRK.prices.find(({ token }) => BigInt(token) === t); + if (p && priceOfStrk) { + return Number(p.price) * Number(priceOfStrk); + } +}; + +const getData = async (): Promise => { + const [ + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + ] = await Promise.all([ + fetch(`${CONSTANTS.EKUBO.BASE_API}/tokens`).then((response) => + response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/defi-spring-incentives`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/overview/pairs`).then((response) => + response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/USDC?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/STRK/USDC?period=21600`).then( + (response) => response.json(), + ), + fetch(`${CONSTANTS.EKUBO.BASE_API}/price/ETH/USDC?period=21600`).then( + (response) => response.json(), + ), + ]); + + return { + tokens, + defiSpringData, + pairData, + pricesETH, + pricesSTRK, + pricesUSDC, + priceOfStrk, + priceOfEth, + }; +}; + +export const ekubo = new Ekubo(); +const EkuboAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['ekubo_base_aprs'], + queryFn: async ({ queryKey }) => { + return await getData(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkDexIncentivesAtom); + const empty: PoolInfo[] = []; + if (!EkuboAtoms.baseAPRs) return empty; + const baseInfo = get(EkuboAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = ekubo._computePoolsInfo([poolsInfo.data, baseInfo]); + return ekubo.addBaseAPYs(pools, baseInfo); + } + + return empty; + }), +}; +export default EkuboAtoms; diff --git a/src/store/hashstack.store.ts b/src/store/hashstack.store.ts index f36040e..19203a5 100755 --- a/src/store/hashstack.store.ts +++ b/src/store/hashstack.store.ts @@ -1,97 +1,97 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { - Category, - PoolInfo, - PoolType, - ProtocolAtoms, - StrkLendingIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { IDapp } from './IDapp.store'; -import { LendingSpace } from './lending.base'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; - -export class Hashstack extends IDapp { - name = 'Hashstack'; - link = 'https://app.hashstack.finance/'; - logo = 'https://app.hashstack.finance/favicon-32x32.png'; - - incentiveDataKey = 'Hashstack'; - SUPPLY_FACTOR = 0.7; - _computePoolsInfo(data: any) { - const myData = data[this.incentiveDataKey]; - if (!myData) return []; - const pools: PoolInfo[] = []; - Object.keys(myData) - .filter(this.commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - if (arr.length === 0) return; - - let category = Category.Others; - if (['USDC', 'USDT'].includes(poolName)) { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const logo1 = CONSTANTS.LOGOS[poolName]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1], - }, - protocol: { - name: this.name, - link: this.link, - logo: this.logo, - }, - apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, - tvl: arr[arr.length - 1].supply_usd, - aprSplits: [ - { - apr: 0, - title: 'Base APR', - description: 'Shown soon', - }, - { - apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.Lending, - lending: { - collateralFactor: 0, - }, - borrow: { - borrowFactor: 0, - apr: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } -} - -export const hashstack = new Hashstack(); -const HashstackAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return hashstack._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; -export default HashstackAtoms; +import CONSTANTS, { TokenName } from '@/constants'; +import { + Category, + PoolInfo, + PoolType, + ProtocolAtoms, + StrkLendingIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { IDapp } from './IDapp.store'; +import { LendingSpace } from './lending.base'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; + +export class Hashstack extends IDapp { + name = 'Hashstack'; + link = 'https://app.hashstack.finance/'; + logo = 'https://app.hashstack.finance/favicon-32x32.png'; + + incentiveDataKey = 'Hashstack'; + SUPPLY_FACTOR = 0.7; + _computePoolsInfo(data: any) { + const myData = data[this.incentiveDataKey]; + if (!myData) return []; + const pools: PoolInfo[] = []; + Object.keys(myData) + .filter(this.commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + if (arr.length === 0) return; + + let category = Category.Others; + if (['USDC', 'USDT'].includes(poolName)) { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const logo1 = CONSTANTS.LOGOS[poolName]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1], + }, + protocol: { + name: this.name, + link: this.link, + logo: this.logo, + }, + apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, + tvl: arr[arr.length - 1].supply_usd, + aprSplits: [ + { + apr: 0, + title: 'Base APR', + description: 'Shown soon', + }, + { + apr: arr[arr.length - 1].strk_grant_apr_nrs * this.SUPPLY_FACTOR, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.Lending, + lending: { + collateralFactor: 0, + }, + borrow: { + borrowFactor: 0, + apr: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } +} + +export const hashstack = new Hashstack(); +const HashstackAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return hashstack._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; +export default HashstackAtoms; diff --git a/src/store/lending.base.ts b/src/store/lending.base.ts index 52f4001..1e4921c 100755 --- a/src/store/lending.base.ts +++ b/src/store/lending.base.ts @@ -1,164 +1,164 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { APRSplit, Category, PoolInfo, PoolMetadata, PoolType } from './pools'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { StrategyAction } from '@/strategies/IStrategy'; - -export namespace LendingSpace { - export interface MyBaseAprDoc { - token: { - decimals: number; - name: string; - symbol: TokenName; - }; - lending_apy: { - net_apy: number; - raw_apy: number; - reward_apy: number; - }; - price: { - decimals: number; - price: string; // "0x554a969a1e", - quote_currency: string; // USD - }; - borrowing_apy: { - net_apy: number; //0.023549914360046387, - raw_apy: number; // 0.023549914360046387, - reward_apy: number; // null - }; - borrow_factor: { - decimals: number; // 27 - value: string; // "0x33b2e3c9fd0803ce8000000" - }; - collateral_factor: { - decimals: number; //27, - value: string; // "0x295be96e640669720000000" - }; - // ... has other data, not relevant - } - - export function computePoolsInfo( - data: any, - incentiveDataKey: string, - info: { - name: string; - link: string; - logo: string; - }, - commonVaultFilter: (poolName: string) => boolean, - ) { - const myData = data[incentiveDataKey]; - if (!myData) return []; - const pools: PoolInfo[] = []; - Object.keys(myData) - .filter(commonVaultFilter) - .forEach((poolName) => { - const arr = myData[poolName]; - if (arr.length === 0) return; - - let category = Category.Others; - if (['USDC', 'USDT'].includes(poolName)) { - category = Category.Stable; - } else if (poolName.includes('STRK')) { - category = Category.STRK; - } - - const logo1 = CONSTANTS.LOGOS[poolName]; - - const poolInfo: PoolInfo = { - pool: { - name: poolName, - logos: [logo1], - }, - protocol: { - name: info.name, - link: info.link, - logo: info.logo, - }, - apr: arr[arr.length - 1].strk_grant_apr_nrs, - tvl: arr[arr.length - 1].supply_usd, - aprSplits: [ - { - apr: arr[arr.length - 1].strk_grant_apr_nrs, - title: 'STRK rewards', - description: 'Starknet DeFi Spring incentives', - }, - ], - category, - type: PoolType.Lending, - borrow: { - apr: 0, - borrowFactor: 0, - }, - lending: { - collateralFactor: 0, - }, - }; - pools.push(poolInfo); - }); - - return pools; - } - - export function getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - let metadata: PoolMetadata | null = null; - if (data.isSuccess) { - const item = data.data.find((doc) => doc.token.symbol === p.pool.name); - if (item) { - baseAPY = item.lending_apy.raw_apy; - splitApr = { - apr: baseAPY, - title: 'Base APY', - description: '', - }; - metadata = { - borrow: { - apr: item.borrowing_apy.net_apy, - borrowFactor: - parseInt(item.borrow_factor.value, 10) / - 10 ** item.borrow_factor.decimals, - }, - lending: { - collateralFactor: - parseInt(item.collateral_factor.value, 10) / - 10 ** item.collateral_factor.decimals, - }, - }; - } - } - return { - baseAPY, - splitApr, - metadata, - }; - } - - export function getHF( - positions: StrategyAction[], - LIQUIDATION_THRESHOLD: number, - ) { - // * HF = Sum(Collateral_usd * col_factor) / Sum(debt_usd/debt_factor); - let numerator = 0; - let denominator = 0; - positions.map((p) => { - // ! TODO To update math using bignumber and decimals - if (p.isDeposit) { - numerator += - Number(p.amount.toString()) * p.pool.lending.collateralFactor; - } else { - denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; - } - }); - - let hf = Number.MAX_SAFE_INTEGER; // if not debt, i.e. denominator 0; - if (denominator !== 0) { - hf = numerator / denominator; - } - - return { hf, isLiquidable: hf <= LIQUIDATION_THRESHOLD }; - } -} +import CONSTANTS, { TokenName } from '@/constants'; +import { APRSplit, Category, PoolInfo, PoolMetadata, PoolType } from './pools'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { StrategyAction } from '@/strategies/IStrategy'; + +export namespace LendingSpace { + export interface MyBaseAprDoc { + token: { + decimals: number; + name: string; + symbol: TokenName; + }; + lending_apy: { + net_apy: number; + raw_apy: number; + reward_apy: number; + }; + price: { + decimals: number; + price: string; // "0x554a969a1e", + quote_currency: string; // USD + }; + borrowing_apy: { + net_apy: number; //0.023549914360046387, + raw_apy: number; // 0.023549914360046387, + reward_apy: number; // null + }; + borrow_factor: { + decimals: number; // 27 + value: string; // "0x33b2e3c9fd0803ce8000000" + }; + collateral_factor: { + decimals: number; //27, + value: string; // "0x295be96e640669720000000" + }; + // ... has other data, not relevant + } + + export function computePoolsInfo( + data: any, + incentiveDataKey: string, + info: { + name: string; + link: string; + logo: string; + }, + commonVaultFilter: (poolName: string) => boolean, + ) { + const myData = data[incentiveDataKey]; + if (!myData) return []; + const pools: PoolInfo[] = []; + Object.keys(myData) + .filter(commonVaultFilter) + .forEach((poolName) => { + const arr = myData[poolName]; + if (arr.length === 0) return; + + let category = Category.Others; + if (['USDC', 'USDT'].includes(poolName)) { + category = Category.Stable; + } else if (poolName.includes('STRK')) { + category = Category.STRK; + } + + const logo1 = CONSTANTS.LOGOS[poolName]; + + const poolInfo: PoolInfo = { + pool: { + name: poolName, + logos: [logo1], + }, + protocol: { + name: info.name, + link: info.link, + logo: info.logo, + }, + apr: arr[arr.length - 1].strk_grant_apr_nrs, + tvl: arr[arr.length - 1].supply_usd, + aprSplits: [ + { + apr: arr[arr.length - 1].strk_grant_apr_nrs, + title: 'STRK rewards', + description: 'Starknet DeFi Spring incentives', + }, + ], + category, + type: PoolType.Lending, + borrow: { + apr: 0, + borrowFactor: 0, + }, + lending: { + collateralFactor: 0, + }, + }; + pools.push(poolInfo); + }); + + return pools; + } + + export function getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + let metadata: PoolMetadata | null = null; + if (data.isSuccess) { + const item = data.data.find((doc) => doc.token.symbol === p.pool.name); + if (item) { + baseAPY = item.lending_apy.raw_apy; + splitApr = { + apr: baseAPY, + title: 'Base APY', + description: '', + }; + metadata = { + borrow: { + apr: item.borrowing_apy.net_apy, + borrowFactor: + parseInt(item.borrow_factor.value, 10) / + 10 ** item.borrow_factor.decimals, + }, + lending: { + collateralFactor: + parseInt(item.collateral_factor.value, 10) / + 10 ** item.collateral_factor.decimals, + }, + }; + } + } + return { + baseAPY, + splitApr, + metadata, + }; + } + + export function getHF( + positions: StrategyAction[], + LIQUIDATION_THRESHOLD: number, + ) { + // * HF = Sum(Collateral_usd * col_factor) / Sum(debt_usd/debt_factor); + let numerator = 0; + let denominator = 0; + positions.map((p) => { + // ! TODO To update math using bignumber and decimals + if (p.isDeposit) { + numerator += + Number(p.amount.toString()) * p.pool.lending.collateralFactor; + } else { + denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; + } + }); + + let hf = Number.MAX_SAFE_INTEGER; // if not debt, i.e. denominator 0; + if (denominator !== 0) { + hf = numerator / denominator; + } + + return { hf, isLiquidable: hf <= LIQUIDATION_THRESHOLD }; + } +} diff --git a/src/store/nimbora.store.ts b/src/store/nimbora.store.ts index 3ad14a0..e98e163 100755 --- a/src/store/nimbora.store.ts +++ b/src/store/nimbora.store.ts @@ -1,45 +1,45 @@ -import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult } from 'jotai-tanstack-query'; -import { LendingSpace } from './lending.base'; -import { IDapp } from './IDapp.store'; - -export class Nimbora extends IDapp { - name = 'Nimbora'; - link = 'https://app.nimbora.io/'; - logo = - 'https://assets-global.website-files.com/64f0518cbb38bb59ddd7a331/64f1ea84a753c1ed93b2c920_faviconn.png'; - - incentiveDataKey = 'Nimbora'; - - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } -} - -export const nimbora = new Nimbora(); -const NimboraAtoms: ProtocolAtoms = { - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (poolsInfo.data) return nimbora._computePoolsInfo(poolsInfo.data); - return empty; - }), -}; -export default NimboraAtoms; +import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult } from 'jotai-tanstack-query'; +import { LendingSpace } from './lending.base'; +import { IDapp } from './IDapp.store'; + +export class Nimbora extends IDapp { + name = 'Nimbora'; + link = 'https://app.nimbora.io/'; + logo = + 'https://assets-global.website-files.com/64f0518cbb38bb59ddd7a331/64f1ea84a753c1ed93b2c920_faviconn.png'; + + incentiveDataKey = 'Nimbora'; + + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } +} + +export const nimbora = new Nimbora(); +const NimboraAtoms: ProtocolAtoms = { + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (poolsInfo.data) return nimbora._computePoolsInfo(poolsInfo.data); + return empty; + }), +}; +export default NimboraAtoms; diff --git a/src/store/nostralending.store.ts b/src/store/nostralending.store.ts index 8159a80..98823e0 100755 --- a/src/store/nostralending.store.ts +++ b/src/store/nostralending.store.ts @@ -1,156 +1,156 @@ -import CONSTANTS, { TokenName } from '@/constants'; -import { - APRSplit, - PoolInfo, - PoolMetadata, - ProtocolAtoms, - StrkLendingIncentivesAtom, -} from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { LendingSpace } from './lending.base'; -import { IDapp } from './IDapp.store'; - -interface MyBaseAprDoc { - _id: string; - id: string; - asset: TokenName; - block: number; - borrowingApy: string; - // borrowingIndex: string, - lendingApy: string; - // "lendingIndex": "1022796136817729881", - timestamp: number; -} - -interface NostraPoolFactor { - asset: string; - dToken: string; - borrowFactor: number; - collateralFactor: number; -} - -// ! to remove hard coding later -const PoolAddresses: { [token: string]: NostraPoolFactor } = { - USDC: { - asset: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', - dToken: - '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', - borrowFactor: 0.95, - collateralFactor: 0.8, - }, - STRK: { - asset: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', - dToken: - '0x001258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947', - borrowFactor: 0.8, - collateralFactor: 0.6, - }, - ETH: { - asset: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', - dToken: - '0x00ba3037d968790ac486f70acaa9a1cab10cf5843bb85c986624b4d0e5a82e74', - borrowFactor: 0.9, - collateralFactor: 0.8, - }, - USDT: { - asset: '0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', - dToken: - '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', - borrowFactor: 0.95, - collateralFactor: 0.8, - }, -}; - -export class NostraLending extends IDapp { - name = 'Nostra Money Markets'; - link = 'https://app.nostra.finance/'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/nostra/logo_dark.jpg'; - - incentiveDataKey = 'Nostra'; - - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { - let baseAPY: number | 'Err' = 'Err'; - let splitApr: APRSplit | null = null; - let metadata: PoolMetadata | null = null; - if (data.isSuccess) { - const items: { - documents: MyBaseAprDoc[]; - } = data.data; - const item = items.documents.find((doc) => doc.asset === p.pool.name); - if (item) { - baseAPY = Number(item.lendingApy) / 10 ** 18; - splitApr = { - apr: baseAPY, - title: 'Base APY', - description: '', - }; - metadata = { - borrow: { - apr: Number(item.borrowingApy) / 10 ** 18, - borrowFactor: PoolAddresses[p.pool.name].borrowFactor, - }, - lending: { - collateralFactor: PoolAddresses[p.pool.name].collateralFactor, - }, - }; - } - } - return { - baseAPY, - splitApr, - metadata, - }; - } -} - -export const nostraLending = new NostraLending(); -const NostraLendingAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['nostra_lending_base_aprs'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.NOSTRA.LENDING_GRAPH_URL, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - dataSource: 'nostra-production', - database: 'prod-a-nostra-db', - collection: 'apyStats', - filter: { timestamp: { $gte: 1697500800 } }, - sort: { timestamp: -1 }, - }), - }); - return res.json(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (!NostraLendingAtoms.baseAPRs) return empty; - - const baseInfo = get(NostraLendingAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = nostraLending._computePoolsInfo(poolsInfo.data); - return nostraLending.addBaseAPYs(pools, baseInfo); - } - return empty; - }), -}; -export default NostraLendingAtoms; +import CONSTANTS, { TokenName } from '@/constants'; +import { + APRSplit, + PoolInfo, + PoolMetadata, + ProtocolAtoms, + StrkLendingIncentivesAtom, +} from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { LendingSpace } from './lending.base'; +import { IDapp } from './IDapp.store'; + +interface MyBaseAprDoc { + _id: string; + id: string; + asset: TokenName; + block: number; + borrowingApy: string; + // borrowingIndex: string, + lendingApy: string; + // "lendingIndex": "1022796136817729881", + timestamp: number; +} + +interface NostraPoolFactor { + asset: string; + dToken: string; + borrowFactor: number; + collateralFactor: number; +} + +// ! to remove hard coding later +const PoolAddresses: { [token: string]: NostraPoolFactor } = { + USDC: { + asset: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', + dToken: + '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', + borrowFactor: 0.95, + collateralFactor: 0.8, + }, + STRK: { + asset: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + dToken: + '0x001258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947', + borrowFactor: 0.8, + collateralFactor: 0.6, + }, + ETH: { + asset: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', + dToken: + '0x00ba3037d968790ac486f70acaa9a1cab10cf5843bb85c986624b4d0e5a82e74', + borrowFactor: 0.9, + collateralFactor: 0.8, + }, + USDT: { + asset: '0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8', + dToken: + '0x024e9b0d6bc79e111e6872bb1ada2a874c25712cf08dfc5bcf0de008a7cca55f', + borrowFactor: 0.95, + collateralFactor: 0.8, + }, +}; + +export class NostraLending extends IDapp { + name = 'Nostra Money Markets'; + link = 'https://app.nostra.finance/'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/nostra/logo_dark.jpg'; + + incentiveDataKey = 'Nostra'; + + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY(p: PoolInfo, data: AtomWithQueryResult) { + let baseAPY: number | 'Err' = 'Err'; + let splitApr: APRSplit | null = null; + let metadata: PoolMetadata | null = null; + if (data.isSuccess) { + const items: { + documents: MyBaseAprDoc[]; + } = data.data; + const item = items.documents.find((doc) => doc.asset === p.pool.name); + if (item) { + baseAPY = Number(item.lendingApy) / 10 ** 18; + splitApr = { + apr: baseAPY, + title: 'Base APY', + description: '', + }; + metadata = { + borrow: { + apr: Number(item.borrowingApy) / 10 ** 18, + borrowFactor: PoolAddresses[p.pool.name].borrowFactor, + }, + lending: { + collateralFactor: PoolAddresses[p.pool.name].collateralFactor, + }, + }; + } + } + return { + baseAPY, + splitApr, + metadata, + }; + } +} + +export const nostraLending = new NostraLending(); +const NostraLendingAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['nostra_lending_base_aprs'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.NOSTRA.LENDING_GRAPH_URL, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + dataSource: 'nostra-production', + database: 'prod-a-nostra-db', + collection: 'apyStats', + filter: { timestamp: { $gte: 1697500800 } }, + sort: { timestamp: -1 }, + }), + }); + return res.json(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (!NostraLendingAtoms.baseAPRs) return empty; + + const baseInfo = get(NostraLendingAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = nostraLending._computePoolsInfo(poolsInfo.data); + return nostraLending.addBaseAPYs(pools, baseInfo); + } + return empty; + }), +}; +export default NostraLendingAtoms; diff --git a/src/store/pools.ts b/src/store/pools.ts index 8858f80..9c9b5d3 100755 --- a/src/store/pools.ts +++ b/src/store/pools.ts @@ -1,271 +1,271 @@ -import CONSTANTS from '@/constants'; -import { Atom, atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import EkuboAtoms, { ekubo } from './ekobu.store'; -import HaikoAtoms, { haiko } from './haiko.store'; -import HashstackAtoms, { hashstack } from './hashstack.store'; -import JediAtoms, { jedi } from './jedi.store'; -import MySwapAtoms, { mySwap } from './myswap.store'; -import NimboraAtoms, { nimbora } from './nimbora.store'; -import NostraDexAtoms, { nostraDex } from './nostradex.store'; -import NostraDegenAtoms, { nostraDegen } from './nostradegen.store'; -import NostraLendingAtoms, { nostraLending } from './nostralending.store'; -import SithswapAtoms, { sithswap } from './sithswap.store'; -import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; -import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; -import ZkLendAtoms, { zkLend } from './zklend.store'; -import CarmineAtoms, { carmine } from './carmine.store'; - -export enum Category { - Stable = 'Stable Pools', - STRK = 'STRK Pools', - Degen = 'MetaStable Pools', - Others = 'Others', -} - -export enum PoolType { - DEXV2 = 'V2 LP DEX', - DEXV3 = 'Concentrated LP DEX', - Lending = 'Lending', - Derivatives = 'Derivatives', -} - -export interface APRSplit { - apr: number | 'Err'; - title: string; - description: string; -} - -export interface PoolMetadata { - borrow: { - apr: number; - borrowFactor: number; - }; - lending: { - collateralFactor: number; - }; -} - -export interface PoolInfo extends PoolMetadata { - pool: { - name: string; - logos: string[]; - }; - protocol: { - name: string; - link: string; - logo: string; - }; - tvl: number; - apr: number; // not in % - aprSplits: APRSplit[]; - category: Category; - type: PoolType; - isLoading?: boolean; -} - -export interface ProtocolAtoms { - pools: Atom; - baseAPRs?: Atom>; -} - -export const PROTOCOLS = [ - { - name: ekubo.name, - class: ekubo, - atoms: EkuboAtoms, - }, - { - name: jedi.name, - 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, - atoms: NostraDexAtoms, - }, - { - name: nostraDegen.name, - class: nostraDegen, - atoms: NostraDegenAtoms, - }, - { - name: carmine.name, - class: carmine, - atoms: CarmineAtoms, - }, - { - name: starkDefi.name, - class: starkDefi, - atoms: StarkDefiAtoms, - }, - { - name: sithswap.name, - 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: nimbora.name, - class: nimbora, - atoms: NimboraAtoms, - }, -]; - -export const StrkDexIncentivesAtom = atomWithQuery((get) => ({ - queryKey: ['strk_dex_incentives'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.DEX_INCENTIVE_URL); // common for all - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }, -})); - -export const StrkIncentivesAtom = atomWithQuery((get) => ({ - queryKey: get(StrkIncentivesQueryKeyAtom), - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.NOSTRA_DEGEN_INCENTIVE_URL); - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - const parsedData = JSON.parse(data); - - if (queryKey[1] === 'isNostraDex') { - // Filter the data to include only the specific nostra dex pools we are tracking - return Object.values(parsedData).filter((item: any) => { - const id = item.id; - return id === 'ETH-USDC' || id === 'STRK-ETH' || id === 'STRK-USDC'; - }); - } - return parsedData; - }, -})); - -export const StrkIncentivesQueryKeyAtom = atom([ - 'strk_incentives', - 'isNostraDegen', -]); - -export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ - queryKey: ['strk_lending_incentives'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.LENDING_INCENTIVES_URL); // common for all - let data = await res.text(); - data = data.replaceAll('NaN', '0'); - return JSON.parse(data); - }, -})); - -export const ALL_FILTER = 'All'; -export const filters = { - categories: [...Object.values(Category)], - types: [...Object.values(PoolType)], - protocols: [...PROTOCOLS.map((p) => p.name)], -}; - -export const filterAtoms = { - categoriesAtom: atom([ALL_FILTER]), - typesAtom: atom([ALL_FILTER]), - protocolsAtom: atom([ALL_FILTER]), -}; - -export const updateFiltersAtom = atom( - null, - ( - get, - set, - type: 'categories' | 'poolTypes' | 'protocols', - newOptions: string[], - ) => { - if (type === 'categories') { - set(filterAtoms.categoriesAtom, newOptions); - } else if (type === 'poolTypes') { - set(filterAtoms.typesAtom, newOptions); - } else if (type === 'protocols') { - set(filterAtoms.protocolsAtom, newOptions); - } - }, -); - -export const allPoolsAtomUnSorted = atom((get) => { - const pools: PoolInfo[] = []; - return PROTOCOLS.reduce( - (_pools, p) => _pools.concat(get(p.atoms.pools)), - pools, - ); -}); - -// const allPoolsAtom = atom([]); - -const SORT_OPTIONS = ['APR', 'TVL']; - -export const sortAtom = atom(SORT_OPTIONS[0]); - -export const sortPoolsAtom = atom((get) => { - const pools = get(allPoolsAtomUnSorted); - console.log('pre sort', pools); - const sortOption = get(sortAtom); - pools.sort((a, b) => { - if (sortOption === SORT_OPTIONS[1]) { - return b.tvl - a.tvl; - } - return b.apr - a.apr; - }); - return pools; -}); - -export const filteredPools = atom((get) => { - const pools = get(sortPoolsAtom); - const categories = get(filterAtoms.categoriesAtom); - const types = get(filterAtoms.typesAtom); - const protocols = get(filterAtoms.protocolsAtom); - return pools - .filter((pool) => { - // category filter - if (categories.includes(ALL_FILTER)) return true; - if (categories.includes(pool.category.valueOf())) return true; - return false; - }) - .filter((pool) => { - // type filter - if (types.includes(ALL_FILTER)) return true; - if (types.includes(pool.type.valueOf())) return true; - return false; - }) - .filter((pool) => { - // protocol filter - if (protocols.includes(ALL_FILTER)) return true; - if (protocols.includes(pool.protocol.name)) return true; - return false; - }); -}); +import CONSTANTS from '@/constants'; +import { Atom, atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import EkuboAtoms, { ekubo } from './ekobu.store'; +import HaikoAtoms, { haiko } from './haiko.store'; +import HashstackAtoms, { hashstack } from './hashstack.store'; +import JediAtoms, { jedi } from './jedi.store'; +import MySwapAtoms, { mySwap } from './myswap.store'; +import NimboraAtoms, { nimbora } from './nimbora.store'; +import NostraDexAtoms, { nostraDex } from './nostradex.store'; +import NostraDegenAtoms, { nostraDegen } from './nostradegen.store'; +import NostraLendingAtoms, { nostraLending } from './nostralending.store'; +import SithswapAtoms, { sithswap } from './sithswap.store'; +import StarkDefiAtoms, { starkDefi } from './starkdefi.store'; +import TenkSwapAtoms, { tenkswap } from './tenkswap.store'; +import ZkLendAtoms, { zkLend } from './zklend.store'; +import CarmineAtoms, { carmine } from './carmine.store'; + +export enum Category { + Stable = 'Stable Pools', + STRK = 'STRK Pools', + Degen = 'MetaStable Pools', + Others = 'Others', +} + +export enum PoolType { + DEXV2 = 'V2 LP DEX', + DEXV3 = 'Concentrated LP DEX', + Lending = 'Lending', + Derivatives = 'Derivatives', +} + +export interface APRSplit { + apr: number | 'Err'; + title: string; + description: string; +} + +export interface PoolMetadata { + borrow: { + apr: number; + borrowFactor: number; + }; + lending: { + collateralFactor: number; + }; +} + +export interface PoolInfo extends PoolMetadata { + pool: { + name: string; + logos: string[]; + }; + protocol: { + name: string; + link: string; + logo: string; + }; + tvl: number; + apr: number; // not in % + aprSplits: APRSplit[]; + category: Category; + type: PoolType; + isLoading?: boolean; +} + +export interface ProtocolAtoms { + pools: Atom; + baseAPRs?: Atom>; +} + +export const PROTOCOLS = [ + { + name: ekubo.name, + class: ekubo, + atoms: EkuboAtoms, + }, + { + name: jedi.name, + 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, + atoms: NostraDexAtoms, + }, + { + name: nostraDegen.name, + class: nostraDegen, + atoms: NostraDegenAtoms, + }, + { + name: carmine.name, + class: carmine, + atoms: CarmineAtoms, + }, + { + name: starkDefi.name, + class: starkDefi, + atoms: StarkDefiAtoms, + }, + { + name: sithswap.name, + 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: nimbora.name, + class: nimbora, + atoms: NimboraAtoms, + }, +]; + +export const StrkDexIncentivesAtom = atomWithQuery((get) => ({ + queryKey: ['strk_dex_incentives'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.DEX_INCENTIVE_URL); // common for all + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }, +})); + +export const StrkIncentivesAtom = atomWithQuery((get) => ({ + queryKey: get(StrkIncentivesQueryKeyAtom), + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.NOSTRA_DEGEN_INCENTIVE_URL); + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + const parsedData = JSON.parse(data); + + if (queryKey[1] === 'isNostraDex') { + // Filter the data to include only the specific nostra dex pools we are tracking + return Object.values(parsedData).filter((item: any) => { + const id = item.id; + return id === 'ETH-USDC' || id === 'STRK-ETH' || id === 'STRK-USDC'; + }); + } + return parsedData; + }, +})); + +export const StrkIncentivesQueryKeyAtom = atom([ + 'strk_incentives', + 'isNostraDegen', +]); + +export const StrkLendingIncentivesAtom = atomWithQuery((get) => ({ + queryKey: ['strk_lending_incentives'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.LENDING_INCENTIVES_URL); // common for all + let data = await res.text(); + data = data.replaceAll('NaN', '0'); + return JSON.parse(data); + }, +})); + +export const ALL_FILTER = 'All'; +export const filters = { + categories: [...Object.values(Category)], + types: [...Object.values(PoolType)], + protocols: [...PROTOCOLS.map((p) => p.name)], +}; + +export const filterAtoms = { + categoriesAtom: atom([ALL_FILTER]), + typesAtom: atom([ALL_FILTER]), + protocolsAtom: atom([ALL_FILTER]), +}; + +export const updateFiltersAtom = atom( + null, + ( + get, + set, + type: 'categories' | 'poolTypes' | 'protocols', + newOptions: string[], + ) => { + if (type === 'categories') { + set(filterAtoms.categoriesAtom, newOptions); + } else if (type === 'poolTypes') { + set(filterAtoms.typesAtom, newOptions); + } else if (type === 'protocols') { + set(filterAtoms.protocolsAtom, newOptions); + } + }, +); + +export const allPoolsAtomUnSorted = atom((get) => { + const pools: PoolInfo[] = []; + return PROTOCOLS.reduce( + (_pools, p) => _pools.concat(get(p.atoms.pools)), + pools, + ); +}); + +// const allPoolsAtom = atom([]); + +const SORT_OPTIONS = ['APR', 'TVL']; + +export const sortAtom = atom(SORT_OPTIONS[0]); + +export const sortPoolsAtom = atom((get) => { + const pools = get(allPoolsAtomUnSorted); + console.log('pre sort', pools); + const sortOption = get(sortAtom); + pools.sort((a, b) => { + if (sortOption === SORT_OPTIONS[1]) { + return b.tvl - a.tvl; + } + return b.apr - a.apr; + }); + return pools; +}); + +export const filteredPools = atom((get) => { + const pools = get(sortPoolsAtom); + const categories = get(filterAtoms.categoriesAtom); + const types = get(filterAtoms.typesAtom); + const protocols = get(filterAtoms.protocolsAtom); + return pools + .filter((pool) => { + // category filter + if (categories.includes(ALL_FILTER)) return true; + if (categories.includes(pool.category.valueOf())) return true; + return false; + }) + .filter((pool) => { + // type filter + if (types.includes(ALL_FILTER)) return true; + if (types.includes(pool.type.valueOf())) return true; + return false; + }) + .filter((pool) => { + // protocol filter + if (protocols.includes(ALL_FILTER)) return true; + if (protocols.includes(pool.protocol.name)) return true; + return false; + }); +}); diff --git a/src/store/strategies.atoms.ts b/src/store/strategies.atoms.ts index c507435..0b07017 100755 --- a/src/store/strategies.atoms.ts +++ b/src/store/strategies.atoms.ts @@ -1,126 +1,126 @@ -import { atom } from 'jotai'; -import { allPoolsAtomUnSorted } from './pools'; -import { AutoTokenStrategy } from '@/strategies/auto_strk.strat'; -import { - IStrategy, - IStrategyProps, - StrategyLiveStatus, -} from '@/strategies/IStrategy'; -import CONSTANTS from '@/constants'; -import { DeltaNeutralMM } from '@/strategies/delta_neutral_mm'; -import Mustache from 'mustache'; -import { getTokenInfoFromName } from '@/utils'; - -export interface StrategyInfo extends IStrategyProps { - name: string; -} - -export function getStrategies() { - // const simpleStableStrat = new SimpleStableStrategy(); - const autoStrkStrategy = new AutoTokenStrategy( - 'STRK', - 'Auto Compounding STRK', - "Stake your STRK or zkLend's zSTRK token to receive DeFi Spring $STRK rewards every 14 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.", - 'zSTRK', - CONSTANTS.CONTRACTS.AutoStrkFarm, - { - maxTVL: 50000, - }, - ); - const autoUSDCStrategy = new AutoTokenStrategy( - 'USDC', - 'Auto Compounding USDC', - "Stake your USDC or zkLend's zUSDC token to receive DeFi Spring $STRK rewards every 14 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.", - 'zUSDC', - CONSTANTS.CONTRACTS.AutoUsdcFarm, - { - maxTVL: 50000, - }, - ); - - 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 usdcTokenInfo = getTokenInfoFromName('USDC'); - const deltaNeutralMMUSDCETH = new DeltaNeutralMM( - usdcTokenInfo, - 'USDC Sensei', - Mustache.render(DNMMDescription, { token1: 'USDC', token2: 'ETH' }), - 'ETH', - CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - [1, 0.615384615, 1, 0.584615385, 0.552509024], // precomputed factors based on strategy math - StrategyLiveStatus.NEW, - { - maxTVL: 50000, - }, - ); - - const deltaNeutralMMETHUSDC = new DeltaNeutralMM( - getTokenInfoFromName('ETH'), - 'ETH Sensei', - Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }), - 'USDC', - // ! change this later - CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, - [1, 0.608, 1, 0.552509, 0.552509], // precomputed factors based on strategy math - StrategyLiveStatus.COMING_SOON, - { - maxTVL: 50000, - }, - ); - const deltaNeutralMMSTRKETH = new DeltaNeutralMM( - getTokenInfoFromName('STRK'), - 'STRK Sensei', - Mustache.render(DNMMDescription, { token1: 'STRK', token2: 'ETH' }), - 'ETH', - // ! change this later - 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 - StrategyLiveStatus.NEW, - { - maxTVL: 250000, - }, - ); - - const strategies: IStrategy[] = [ - autoStrkStrategy, - autoUSDCStrategy, - deltaNeutralMMUSDCETH, - deltaNeutralMMETHUSDC, - deltaNeutralMMSTRKETH, - ]; - - return strategies; -} - -export const STRATEGIES_INFO = getStrategies(); - -export const strategiesAtom = atom((get) => { - const strategies = getStrategies(); - const allPools = get(allPoolsAtomUnSorted); - const filteredPools = allPools.filter( - (p) => - p.protocol.name === 'zkLend' || - p.protocol.name === 'Nostra Money Markets', - ); - - for (const s of strategies) { - s.solve(filteredPools, '1000'); - } - - strategies.sort((a, b) => { - const status1 = getLiveStatusNumber(a.liveStatus); - const status2 = getLiveStatusNumber(b.liveStatus); - return status1 - status2 || b.netYield - a.netYield; - }); - return strategies; -}); - -function getLiveStatusNumber(status: StrategyLiveStatus) { - if (status == StrategyLiveStatus.NEW) { - return 1; - } else if (status == StrategyLiveStatus.ACTIVE) { - return 2; - } else if (status == StrategyLiveStatus.COMING_SOON) { - return 3; - } - return 4; -} +import { atom } from 'jotai'; +import { allPoolsAtomUnSorted } from './pools'; +import { AutoTokenStrategy } from '@/strategies/auto_strk.strat'; +import { + IStrategy, + IStrategyProps, + StrategyLiveStatus, +} from '@/strategies/IStrategy'; +import CONSTANTS from '@/constants'; +import { DeltaNeutralMM } from '@/strategies/delta_neutral_mm'; +import Mustache from 'mustache'; +import { getTokenInfoFromName } from '@/utils'; + +export interface StrategyInfo extends IStrategyProps { + name: string; +} + +export function getStrategies() { + // const simpleStableStrat = new SimpleStableStrategy(); + const autoStrkStrategy = new AutoTokenStrategy( + 'STRK', + 'Auto Compounding STRK', + "Stake your STRK or zkLend's zSTRK token to receive DeFi Spring $STRK rewards every 14 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.", + 'zSTRK', + CONSTANTS.CONTRACTS.AutoStrkFarm, + { + maxTVL: 50000, + }, + ); + const autoUSDCStrategy = new AutoTokenStrategy( + 'USDC', + 'Auto Compounding USDC', + "Stake your USDC or zkLend's zUSDC token to receive DeFi Spring $STRK rewards every 14 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.", + 'zUSDC', + CONSTANTS.CONTRACTS.AutoUsdcFarm, + { + maxTVL: 50000, + }, + ); + + 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 usdcTokenInfo = getTokenInfoFromName('USDC'); + const deltaNeutralMMUSDCETH = new DeltaNeutralMM( + usdcTokenInfo, + 'USDC Sensei', + Mustache.render(DNMMDescription, { token1: 'USDC', token2: 'ETH' }), + 'ETH', + CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + [1, 0.615384615, 1, 0.584615385, 0.552509024], // precomputed factors based on strategy math + StrategyLiveStatus.NEW, + { + maxTVL: 50000, + }, + ); + + const deltaNeutralMMETHUSDC = new DeltaNeutralMM( + getTokenInfoFromName('ETH'), + 'ETH Sensei', + Mustache.render(DNMMDescription, { token1: 'ETH', token2: 'USDC' }), + 'USDC', + // ! change this later + CONSTANTS.CONTRACTS.DeltaNeutralMMUSDCETH, + [1, 0.608, 1, 0.552509, 0.552509], // precomputed factors based on strategy math + StrategyLiveStatus.COMING_SOON, + { + maxTVL: 50000, + }, + ); + const deltaNeutralMMSTRKETH = new DeltaNeutralMM( + getTokenInfoFromName('STRK'), + 'STRK Sensei', + Mustache.render(DNMMDescription, { token1: 'STRK', token2: 'ETH' }), + 'ETH', + // ! change this later + 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 + StrategyLiveStatus.NEW, + { + maxTVL: 250000, + }, + ); + + const strategies: IStrategy[] = [ + autoStrkStrategy, + autoUSDCStrategy, + deltaNeutralMMUSDCETH, + deltaNeutralMMETHUSDC, + deltaNeutralMMSTRKETH, + ]; + + return strategies; +} + +export const STRATEGIES_INFO = getStrategies(); + +export const strategiesAtom = atom((get) => { + const strategies = getStrategies(); + const allPools = get(allPoolsAtomUnSorted); + const filteredPools = allPools.filter( + (p) => + p.protocol.name === 'zkLend' || + p.protocol.name === 'Nostra Money Markets', + ); + + for (const s of strategies) { + s.solve(filteredPools, '1000'); + } + + strategies.sort((a, b) => { + const status1 = getLiveStatusNumber(a.liveStatus); + const status2 = getLiveStatusNumber(b.liveStatus); + return status1 - status2 || b.netYield - a.netYield; + }); + return strategies; +}); + +function getLiveStatusNumber(status: StrategyLiveStatus) { + if (status == StrategyLiveStatus.NEW) { + return 1; + } else if (status == StrategyLiveStatus.ACTIVE) { + return 2; + } else if (status == StrategyLiveStatus.COMING_SOON) { + return 3; + } + return 4; +} diff --git a/src/store/zklend.store.ts b/src/store/zklend.store.ts index deb87c9..043aaae 100755 --- a/src/store/zklend.store.ts +++ b/src/store/zklend.store.ts @@ -1,90 +1,90 @@ -'use client'; - -import CONSTANTS from '@/constants'; -import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; -import { atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { IDapp } from './IDapp.store'; -import { StrategyAction } from '@/strategies/IStrategy'; -import { LendingSpace } from './lending.base'; -const fetcher = (...args: any[]) => { - return fetch(args[0], args[1]).then((res) => res.json()); -}; - -export class ZkLend extends IDapp { - name = 'zkLend'; - link = 'https://app.zklend.com/markets'; - logo = - 'https://static-assets-8zct.onrender.com/integrations/zkLend/logo_dark.png'; - - incentiveDataKey = 'zkLend'; - LIQUIDATION_THRESHOLD = 1; - _computePoolsInfo(data: any) { - return LendingSpace.computePoolsInfo( - data, - this.incentiveDataKey, - { - name: this.name, - link: this.link, - logo: this.logo, - }, - this.commonVaultFilter, - ); - } - - getBaseAPY( - p: PoolInfo, - data: AtomWithQueryResult, - ) { - return LendingSpace.getBaseAPY(p, data); - } - - // ! To consider price of tokens later. used for stables only for now. - getHF(positions: StrategyAction[]) { - return LendingSpace.getHF(positions, this.LIQUIDATION_THRESHOLD); - } - - // Returns the maximum debt that can be taken out incl. the factor. - getMaxFactoredOut(positions: StrategyAction[], minHf: number) { - let numerator = 0; - let denominator = 0; - positions.map((p) => { - // ! TODO To update math using bignumber and decimals - if (p.isDeposit) { - numerator += - Number(p.amount.toString()) * p.pool.lending.collateralFactor; - } else { - denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; - } - }); - - // HF = (numerator) / (denominator + factoredAmount) - // whre factoredAmount = (Amount of new Debt / debt factor) - const factoredAmount = numerator / minHf - denominator; - if (factoredAmount < 0) return 0; - return factoredAmount; - } -} - -export const zkLend = new ZkLend(); -const ZkLendAtoms: ProtocolAtoms = { - baseAPRs: atomWithQuery((get) => ({ - queryKey: ['zklend_lending_base_aprs'], - queryFn: async ({ queryKey }) => { - const res = await fetch(CONSTANTS.ZKLEND.BASE_APR_API); - return res.json(); - }, - })), - pools: atom((get) => { - const poolsInfo = get(StrkLendingIncentivesAtom); - const empty: PoolInfo[] = []; - if (!ZkLendAtoms.baseAPRs) return empty; - const baseInfo = get(ZkLendAtoms.baseAPRs); - if (poolsInfo.data) { - const pools = zkLend._computePoolsInfo(poolsInfo.data); - return zkLend.addBaseAPYs(pools, baseInfo); - } - return empty; - }), -}; -export default ZkLendAtoms; +'use client'; + +import CONSTANTS from '@/constants'; +import { PoolInfo, ProtocolAtoms, StrkLendingIncentivesAtom } from './pools'; +import { atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { IDapp } from './IDapp.store'; +import { StrategyAction } from '@/strategies/IStrategy'; +import { LendingSpace } from './lending.base'; +const fetcher = (...args: any[]) => { + return fetch(args[0], args[1]).then((res) => res.json()); +}; + +export class ZkLend extends IDapp { + name = 'zkLend'; + link = 'https://app.zklend.com/markets'; + logo = + 'https://static-assets-8zct.onrender.com/integrations/zkLend/logo_dark.png'; + + incentiveDataKey = 'zkLend'; + LIQUIDATION_THRESHOLD = 1; + _computePoolsInfo(data: any) { + return LendingSpace.computePoolsInfo( + data, + this.incentiveDataKey, + { + name: this.name, + link: this.link, + logo: this.logo, + }, + this.commonVaultFilter, + ); + } + + getBaseAPY( + p: PoolInfo, + data: AtomWithQueryResult, + ) { + return LendingSpace.getBaseAPY(p, data); + } + + // ! To consider price of tokens later. used for stables only for now. + getHF(positions: StrategyAction[]) { + return LendingSpace.getHF(positions, this.LIQUIDATION_THRESHOLD); + } + + // Returns the maximum debt that can be taken out incl. the factor. + getMaxFactoredOut(positions: StrategyAction[], minHf: number) { + let numerator = 0; + let denominator = 0; + positions.map((p) => { + // ! TODO To update math using bignumber and decimals + if (p.isDeposit) { + numerator += + Number(p.amount.toString()) * p.pool.lending.collateralFactor; + } else { + denominator += Number(p.amount.toString()) / p.pool.borrow.borrowFactor; + } + }); + + // HF = (numerator) / (denominator + factoredAmount) + // whre factoredAmount = (Amount of new Debt / debt factor) + const factoredAmount = numerator / minHf - denominator; + if (factoredAmount < 0) return 0; + return factoredAmount; + } +} + +export const zkLend = new ZkLend(); +const ZkLendAtoms: ProtocolAtoms = { + baseAPRs: atomWithQuery((get) => ({ + queryKey: ['zklend_lending_base_aprs'], + queryFn: async ({ queryKey }) => { + const res = await fetch(CONSTANTS.ZKLEND.BASE_APR_API); + return res.json(); + }, + })), + pools: atom((get) => { + const poolsInfo = get(StrkLendingIncentivesAtom); + const empty: PoolInfo[] = []; + if (!ZkLendAtoms.baseAPRs) return empty; + const baseInfo = get(ZkLendAtoms.baseAPRs); + if (poolsInfo.data) { + const pools = zkLend._computePoolsInfo(poolsInfo.data); + return zkLend.addBaseAPYs(pools, baseInfo); + } + return empty; + }), +}; +export default ZkLendAtoms; diff --git a/src/strategies/IStrategy.ts b/src/strategies/IStrategy.ts index 4c94ed1..1b82315 100755 --- a/src/strategies/IStrategy.ts +++ b/src/strategies/IStrategy.ts @@ -1,330 +1,330 @@ -import { IDapp } from '@/store/IDapp.store'; -import { BalanceResult, getBalanceAtom } from '@/store/balance.atoms'; -import { Category, PoolInfo } from '@/store/pools'; -import { zkLend } from '@/store/zklend.store'; -import MyNumber from '@/utils/MyNumber'; -import { Atom, atom } from 'jotai'; -import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; -import { Call, ProviderInterface } from 'starknet'; - -interface Step { - name: string; - optimizer: ( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => StrategyAction[]; - filter: (( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => PoolInfo[])[]; -} - -export interface TokenInfo { - token: string; - decimals: number; - displayDecimals: number; - name: string; - logo: any; - minAmount: MyNumber; - maxAmount: MyNumber; - stepAmount: MyNumber; - ekuboPriceKey?: string; - isERC4626: boolean; -} - -export interface NFTInfo { - name: string; - address: string; - logo: any; - config: { - mainTokenName: string; - }; -} - -export interface StrategyAction { - pool: PoolInfo; - amount: string; - isDeposit: boolean; - name?: string; -} - -export enum StrategyStatus { - UNINTIALISED = 0, - SOLVING = 1, - SOLVED = 2, -} - -export enum StrategyLiveStatus { - ACTIVE = 'Active', - NEW = 'New', - COMING_SOON = 'Coming Soon', - RETIRED = 'Retired', -} - -export interface IStrategyActionHook { - tokenInfo: TokenInfo; - calls: Call[]; - balanceAtom: Atom>; -} - -export interface IStrategySettings { - maxTVL: number; -} - -export interface AmountInfo { - amount: MyNumber; - usdValue: number; - tokenInfo: TokenInfo; -} - -export class IStrategyProps { - readonly liveStatus: StrategyLiveStatus; - readonly id: string; - readonly name: string; - readonly description: string; - readonly settings: IStrategySettings; - exchanges: IDapp[] = []; - - steps: Step[] = []; - - actions: StrategyAction[] = []; - netYield: number = 0; - leverage: number = 0; - status = StrategyStatus.UNINTIALISED; - - readonly rewardTokens: { logo: string }[]; - readonly holdingTokens: (TokenInfo | NFTInfo)[]; - - balEnabled = atom(false); - readonly balanceAtom: Atom>; - readonly tvlAtom: Atom>; - - risks: string[] = [ - 'The strategy involves exposure to smart contracts, which inherently carry risks like hacks, albeit relatively low', - 'APYs shown are just indicative and do not promise exact returns', - ]; - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ): IStrategyActionHook[] => { - return []; - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ): IStrategyActionHook[] => { - return []; - }; - - getTVL = async (): Promise => { - throw new Error('getTVL: Not implemented'); - }; - - getUserTVL = async (user: string): Promise => { - throw new Error('getTVL: Not implemented'); - }; - - isLive() { - return ( - this.liveStatus == StrategyLiveStatus.ACTIVE || - this.liveStatus == StrategyLiveStatus.NEW - ); - } - - constructor( - id: string, - name: string, - description: string, - rewardTokens: { logo: string }[], - holdingTokens: (TokenInfo | NFTInfo)[], - liveStatus: StrategyLiveStatus, - settings: IStrategySettings, - ) { - this.id = id; - this.name = name; - this.description = description; - this.rewardTokens = rewardTokens; - this.holdingTokens = holdingTokens; - console.log('calling getBalanceAtom', id, holdingTokens[0]); - this.balanceAtom = getBalanceAtom(holdingTokens[0], this.balEnabled); - this.liveStatus = liveStatus; - this.settings = settings; - this.tvlAtom = atomWithQuery((get) => { - return { - queryKey: ['tvl', this.id], - queryFn: async ({ queryKey }: any): Promise => { - return this.getTVL(); - }, - refetchInterval: 15000, - }; - }); - } -} - -export class IStrategy extends IStrategyProps { - readonly tag: string; - - constructor( - id: string, - tag: string, - name: string, - description: string, - rewardTokens: { logo: string }[], - holdingTokens: (TokenInfo | NFTInfo)[], - liveStatus = StrategyLiveStatus.ACTIVE, - settings: IStrategySettings, - ) { - super( - id, - name, - description, - rewardTokens, - holdingTokens, - liveStatus, - settings, - ); - this.tag = tag; - } - - filterStablesOnly( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const eligiblePools = pools.filter((p) => p.category == Category.Stable); - if (!eligiblePools) throw new Error(`${this.tag}: [F1] no eligible pools`); - return eligiblePools; - } - - filterSameProtocolNotSameDepositPool( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - if (prevActions.length == 0) - throw new Error( - `${this.tag}: filterSameProtocolNotSameDepositPool - Prev actions zero`, - ); - const lastAction = prevActions[prevActions.length - 1]; - const eligiblePools = pools - .filter((p) => p.protocol.name == lastAction.pool.protocol.name) - .filter((p) => { - return p.pool.name != lastAction.pool.pool.name; - }); - - if (!eligiblePools) throw new Error(`${this.tag}: [F2] no eligible pools`); - return eligiblePools; - } - - filterNotSameProtocolSameDepositPool( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - if (prevActions.length == 0) - throw new Error( - `${this.tag}: filterNotSameProtocolSameDepositPool - Prev actions zero`, - ); - const lastAction = prevActions[prevActions.length - 1]; - const eligiblePools = pools - .filter((p) => p.protocol.name != lastAction.pool.protocol.name) - .filter((p) => { - return p.pool.name == lastAction.pool.pool.name; - }); - - if (!eligiblePools) throw new Error(`${this.tag}: [F3] no eligible pools`); - return eligiblePools; - } - - filterStrkzkLend( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - return pools.filter( - (p) => p.pool.name == 'STRK' && p.protocol.name == zkLend.name, - ); - } - - optimizerDeposit( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ) { - let bestPool: PoolInfo = eligiblePools[0]; - eligiblePools.forEach((p) => { - if (p.apr > bestPool.apr) { - bestPool = p; - } - }); - return [...actions, { pool: bestPool, amount, isDeposit: true }]; - } - - solve(pools: PoolInfo[], amount: string) { - this.actions = []; - let _amount: string = amount; - let netYield = 0; - this.status = StrategyStatus.SOLVING; - try { - for (let i = 0; i < this.steps.length; ++i) { - const step = this.steps[i]; - let _pools = [...pools]; - for (let j = 0; j < step.filter.length; ++j) { - const filter = step.filter[j]; - _pools = filter.bind(this)(_pools, amount, this.actions); - } - - console.log('solve', i, _pools, pools.length, this.actions, _amount); - - if (_pools.length > 0) { - this.actions = step.optimizer.bind(this)( - _pools, - _amount, - this.actions, - ); - if (this.actions.length != i + 1) { - console.warn(`actions`, this.actions.length, 'i', i); - throw new Error('one new action per step required'); - } - this.actions[i].name = step.name; - _amount = this.actions[this.actions.length - 1].amount; - } else { - throw new Error('no pools to continue computing strategy'); - } - } - } catch (err) { - console.warn(`${this.tag} - unsolved`, err); - return; - } - - this.actions.forEach((action) => { - const sign = action.isDeposit ? 1 : -1; - const apr = action.isDeposit ? action.pool.apr : action.pool.borrow.apr; - netYield += sign * apr * Number(action.amount); - console.log('netYield1', sign, apr, action.amount, netYield); - }); - this.netYield = netYield / Number(amount); - console.log('netYield', netYield, this.netYield); - this.leverage = this.netYield / this.actions[0].pool.apr; - - this.postSolve(); - - this.status = StrategyStatus.SOLVED; - } - - postSolve() {} - - isSolved() { - return this.status === StrategyStatus.SOLVED; - } - - isSolving() { - return this.status === StrategyStatus.SOLVING; - } -} +import { IDapp } from '@/store/IDapp.store'; +import { BalanceResult, getBalanceAtom } from '@/store/balance.atoms'; +import { Category, PoolInfo } from '@/store/pools'; +import { zkLend } from '@/store/zklend.store'; +import MyNumber from '@/utils/MyNumber'; +import { Atom, atom } from 'jotai'; +import { AtomWithQueryResult, atomWithQuery } from 'jotai-tanstack-query'; +import { Call, ProviderInterface } from 'starknet'; + +interface Step { + name: string; + optimizer: ( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => StrategyAction[]; + filter: (( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => PoolInfo[])[]; +} + +export interface TokenInfo { + token: string; + decimals: number; + displayDecimals: number; + name: string; + logo: any; + minAmount: MyNumber; + maxAmount: MyNumber; + stepAmount: MyNumber; + ekuboPriceKey?: string; + isERC4626: boolean; +} + +export interface NFTInfo { + name: string; + address: string; + logo: any; + config: { + mainTokenName: string; + }; +} + +export interface StrategyAction { + pool: PoolInfo; + amount: string; + isDeposit: boolean; + name?: string; +} + +export enum StrategyStatus { + UNINTIALISED = 0, + SOLVING = 1, + SOLVED = 2, +} + +export enum StrategyLiveStatus { + ACTIVE = 'Active', + NEW = 'New', + COMING_SOON = 'Coming Soon', + RETIRED = 'Retired', +} + +export interface IStrategyActionHook { + tokenInfo: TokenInfo; + calls: Call[]; + balanceAtom: Atom>; +} + +export interface IStrategySettings { + maxTVL: number; +} + +export interface AmountInfo { + amount: MyNumber; + usdValue: number; + tokenInfo: TokenInfo; +} + +export class IStrategyProps { + readonly liveStatus: StrategyLiveStatus; + readonly id: string; + readonly name: string; + readonly description: string; + readonly settings: IStrategySettings; + exchanges: IDapp[] = []; + + steps: Step[] = []; + + actions: StrategyAction[] = []; + netYield: number = 0; + leverage: number = 0; + status = StrategyStatus.UNINTIALISED; + + readonly rewardTokens: { logo: string }[]; + readonly holdingTokens: (TokenInfo | NFTInfo)[]; + + balEnabled = atom(false); + readonly balanceAtom: Atom>; + readonly tvlAtom: Atom>; + + risks: string[] = [ + 'The strategy involves exposure to smart contracts, which inherently carry risks like hacks, albeit relatively low', + 'APYs shown are just indicative and do not promise exact returns', + ]; + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ): IStrategyActionHook[] => { + return []; + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ): IStrategyActionHook[] => { + return []; + }; + + getTVL = async (): Promise => { + throw new Error('getTVL: Not implemented'); + }; + + getUserTVL = async (user: string): Promise => { + throw new Error('getTVL: Not implemented'); + }; + + isLive() { + return ( + this.liveStatus == StrategyLiveStatus.ACTIVE || + this.liveStatus == StrategyLiveStatus.NEW + ); + } + + constructor( + id: string, + name: string, + description: string, + rewardTokens: { logo: string }[], + holdingTokens: (TokenInfo | NFTInfo)[], + liveStatus: StrategyLiveStatus, + settings: IStrategySettings, + ) { + this.id = id; + this.name = name; + this.description = description; + this.rewardTokens = rewardTokens; + this.holdingTokens = holdingTokens; + console.log('calling getBalanceAtom', id, holdingTokens[0]); + this.balanceAtom = getBalanceAtom(holdingTokens[0], this.balEnabled); + this.liveStatus = liveStatus; + this.settings = settings; + this.tvlAtom = atomWithQuery((get) => { + return { + queryKey: ['tvl', this.id], + queryFn: async ({ queryKey }: any): Promise => { + return this.getTVL(); + }, + refetchInterval: 15000, + }; + }); + } +} + +export class IStrategy extends IStrategyProps { + readonly tag: string; + + constructor( + id: string, + tag: string, + name: string, + description: string, + rewardTokens: { logo: string }[], + holdingTokens: (TokenInfo | NFTInfo)[], + liveStatus = StrategyLiveStatus.ACTIVE, + settings: IStrategySettings, + ) { + super( + id, + name, + description, + rewardTokens, + holdingTokens, + liveStatus, + settings, + ); + this.tag = tag; + } + + filterStablesOnly( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const eligiblePools = pools.filter((p) => p.category == Category.Stable); + if (!eligiblePools) throw new Error(`${this.tag}: [F1] no eligible pools`); + return eligiblePools; + } + + filterSameProtocolNotSameDepositPool( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + if (prevActions.length == 0) + throw new Error( + `${this.tag}: filterSameProtocolNotSameDepositPool - Prev actions zero`, + ); + const lastAction = prevActions[prevActions.length - 1]; + const eligiblePools = pools + .filter((p) => p.protocol.name == lastAction.pool.protocol.name) + .filter((p) => { + return p.pool.name != lastAction.pool.pool.name; + }); + + if (!eligiblePools) throw new Error(`${this.tag}: [F2] no eligible pools`); + return eligiblePools; + } + + filterNotSameProtocolSameDepositPool( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + if (prevActions.length == 0) + throw new Error( + `${this.tag}: filterNotSameProtocolSameDepositPool - Prev actions zero`, + ); + const lastAction = prevActions[prevActions.length - 1]; + const eligiblePools = pools + .filter((p) => p.protocol.name != lastAction.pool.protocol.name) + .filter((p) => { + return p.pool.name == lastAction.pool.pool.name; + }); + + if (!eligiblePools) throw new Error(`${this.tag}: [F3] no eligible pools`); + return eligiblePools; + } + + filterStrkzkLend( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + return pools.filter( + (p) => p.pool.name == 'STRK' && p.protocol.name == zkLend.name, + ); + } + + optimizerDeposit( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ) { + let bestPool: PoolInfo = eligiblePools[0]; + eligiblePools.forEach((p) => { + if (p.apr > bestPool.apr) { + bestPool = p; + } + }); + return [...actions, { pool: bestPool, amount, isDeposit: true }]; + } + + solve(pools: PoolInfo[], amount: string) { + this.actions = []; + let _amount: string = amount; + let netYield = 0; + this.status = StrategyStatus.SOLVING; + try { + for (let i = 0; i < this.steps.length; ++i) { + const step = this.steps[i]; + let _pools = [...pools]; + for (let j = 0; j < step.filter.length; ++j) { + const filter = step.filter[j]; + _pools = filter.bind(this)(_pools, amount, this.actions); + } + + console.log('solve', i, _pools, pools.length, this.actions, _amount); + + if (_pools.length > 0) { + this.actions = step.optimizer.bind(this)( + _pools, + _amount, + this.actions, + ); + if (this.actions.length != i + 1) { + console.warn(`actions`, this.actions.length, 'i', i); + throw new Error('one new action per step required'); + } + this.actions[i].name = step.name; + _amount = this.actions[this.actions.length - 1].amount; + } else { + throw new Error('no pools to continue computing strategy'); + } + } + } catch (err) { + console.warn(`${this.tag} - unsolved`, err); + return; + } + + this.actions.forEach((action) => { + const sign = action.isDeposit ? 1 : -1; + const apr = action.isDeposit ? action.pool.apr : action.pool.borrow.apr; + netYield += sign * apr * Number(action.amount); + console.log('netYield1', sign, apr, action.amount, netYield); + }); + this.netYield = netYield / Number(amount); + console.log('netYield', netYield, this.netYield); + this.leverage = this.netYield / this.actions[0].pool.apr; + + this.postSolve(); + + this.status = StrategyStatus.SOLVED; + } + + postSolve() {} + + isSolved() { + return this.status === StrategyStatus.SOLVED; + } + + isSolving() { + return this.status === StrategyStatus.SOLVING; + } +} diff --git a/src/strategies/auto_strk.strat.ts b/src/strategies/auto_strk.strat.ts index 851164f..298b158 100755 --- a/src/strategies/auto_strk.strat.ts +++ b/src/strategies/auto_strk.strat.ts @@ -1,309 +1,309 @@ -import CONSTANTS, { TOKENS, TokenName } from '@/constants'; -import { PoolInfo } from '@/store/pools'; -import { - IStrategy, - IStrategySettings, - StrategyAction, - StrategyLiveStatus, - TokenInfo, -} from './IStrategy'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import AutoStrkAbi from '@/abi/autoStrk.abi.json'; -import MasterAbi from '@/abi/master.abi.json'; -import MyNumber from '@/utils/MyNumber'; -import { Contract, ProviderInterface, uint256 } from 'starknet'; -import { atom } from 'jotai'; -import { - DUMMY_BAL_ATOM, - getBalance, - getBalanceAtom, - getERC20Balance, - getERC20BalanceAtom, -} from '@/store/balance.atoms'; -import { getTokenInfoFromName } from '@/utils'; -import axios from 'axios'; - -interface Step { - name: string; - optimizer: ( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => StrategyAction[]; - filter: (( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) => PoolInfo[])[]; -} - -export class AutoTokenStrategy extends IStrategy { - token: TokenInfo; - readonly lpTokenName: string; - readonly strategyAddress: string; - - constructor( - token: TokenName, - name: string, - description: string, - lpTokenName: string, - strategyAddress: string, - settings: IStrategySettings, - ) { - const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; - const frmToken = TOKENS.find((t) => t.token == strategyAddress); - if (!frmToken) throw new Error('frmToken undefined'); - const holdingTokens = [frmToken]; - - super( - `auto_token_${token.toLowerCase()}`, - 'AutoSTRK', - name, - description, - rewardTokens, - holdingTokens, - StrategyLiveStatus.ACTIVE, - settings, - ); - this.token = getTokenInfoFromName(token); - - this.steps = [ - { - name: `Supplies your ${token} to zkLend`, - optimizer: this.optimizer, - filter: [this.filterStrkzkLend], - }, - { - name: `Re-invest your STRK Rewards every 14 days`, - optimizer: this.compounder, - filter: [this.filterStrkzkLend], - }, - ]; - const _risks = [...this.risks]; - this.risks = [ - `Safety score: 4.5/5`, - `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, - `Transfering excess ${lpTokenName} may take your borrows in zkLend near liquidaton. It's safer to deposit ${token} directly.`, - ..._risks, - ]; - this.lpTokenName = lpTokenName; - this.strategyAddress = strategyAddress; - } - - optimizer( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - return [{ pool: eligiblePools[0], amount, isDeposit: true }]; - } - - compounder( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - const baseApr = actions[0].pool.apr; - const compoundingApr = (1 + baseApr / 26) ** 26 - 1; - return [ - ...actions, - { - pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, - amount, - isDeposit: true, - }, - ]; - } - - getUserTVL = async (user: string) => { - if (this.liveStatus == StrategyLiveStatus.COMING_SOON) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - // returns zToken - const balanceInfo = await getBalance(this.holdingTokens[0], user); - if (!balanceInfo.tokenInfo) { - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - } - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - console.log('getUserTVL autoc', price, balanceInfo.amount.toEtherStr()); - return { - amount: balanceInfo.amount, - usdValue: Number(balanceInfo.amount.toEtherStr()) * price, - tokenInfo: balanceInfo.tokenInfo, - }; - }; - - getTVL = async () => { - if (!this.isLive()) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - const zTokenInfo = getTokenInfoFromName(this.lpTokenName); - const bal = await getERC20Balance(zTokenInfo, this.strategyAddress); - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - return { - amount: bal.amount, - usdValue: Number(bal.amount.toEtherStr()) * price, - tokenInfo: this.token, - }; - }; - - // postSolve() { - // const normalYield = this.netYield; - // this.netYield = (1 + this.netYield/26)**26 - 1; // biweekly compounding - // this.leverage = this.netYield / normalYield; - // } - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const baseTokenInfo: TokenInfo = TOKENS.find( - (t) => t.name == this.token.name, - ) as TokenInfo; // - const zTokenInfo: TokenInfo = TOKENS.find( - (t) => t.name == this.lpTokenName, - ) as TokenInfo; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: baseTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - { - tokenInfo: zTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const baseTokenContract = new Contract( - ERC20Abi, - baseTokenInfo.token, - provider, - ); - const zTokenContract = new Contract(ERC20Abi, zTokenInfo.token, provider); - const masterContract = new Contract( - MasterAbi, - CONSTANTS.CONTRACTS.Master, - provider, - ); - const strategyContract = new Contract( - AutoStrkAbi, - this.strategyAddress, - provider, - ); - - // base token - const call11 = baseTokenContract.populate('approve', [ - masterContract.address, - uint256.bnToUint256(amount.toString()), - ]); - const call12 = masterContract.populate('invest_auto_strk', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - address, - ]); - - // zToken - const call21 = zTokenContract.populate('approve', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - ]); - const call22 = strategyContract.populate('deposit', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls1 = [call11, call12]; - const calls2 = [call21, call22]; - - return [ - { - tokenInfo: baseTokenInfo, - calls: calls1, - balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), - }, - { - tokenInfo: zTokenInfo, - calls: calls2, - balanceAtom: getBalanceAtom(zTokenInfo, atom(true)), - }, - ]; - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const frmToken: TokenInfo = TOKENS.find( - (t) => t.token == this.strategyAddress, - ) as TokenInfo; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: frmToken, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - // const baseTokenContract = new Contract(ERC20Abi, baseTokenInfo.token, provider); - const frmTokenContract = new Contract(ERC20Abi, frmToken.token, provider); - // const masterContract = new Contract(MasterAbi, CONSTANTS.CONTRACTS.Master, provider); - const strategyContract = new Contract( - AutoStrkAbi, - this.strategyAddress, - provider, - ); - - // base token - // const call11 = baseTokenContract.populate("approve", [masterContract.address, uint256.bnToUint256(amount.toString())]) - // const call12 = masterContract.populate("invest_auto_strk", [this.strategyAddress, uint256.bnToUint256(amount.toString()), address]) - - // zToken - const call1 = frmTokenContract.populate('approve', [ - this.strategyAddress, - uint256.bnToUint256(amount.toString()), - ]); - const call2 = strategyContract.populate('redeem', [ - uint256.bnToUint256(amount.toString()), - address, - address, - ]); - - const calls = [call1, call2]; - - return [ - { - tokenInfo: frmToken, - calls, - balanceAtom: getERC20BalanceAtom(frmToken), - }, - ]; - }; -} +import CONSTANTS, { TOKENS, TokenName } from '@/constants'; +import { PoolInfo } from '@/store/pools'; +import { + IStrategy, + IStrategySettings, + StrategyAction, + StrategyLiveStatus, + TokenInfo, +} from './IStrategy'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import AutoStrkAbi from '@/abi/autoStrk.abi.json'; +import MasterAbi from '@/abi/master.abi.json'; +import MyNumber from '@/utils/MyNumber'; +import { Contract, ProviderInterface, uint256 } from 'starknet'; +import { atom } from 'jotai'; +import { + DUMMY_BAL_ATOM, + getBalance, + getBalanceAtom, + getERC20Balance, + getERC20BalanceAtom, +} from '@/store/balance.atoms'; +import { getTokenInfoFromName } from '@/utils'; +import axios from 'axios'; + +interface Step { + name: string; + optimizer: ( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => StrategyAction[]; + filter: (( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) => PoolInfo[])[]; +} + +export class AutoTokenStrategy extends IStrategy { + token: TokenInfo; + readonly lpTokenName: string; + readonly strategyAddress: string; + + constructor( + token: TokenName, + name: string, + description: string, + lpTokenName: string, + strategyAddress: string, + settings: IStrategySettings, + ) { + const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; + const frmToken = TOKENS.find((t) => t.token == strategyAddress); + if (!frmToken) throw new Error('frmToken undefined'); + const holdingTokens = [frmToken]; + + super( + `auto_token_${token.toLowerCase()}`, + 'AutoSTRK', + name, + description, + rewardTokens, + holdingTokens, + StrategyLiveStatus.ACTIVE, + settings, + ); + this.token = getTokenInfoFromName(token); + + this.steps = [ + { + name: `Supplies your ${token} to zkLend`, + optimizer: this.optimizer, + filter: [this.filterStrkzkLend], + }, + { + name: `Re-invest your STRK Rewards every 14 days`, + optimizer: this.compounder, + filter: [this.filterStrkzkLend], + }, + ]; + const _risks = [...this.risks]; + this.risks = [ + `Safety score: 4.5/5`, + `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, + `Transfering excess ${lpTokenName} may take your borrows in zkLend near liquidaton. It's safer to deposit ${token} directly.`, + ..._risks, + ]; + this.lpTokenName = lpTokenName; + this.strategyAddress = strategyAddress; + } + + optimizer( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + return [{ pool: eligiblePools[0], amount, isDeposit: true }]; + } + + compounder( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + const baseApr = actions[0].pool.apr; + const compoundingApr = (1 + baseApr / 26) ** 26 - 1; + return [ + ...actions, + { + pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, + amount, + isDeposit: true, + }, + ]; + } + + getUserTVL = async (user: string) => { + if (this.liveStatus == StrategyLiveStatus.COMING_SOON) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + // returns zToken + const balanceInfo = await getBalance(this.holdingTokens[0], user); + if (!balanceInfo.tokenInfo) { + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + } + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + console.log('getUserTVL autoc', price, balanceInfo.amount.toEtherStr()); + return { + amount: balanceInfo.amount, + usdValue: Number(balanceInfo.amount.toEtherStr()) * price, + tokenInfo: balanceInfo.tokenInfo, + }; + }; + + getTVL = async () => { + if (!this.isLive()) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + const zTokenInfo = getTokenInfoFromName(this.lpTokenName); + const bal = await getERC20Balance(zTokenInfo, this.strategyAddress); + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${this.token.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + return { + amount: bal.amount, + usdValue: Number(bal.amount.toEtherStr()) * price, + tokenInfo: this.token, + }; + }; + + // postSolve() { + // const normalYield = this.netYield; + // this.netYield = (1 + this.netYield/26)**26 - 1; // biweekly compounding + // this.leverage = this.netYield / normalYield; + // } + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const baseTokenInfo: TokenInfo = TOKENS.find( + (t) => t.name == this.token.name, + ) as TokenInfo; // + const zTokenInfo: TokenInfo = TOKENS.find( + (t) => t.name == this.lpTokenName, + ) as TokenInfo; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: baseTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + { + tokenInfo: zTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const baseTokenContract = new Contract( + ERC20Abi, + baseTokenInfo.token, + provider, + ); + const zTokenContract = new Contract(ERC20Abi, zTokenInfo.token, provider); + const masterContract = new Contract( + MasterAbi, + CONSTANTS.CONTRACTS.Master, + provider, + ); + const strategyContract = new Contract( + AutoStrkAbi, + this.strategyAddress, + provider, + ); + + // base token + const call11 = baseTokenContract.populate('approve', [ + masterContract.address, + uint256.bnToUint256(amount.toString()), + ]); + const call12 = masterContract.populate('invest_auto_strk', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + address, + ]); + + // zToken + const call21 = zTokenContract.populate('approve', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + ]); + const call22 = strategyContract.populate('deposit', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls1 = [call11, call12]; + const calls2 = [call21, call22]; + + return [ + { + tokenInfo: baseTokenInfo, + calls: calls1, + balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), + }, + { + tokenInfo: zTokenInfo, + calls: calls2, + balanceAtom: getBalanceAtom(zTokenInfo, atom(true)), + }, + ]; + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const frmToken: TokenInfo = TOKENS.find( + (t) => t.token == this.strategyAddress, + ) as TokenInfo; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: frmToken, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + // const baseTokenContract = new Contract(ERC20Abi, baseTokenInfo.token, provider); + const frmTokenContract = new Contract(ERC20Abi, frmToken.token, provider); + // const masterContract = new Contract(MasterAbi, CONSTANTS.CONTRACTS.Master, provider); + const strategyContract = new Contract( + AutoStrkAbi, + this.strategyAddress, + provider, + ); + + // base token + // const call11 = baseTokenContract.populate("approve", [masterContract.address, uint256.bnToUint256(amount.toString())]) + // const call12 = masterContract.populate("invest_auto_strk", [this.strategyAddress, uint256.bnToUint256(amount.toString()), address]) + + // zToken + const call1 = frmTokenContract.populate('approve', [ + this.strategyAddress, + uint256.bnToUint256(amount.toString()), + ]); + const call2 = strategyContract.populate('redeem', [ + uint256.bnToUint256(amount.toString()), + address, + address, + ]); + + const calls = [call1, call2]; + + return [ + { + tokenInfo: frmToken, + calls, + balanceAtom: getERC20BalanceAtom(frmToken), + }, + ]; + }; +} diff --git a/src/strategies/delta_neutral_mm.ts b/src/strategies/delta_neutral_mm.ts index c85f8b5..dffbd10 100755 --- a/src/strategies/delta_neutral_mm.ts +++ b/src/strategies/delta_neutral_mm.ts @@ -1,398 +1,398 @@ -import CONSTANTS, { NFTS, TokenName } from '@/constants'; -import { PoolInfo } from '@/store/pools'; -import { - IStrategy, - IStrategySettings, - NFTInfo, - StrategyAction, - StrategyLiveStatus, - TokenInfo, -} from './IStrategy'; -import { zkLend } from '@/store/zklend.store'; -import ERC20Abi from '@/abi/erc20.abi.json'; -import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; -import MyNumber from '@/utils/MyNumber'; -import { Call, Contract, ProviderInterface, uint256 } from 'starknet'; -import { nostraLending } from '@/store/nostralending.store'; -import { getTokenInfoFromName, standariseAddress } from '@/utils'; -import { - DUMMY_BAL_ATOM, - getBalance, - getBalanceAtom, - getERC20Balance, -} from '@/store/balance.atoms'; -import { atom } from 'jotai'; -import axios from 'axios'; - -export class DeltaNeutralMM extends IStrategy { - token: TokenInfo; - readonly secondaryToken: string; - readonly strategyAddress: string; - // Factor of Amount to be deposited/borrowed at each step relative to the previous step - readonly stepAmountFactors: number[]; - - constructor( - token: TokenInfo, - name: string, - description: string, - secondaryTokenName: TokenName, - strategyAddress: string, - stepAmountFactors: number[], - liveStatus: StrategyLiveStatus, - settings: IStrategySettings, - ) { - const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; - const nftInfo = NFTS.find( - (nft) => - standariseAddress(nft.address) == standariseAddress(strategyAddress), - ); - if (!nftInfo) { - throw new Error('DeltaMM: NFT not found'); - } - const holdingTokens: (TokenInfo | NFTInfo)[] = [nftInfo]; - super( - `${token.name.toLowerCase()}_sensei`, - 'DeltaNeutralMM', - name, - description, - rewardTokens, - holdingTokens, - liveStatus, - settings, - ); - this.token = token; - - this.steps = [ - { - name: `Supply's your ${token.name} to zkLend`, - optimizer: this.optimizer, - filter: [this.filterMainToken], - }, - { - name: `Borrow ${secondaryTokenName} from zkLend`, - optimizer: this.optimizer, - filter: [this.filterSecondaryToken], - }, - { - name: `Deposit ${secondaryTokenName} to Nostra`, - optimizer: this.optimizer, - filter: [this.filterSecondaryToken], - }, - { - name: `Borrow ${token.name} from Nostra`, - optimizer: this.optimizer, - filter: [this.filterMainToken], - }, - { - name: `Loop back to step 1, repeat 3 more times`, - optimizer: this.getLookRepeatYieldAmount, - filter: [this.filterMainToken], - }, - { - name: `Re-invest your STRK Rewards every 14 days (Compound)`, - optimizer: this.compounder, - filter: [this.filterStrkzkLend], - }, - ]; - - if (stepAmountFactors.length != 5) { - throw new Error( - 'stepAmountFactors length should be equal to steps length', - ); - } - this.stepAmountFactors = stepAmountFactors; - - const _risks = [...this.risks]; - this.risks = [ - `Safety score: 4.25/5`, - `For upto 2 weeks, your position value may reduce due to high borrow APR. This will be compensated by STRK rewards.`, - `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, - `Technical failures in rebalancing positions to maintain healthy health factor may result in liquidations.`, - ..._risks, - ]; - this.secondaryToken = secondaryTokenName; - this.strategyAddress = strategyAddress; - } - - filterMainToken( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const dapp = - prevActions.length == 0 || prevActions.length == 4 - ? zkLend - : nostraLending; - return pools.filter( - (p) => p.pool.name == this.token.name && p.protocol.name == dapp.name, - ); - } - - filterSecondaryToken( - pools: PoolInfo[], - amount: string, - prevActions: StrategyAction[], - ) { - const dapp = prevActions.length == 1 ? zkLend : nostraLending; - return pools.filter( - (p) => p.pool.name == this.secondaryToken && p.protocol.name == dapp.name, - ); - } - - optimizer( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - console.log('optimizer', actions.length, this.stepAmountFactors); - const _amount = ( - Number(amount) * this.stepAmountFactors[actions.length] - ).toFixed(2); - return [ - ...actions, - { - pool: eligiblePools[0], - amount: _amount, - isDeposit: actions.length == 0 || actions.length == 2, - }, - ]; - } - - getLookRepeatYieldAmount( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ) { - console.log('getLookRepeatYieldAmount', amount, actions); - let full_amount = Number(amount); - this.stepAmountFactors.slice(0, 4).forEach((factor, i) => { - full_amount /= factor; - }); - const excessFactor = this.stepAmountFactors[4]; - const amount1 = excessFactor * full_amount; - const exp1 = amount1 * this.actions[0].pool.apr; - const amount2 = this.stepAmountFactors[1] * amount1; - const exp2 = - amount2 * (this.actions[2].pool.apr - this.actions[1].pool.borrow.apr); - const amount3 = this.stepAmountFactors[3] * amount2; - const exp3 = -amount3 * this.actions[3].pool.borrow.apr; - const effecitveAmount = amount1 - amount3; - const effectiveAPR = (exp1 + exp2 + exp3) / effecitveAmount; - const pool: PoolInfo = { ...eligiblePools[0] }; - pool.apr = effectiveAPR; - const strategyAction: StrategyAction = { - pool, - amount: effecitveAmount.toString(), - isDeposit: true, - }; - console.log( - 'getLookRepeatYieldAmount exp1', - this.id, - exp1, - full_amount, - exp2, - amount2, - this.actions[2], - this.actions[1], - exp3, - amount1, - amount3, - ); - return [...actions, strategyAction]; - } - - compounder( - eligiblePools: PoolInfo[], - amount: string, - actions: StrategyAction[], - ): StrategyAction[] { - const amountWeights = this.actions.reduce((a, pool) => { - const sign = pool.isDeposit ? 1 : -1; - const apr = pool.isDeposit ? pool.pool.apr : pool.pool.borrow.apr; - console.log('compounder2', sign, pool.amount, apr); - return sign * Number(pool.amount) * apr + a; - }, 0); - const amountIn = Number(this.actions[0].amount); - const baseApr = amountWeights / amountIn; - const compoundingApr = (1 + baseApr / 26) ** 26 - 1; - console.log( - 'compounder', - amountIn, - amountWeights, - baseApr, - compoundingApr, - actions, - ); - return [ - ...actions, - { - pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, - amount: amountIn.toFixed(2), - isDeposit: true, - }, - ]; - } - - depositMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const baseTokenInfo = this.token; - - if (!address || address == '0x0') { - return [ - { - tokenInfo: baseTokenInfo, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const baseTokenContract = new Contract( - ERC20Abi, - baseTokenInfo.token, - provider, - ); - const strategyContract = new Contract( - DeltaNeutralAbi, - this.strategyAddress, - provider, - ); - - // base token - const call11 = baseTokenContract.populate('approve', [ - strategyContract.address, - uint256.bnToUint256(amount.toString()), - ]); - const call12 = strategyContract.populate('deposit', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls1 = [call11, call12]; - - return [ - { - tokenInfo: baseTokenInfo, - calls: calls1, - balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), - }, - ]; - }; - - getUserTVL = async (user: string) => { - if (this.liveStatus == StrategyLiveStatus.COMING_SOON) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - const balanceInfo = await getBalance(this.holdingTokens[0], user); - if (!balanceInfo.tokenInfo) { - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - } - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${balanceInfo.tokenInfo.name}-USDT/spot`, - ); - const price = Number(priceInfo.data.data.amount); - console.log('getUserTVL dnmm', price, balanceInfo.amount.toEtherStr()); - return { - amount: balanceInfo.amount, - usdValue: Number(balanceInfo.amount.toEtherStr()) * price, - tokenInfo: balanceInfo.tokenInfo, - }; - }; - - getTVL = async () => { - if (!this.isLive()) - return { - amount: MyNumber.fromEther('0', this.token.decimals), - usdValue: 0, - tokenInfo: this.token, - }; - - try { - const mainTokenName = this.token.name; - const zToken = getTokenInfoFromName(`z${mainTokenName}`); - - const bal = await getERC20Balance(zToken, this.strategyAddress); - console.log('getTVL', bal.amount.toString()); - // This reduces the zToken TVL to near actual deposits made by users wihout looping - const discountFactor = this.stepAmountFactors[4]; - const amount = bal.amount.operate('div', 1 + discountFactor); - console.log('getTVL1', amount.toString()); - const priceInfo = await axios.get( - `https://api.coinbase.com/v2/prices/${mainTokenName}-USDT/spot`, - ); - console.log('getTVL2', priceInfo); - const price = Number(priceInfo.data.data.amount); - return { - amount, - usdValue: Number(amount.toEtherStr()) * price, - tokenInfo: this.token, - }; - } catch (e) { - console.log('getTVL err', e); - throw e; - } - }; - - withdrawMethods = ( - amount: MyNumber, - address: string, - provider: ProviderInterface, - ) => { - const mainToken = { ...this.token }; - - // removing max amount restrictions on withdrawal - mainToken.maxAmount = MyNumber.fromEther( - '100000000000', - mainToken.maxAmount.decimals, - ); - - if (!address || address == '0x0') { - return [ - { - tokenInfo: mainToken, - calls: [], - balanceAtom: DUMMY_BAL_ATOM, - }, - ]; - } - - const strategyContract = new Contract( - DeltaNeutralAbi, - this.strategyAddress, - provider, - ); - - const call = strategyContract.populate('withdraw', [ - uint256.bnToUint256(amount.toString()), - address, - ]); - - const calls: Call[] = [call]; - - const nftInfo = NFTS.find( - (nft) => - standariseAddress(nft.address) == - standariseAddress(this.strategyAddress), - ); - if (!nftInfo) { - throw new Error('DeltaMM: NFT not found'); - } - return [ - { - tokenInfo: mainToken, - calls, - balanceAtom: getBalanceAtom(nftInfo, atom(true)), - }, - ]; - }; -} +import CONSTANTS, { NFTS, TokenName } from '@/constants'; +import { PoolInfo } from '@/store/pools'; +import { + IStrategy, + IStrategySettings, + NFTInfo, + StrategyAction, + StrategyLiveStatus, + TokenInfo, +} from './IStrategy'; +import { zkLend } from '@/store/zklend.store'; +import ERC20Abi from '@/abi/erc20.abi.json'; +import DeltaNeutralAbi from '@/abi/deltraNeutral.abi.json'; +import MyNumber from '@/utils/MyNumber'; +import { Call, Contract, ProviderInterface, uint256 } from 'starknet'; +import { nostraLending } from '@/store/nostralending.store'; +import { getTokenInfoFromName, standariseAddress } from '@/utils'; +import { + DUMMY_BAL_ATOM, + getBalance, + getBalanceAtom, + getERC20Balance, +} from '@/store/balance.atoms'; +import { atom } from 'jotai'; +import axios from 'axios'; + +export class DeltaNeutralMM extends IStrategy { + token: TokenInfo; + readonly secondaryToken: string; + readonly strategyAddress: string; + // Factor of Amount to be deposited/borrowed at each step relative to the previous step + readonly stepAmountFactors: number[]; + + constructor( + token: TokenInfo, + name: string, + description: string, + secondaryTokenName: TokenName, + strategyAddress: string, + stepAmountFactors: number[], + liveStatus: StrategyLiveStatus, + settings: IStrategySettings, + ) { + const rewardTokens = [{ logo: CONSTANTS.LOGOS.STRK }]; + const nftInfo = NFTS.find( + (nft) => + standariseAddress(nft.address) == standariseAddress(strategyAddress), + ); + if (!nftInfo) { + throw new Error('DeltaMM: NFT not found'); + } + const holdingTokens: (TokenInfo | NFTInfo)[] = [nftInfo]; + super( + `${token.name.toLowerCase()}_sensei`, + 'DeltaNeutralMM', + name, + description, + rewardTokens, + holdingTokens, + liveStatus, + settings, + ); + this.token = token; + + this.steps = [ + { + name: `Supply's your ${token.name} to zkLend`, + optimizer: this.optimizer, + filter: [this.filterMainToken], + }, + { + name: `Borrow ${secondaryTokenName} from zkLend`, + optimizer: this.optimizer, + filter: [this.filterSecondaryToken], + }, + { + name: `Deposit ${secondaryTokenName} to Nostra`, + optimizer: this.optimizer, + filter: [this.filterSecondaryToken], + }, + { + name: `Borrow ${token.name} from Nostra`, + optimizer: this.optimizer, + filter: [this.filterMainToken], + }, + { + name: `Loop back to step 1, repeat 3 more times`, + optimizer: this.getLookRepeatYieldAmount, + filter: [this.filterMainToken], + }, + { + name: `Re-invest your STRK Rewards every 14 days (Compound)`, + optimizer: this.compounder, + filter: [this.filterStrkzkLend], + }, + ]; + + if (stepAmountFactors.length != 5) { + throw new Error( + 'stepAmountFactors length should be equal to steps length', + ); + } + this.stepAmountFactors = stepAmountFactors; + + const _risks = [...this.risks]; + this.risks = [ + `Safety score: 4.25/5`, + `For upto 2 weeks, your position value may reduce due to high borrow APR. This will be compensated by STRK rewards.`, + `Your original investment is safe. If you deposit 100 tokens, you will always get at least 100 tokens back, unless due to below reasons.`, + `Technical failures in rebalancing positions to maintain healthy health factor may result in liquidations.`, + ..._risks, + ]; + this.secondaryToken = secondaryTokenName; + this.strategyAddress = strategyAddress; + } + + filterMainToken( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const dapp = + prevActions.length == 0 || prevActions.length == 4 + ? zkLend + : nostraLending; + return pools.filter( + (p) => p.pool.name == this.token.name && p.protocol.name == dapp.name, + ); + } + + filterSecondaryToken( + pools: PoolInfo[], + amount: string, + prevActions: StrategyAction[], + ) { + const dapp = prevActions.length == 1 ? zkLend : nostraLending; + return pools.filter( + (p) => p.pool.name == this.secondaryToken && p.protocol.name == dapp.name, + ); + } + + optimizer( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + console.log('optimizer', actions.length, this.stepAmountFactors); + const _amount = ( + Number(amount) * this.stepAmountFactors[actions.length] + ).toFixed(2); + return [ + ...actions, + { + pool: eligiblePools[0], + amount: _amount, + isDeposit: actions.length == 0 || actions.length == 2, + }, + ]; + } + + getLookRepeatYieldAmount( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ) { + console.log('getLookRepeatYieldAmount', amount, actions); + let full_amount = Number(amount); + this.stepAmountFactors.slice(0, 4).forEach((factor, i) => { + full_amount /= factor; + }); + const excessFactor = this.stepAmountFactors[4]; + const amount1 = excessFactor * full_amount; + const exp1 = amount1 * this.actions[0].pool.apr; + const amount2 = this.stepAmountFactors[1] * amount1; + const exp2 = + amount2 * (this.actions[2].pool.apr - this.actions[1].pool.borrow.apr); + const amount3 = this.stepAmountFactors[3] * amount2; + const exp3 = -amount3 * this.actions[3].pool.borrow.apr; + const effecitveAmount = amount1 - amount3; + const effectiveAPR = (exp1 + exp2 + exp3) / effecitveAmount; + const pool: PoolInfo = { ...eligiblePools[0] }; + pool.apr = effectiveAPR; + const strategyAction: StrategyAction = { + pool, + amount: effecitveAmount.toString(), + isDeposit: true, + }; + console.log( + 'getLookRepeatYieldAmount exp1', + this.id, + exp1, + full_amount, + exp2, + amount2, + this.actions[2], + this.actions[1], + exp3, + amount1, + amount3, + ); + return [...actions, strategyAction]; + } + + compounder( + eligiblePools: PoolInfo[], + amount: string, + actions: StrategyAction[], + ): StrategyAction[] { + const amountWeights = this.actions.reduce((a, pool) => { + const sign = pool.isDeposit ? 1 : -1; + const apr = pool.isDeposit ? pool.pool.apr : pool.pool.borrow.apr; + console.log('compounder2', sign, pool.amount, apr); + return sign * Number(pool.amount) * apr + a; + }, 0); + const amountIn = Number(this.actions[0].amount); + const baseApr = amountWeights / amountIn; + const compoundingApr = (1 + baseApr / 26) ** 26 - 1; + console.log( + 'compounder', + amountIn, + amountWeights, + baseApr, + compoundingApr, + actions, + ); + return [ + ...actions, + { + pool: { ...eligiblePools[0], apr: compoundingApr - baseApr }, + amount: amountIn.toFixed(2), + isDeposit: true, + }, + ]; + } + + depositMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const baseTokenInfo = this.token; + + if (!address || address == '0x0') { + return [ + { + tokenInfo: baseTokenInfo, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const baseTokenContract = new Contract( + ERC20Abi, + baseTokenInfo.token, + provider, + ); + const strategyContract = new Contract( + DeltaNeutralAbi, + this.strategyAddress, + provider, + ); + + // base token + const call11 = baseTokenContract.populate('approve', [ + strategyContract.address, + uint256.bnToUint256(amount.toString()), + ]); + const call12 = strategyContract.populate('deposit', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls1 = [call11, call12]; + + return [ + { + tokenInfo: baseTokenInfo, + calls: calls1, + balanceAtom: getBalanceAtom(baseTokenInfo, atom(true)), + }, + ]; + }; + + getUserTVL = async (user: string) => { + if (this.liveStatus == StrategyLiveStatus.COMING_SOON) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + const balanceInfo = await getBalance(this.holdingTokens[0], user); + if (!balanceInfo.tokenInfo) { + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + } + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${balanceInfo.tokenInfo.name}-USDT/spot`, + ); + const price = Number(priceInfo.data.data.amount); + console.log('getUserTVL dnmm', price, balanceInfo.amount.toEtherStr()); + return { + amount: balanceInfo.amount, + usdValue: Number(balanceInfo.amount.toEtherStr()) * price, + tokenInfo: balanceInfo.tokenInfo, + }; + }; + + getTVL = async () => { + if (!this.isLive()) + return { + amount: MyNumber.fromEther('0', this.token.decimals), + usdValue: 0, + tokenInfo: this.token, + }; + + try { + const mainTokenName = this.token.name; + const zToken = getTokenInfoFromName(`z${mainTokenName}`); + + const bal = await getERC20Balance(zToken, this.strategyAddress); + console.log('getTVL', bal.amount.toString()); + // This reduces the zToken TVL to near actual deposits made by users wihout looping + const discountFactor = this.stepAmountFactors[4]; + const amount = bal.amount.operate('div', 1 + discountFactor); + console.log('getTVL1', amount.toString()); + const priceInfo = await axios.get( + `https://api.coinbase.com/v2/prices/${mainTokenName}-USDT/spot`, + ); + console.log('getTVL2', priceInfo); + const price = Number(priceInfo.data.data.amount); + return { + amount, + usdValue: Number(amount.toEtherStr()) * price, + tokenInfo: this.token, + }; + } catch (e) { + console.log('getTVL err', e); + throw e; + } + }; + + withdrawMethods = ( + amount: MyNumber, + address: string, + provider: ProviderInterface, + ) => { + const mainToken = { ...this.token }; + + // removing max amount restrictions on withdrawal + mainToken.maxAmount = MyNumber.fromEther( + '100000000000', + mainToken.maxAmount.decimals, + ); + + if (!address || address == '0x0') { + return [ + { + tokenInfo: mainToken, + calls: [], + balanceAtom: DUMMY_BAL_ATOM, + }, + ]; + } + + const strategyContract = new Contract( + DeltaNeutralAbi, + this.strategyAddress, + provider, + ); + + const call = strategyContract.populate('withdraw', [ + uint256.bnToUint256(amount.toString()), + address, + ]); + + const calls: Call[] = [call]; + + const nftInfo = NFTS.find( + (nft) => + standariseAddress(nft.address) == + standariseAddress(this.strategyAddress), + ); + if (!nftInfo) { + throw new Error('DeltaMM: NFT not found'); + } + return [ + { + tokenInfo: mainToken, + calls, + balanceAtom: getBalanceAtom(nftInfo, atom(true)), + }, + ]; + }; +} diff --git a/src/strategies/simple.stable.strat.ts b/src/strategies/simple.stable.strat.ts index edc1ac5..d69a5ab 100755 --- a/src/strategies/simple.stable.strat.ts +++ b/src/strategies/simple.stable.strat.ts @@ -1,89 +1,89 @@ -// import CONSTANTS from '@/constants'; -// import { IDapp } from '@/store/IDapp.store'; -// import { PROTOCOLS, PoolInfo } from '@/store/pools'; -// import { IStrategy, StrategyAction } from './IStrategy'; - -// interface Step { -// name: string; -// optimizer: ( -// pools: PoolInfo[], -// amount: string, -// prevActions: StrategyAction[], -// ) => StrategyAction[]; -// filter: (( -// pools: PoolInfo[], -// amount: string, -// prevActions: StrategyAction[], -// ) => PoolInfo[])[]; -// } - -// export class SimpleStableStrategy extends IStrategy { -// tag = 'SSStrt'; -// exchanges: IDapp[] = []; - -// actions: StrategyAction[] = []; -// netYield: number = 0; -// leverage: number = 0; -// solved = false; - -// constructor() { -// const rewardTokens = [ -// { logo: CONSTANTS.LOGOS.STRK }, -// { logo: CONSTANTS.LOGOS.USDC }, -// { logo: CONSTANTS.LOGOS.USDT }, -// ]; -// super( -// `SSStrt_mm_usdc_usdt`, -// 'SSStrt', -// 'Stable loop', -// 'Loop stable-coins to maximize yield', -// rewardTokens, -// [], -// ); - -// this.steps = [ -// { -// name: 'Deposit to best pool', -// optimizer: this.optimizerDeposit, -// filter: [this.filterStablesOnly], -// }, -// { -// name: 'Borrow from same protocol keeping HF > 1.2', -// optimizer: (pools, amount, actions) => { -// let bestPool: PoolInfo = pools[0]; -// pools.forEach((p) => { -// if (p.borrow.apr < bestPool.borrow.apr) { -// bestPool = p; -// } -// }); -// const protocolInfo: any = PROTOCOLS.find( -// (p) => p.name === bestPool.protocol.name, -// ); -// if (!protocolInfo) -// throw new Error(`${this.tag} Protocol info not found`); -// const protocolClass: IDapp = protocolInfo.class; -// const factoredAmount = protocolClass.getMaxFactoredOut(actions, 1.2); -// const newAmount = factoredAmount * bestPool.borrow.borrowFactor; -// const newAction: StrategyAction = { -// pool: bestPool, -// amount: newAmount.toFixed(0), -// isDeposit: false, -// }; -// return [...actions, newAction]; -// }, -// filter: [ -// this.filterStablesOnly, -// this.filterSameProtocolNotSameDepositPool, -// ], -// }, -// { -// name: 'Deposit borrowed amount to another protocol', -// optimizer: this.optimizerDeposit, -// filter: [ -// this.filterStablesOnly, -// this.filterNotSameProtocolSameDepositPool, -// ], -// }, -// ]; -// } -// } +// import CONSTANTS from '@/constants'; +// import { IDapp } from '@/store/IDapp.store'; +// import { PROTOCOLS, PoolInfo } from '@/store/pools'; +// import { IStrategy, StrategyAction } from './IStrategy'; + +// interface Step { +// name: string; +// optimizer: ( +// pools: PoolInfo[], +// amount: string, +// prevActions: StrategyAction[], +// ) => StrategyAction[]; +// filter: (( +// pools: PoolInfo[], +// amount: string, +// prevActions: StrategyAction[], +// ) => PoolInfo[])[]; +// } + +// export class SimpleStableStrategy extends IStrategy { +// tag = 'SSStrt'; +// exchanges: IDapp[] = []; + +// actions: StrategyAction[] = []; +// netYield: number = 0; +// leverage: number = 0; +// solved = false; + +// constructor() { +// const rewardTokens = [ +// { logo: CONSTANTS.LOGOS.STRK }, +// { logo: CONSTANTS.LOGOS.USDC }, +// { logo: CONSTANTS.LOGOS.USDT }, +// ]; +// super( +// `SSStrt_mm_usdc_usdt`, +// 'SSStrt', +// 'Stable loop', +// 'Loop stable-coins to maximize yield', +// rewardTokens, +// [], +// ); + +// this.steps = [ +// { +// name: 'Deposit to best pool', +// optimizer: this.optimizerDeposit, +// filter: [this.filterStablesOnly], +// }, +// { +// name: 'Borrow from same protocol keeping HF > 1.2', +// optimizer: (pools, amount, actions) => { +// let bestPool: PoolInfo = pools[0]; +// pools.forEach((p) => { +// if (p.borrow.apr < bestPool.borrow.apr) { +// bestPool = p; +// } +// }); +// const protocolInfo: any = PROTOCOLS.find( +// (p) => p.name === bestPool.protocol.name, +// ); +// if (!protocolInfo) +// throw new Error(`${this.tag} Protocol info not found`); +// const protocolClass: IDapp = protocolInfo.class; +// const factoredAmount = protocolClass.getMaxFactoredOut(actions, 1.2); +// const newAmount = factoredAmount * bestPool.borrow.borrowFactor; +// const newAction: StrategyAction = { +// pool: bestPool, +// amount: newAmount.toFixed(0), +// isDeposit: false, +// }; +// return [...actions, newAction]; +// }, +// filter: [ +// this.filterStablesOnly, +// this.filterSameProtocolNotSameDepositPool, +// ], +// }, +// { +// name: 'Deposit borrowed amount to another protocol', +// optimizer: this.optimizerDeposit, +// filter: [ +// this.filterStablesOnly, +// this.filterNotSameProtocolSameDepositPool, +// ], +// }, +// ]; +// } +// } diff --git a/src/utils/MyNumber.ts b/src/utils/MyNumber.ts index d1c664f..93edd5d 100755 --- a/src/utils/MyNumber.ts +++ b/src/utils/MyNumber.ts @@ -1,113 +1,113 @@ -import BigNumber from 'bignumber.js'; -import { ethers } from 'ethers'; -const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom'); - -export default class MyNumber { - bigNumber: BigNumber; - decimals: number; - - constructor(bigNumber: string, decimals: number) { - this.bigNumber = new BigNumber(bigNumber); - this.decimals = decimals; - } - - static fromEther(num: string, decimals: number) { - try { - return new MyNumber( - Number(ethers.parseUnits(num, decimals)).toFixed(6), - decimals, - ); - } catch (e) { - console.error('fromEther', e, num, decimals); - throw e; - } - } - - static fromZero() { - return new MyNumber('0', 0); - } - - toString() { - return this.bigNumber.toFixed(); - } - - toEtherStr() { - return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals); - } - - toFixedStr(decimals: number) { - return Number(this.toEtherStr()).toFixed(decimals); - } - - toEtherToFixedDecimals(decimals: number) { - // rounding down - return ( - Math.floor(parseFloat(this.toEtherStr()) * 10 ** decimals) / - 10 ** decimals - ).toFixed(decimals); - } - - isZero() { - return this.bigNumber.eq('0'); - } - - /** - * - * @param amountEther in token terms without decimal e.g. 1 for 1 STRK - * @param command BigNumber compare funds. e.g. gte, gt, lt - * @returns - * @dev Add more commands as needed - */ - compare(amountEther: string, command: 'gte' | 'gt' | 'lt') { - const fullNum = new BigNumber( - ethers.parseUnits(amountEther, this.decimals).toString(), - ); - return this.bigNumber[command](fullNum); - } - - operate(command: 'div' | 'plus', value: string | number) { - const bn = new BigNumber(Number(value).toFixed(6)); - return new MyNumber(this.bigNumber[command](bn).toFixed(0), this.decimals); - } - - subtract(value: MyNumber) { - const bn = this.bigNumber.minus(value.bigNumber); - return new MyNumber(bn.toString(), this.decimals); - } - - static min(a: MyNumber, b: MyNumber) { - if (a.decimals !== b.decimals) { - const diff = Math.abs(a.decimals - b.decimals); - if (a.decimals > b.decimals) { - b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); - } else { - a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); - } - } - const bn = BigNumber.min(a.bigNumber, b.bigNumber); - return new MyNumber( - bn.toString(), - a.decimals > b.decimals ? a.decimals : b.decimals, - ); - } - - static max(a: MyNumber, b: MyNumber) { - if (a.decimals !== b.decimals) { - const diff = Math.abs(a.decimals - b.decimals); - if (a.decimals > b.decimals) { - b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); - } else { - a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); - } - } - const bn = BigNumber.max(a.bigNumber, b.bigNumber); - return new MyNumber( - bn.toString(), - a.decimals > b.decimals ? a.decimals : b.decimals, +import BigNumber from 'bignumber.js'; +import { ethers } from 'ethers'; +const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom'); + +export default class MyNumber { + bigNumber: BigNumber; + decimals: number; + + constructor(bigNumber: string, decimals: number) { + this.bigNumber = new BigNumber(bigNumber); + this.decimals = decimals; + } + + static fromEther(num: string, decimals: number) { + try { + return new MyNumber( + Number(ethers.parseUnits(num, decimals)).toFixed(6), + decimals, + ); + } catch (e) { + console.error('fromEther', e, num, decimals); + throw e; + } + } + + static fromZero() { + return new MyNumber('0', 0); + } + + toString() { + return this.bigNumber.toFixed(); + } + + toEtherStr() { + return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals); + } + + toFixedStr(decimals: number) { + return Number(this.toEtherStr()).toFixed(decimals); + } + + toEtherToFixedDecimals(decimals: number) { + // rounding down + return ( + Math.floor(parseFloat(this.toEtherStr()) * 10 ** decimals) / + 10 ** decimals + ).toFixed(decimals); + } + + isZero() { + return this.bigNumber.eq('0'); + } + + /** + * + * @param amountEther in token terms without decimal e.g. 1 for 1 STRK + * @param command BigNumber compare funds. e.g. gte, gt, lt + * @returns + * @dev Add more commands as needed + */ + compare(amountEther: string, command: 'gte' | 'gt' | 'lt') { + const fullNum = new BigNumber( + ethers.parseUnits(amountEther, this.decimals).toString(), ); - } - - [customInspectSymbol](depth: any, inspectOptions: any, inspect: any) { - return JSON.stringify({ raw: this.toString(), decimals: this.decimals }); - } -} + return this.bigNumber[command](fullNum); + } + + operate(command: 'div' | 'plus', value: string | number) { + const bn = new BigNumber(Number(value).toFixed(6)); + return new MyNumber(this.bigNumber[command](bn).toFixed(0), this.decimals); + } + + subtract(value: MyNumber) { + const bn = this.bigNumber.minus(value.bigNumber); + return new MyNumber(bn.toString(), this.decimals); + } + + static min(a: MyNumber, b: MyNumber) { + if (a.decimals !== b.decimals) { + const diff = Math.abs(a.decimals - b.decimals); + if (a.decimals > b.decimals) { + b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); + } else { + a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); + } + } + const bn = BigNumber.min(a.bigNumber, b.bigNumber); + return new MyNumber( + bn.toString(), + a.decimals > b.decimals ? a.decimals : b.decimals, + ); + } + + static max(a: MyNumber, b: MyNumber) { + if (a.decimals !== b.decimals) { + const diff = Math.abs(a.decimals - b.decimals); + if (a.decimals > b.decimals) { + b = new MyNumber(b.bigNumber.times(10 ** diff).toString(), a.decimals); + } else { + a = new MyNumber(a.bigNumber.times(10 ** diff).toString(), b.decimals); + } + } + const bn = BigNumber.max(a.bigNumber, b.bigNumber); + return new MyNumber( + bn.toString(), + a.decimals > b.decimals ? a.decimals : b.decimals, + ); + } + + [customInspectSymbol](depth: any, inspectOptions: any, inspect: any) { + return JSON.stringify({ raw: this.toString(), decimals: this.decimals }); + } +} diff --git a/tsconfig.json b/tsconfig.json index c783c56..dd29771 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,28 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "sourceMap": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"], - "@public/*": ["./public/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "sourceMap": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"], + "@public/*": ["./public/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}