From 36aa4d9a384693c1796bcc235b08b8161cb8be7a Mon Sep 17 00:00:00 2001 From: Major Date: Sun, 10 Nov 2024 12:04:25 +0100 Subject: [PATCH] fix: fetch vaults --- apps/common/components/ImageWithFallback.tsx | 36 +- apps/common/hooks/useFetchYearnVaults.ts | 168 +++++---- bun.lockb | Bin 675638 -> 680706 bytes next.config.js | 362 +++++++++---------- package.json | 170 ++++----- 5 files changed, 388 insertions(+), 348 deletions(-) diff --git a/apps/common/components/ImageWithFallback.tsx b/apps/common/components/ImageWithFallback.tsx index 6dd92a4a0..116e82896 100755 --- a/apps/common/components/ImageWithFallback.tsx +++ b/apps/common/components/ImageWithFallback.tsx @@ -1,22 +1,17 @@ import React, {useState} from 'react'; import Image from 'next/image'; -import {cl} from '@builtbymom/web3/utils'; import {useUpdateEffect} from '@react-hookz/web'; import type {ImageProps} from 'next/image'; import type {CSSProperties, ReactElement} from 'react'; -type TImageWithFallback = ImageProps & { - smWidth?: number; - smHeight?: number; -}; -export function ImageWithFallback(props: TImageWithFallback): ReactElement { - const {alt, src, smWidth, smHeight, ...rest} = props; - const [imageSrc, set_imageSrc] = useState(`${src}?fallback=true`); +function ImageWithFallback(props: ImageProps & {altSrc?: string}): ReactElement { + const {alt, src, altSrc, ...rest} = props; + const [imageSrc, set_imageSrc] = useState(altSrc ? src : `${src}?fallback=true`); const [imageStyle, set_imageStyle] = useState({}); useUpdateEffect((): void => { - set_imageSrc(`${src}?fallback=true`); + set_imageSrc(altSrc ? src : `${src}?fallback=true`); set_imageStyle({}); }, [src]); @@ -24,14 +19,21 @@ export function ImageWithFallback(props: TImageWithFallback): ReactElement { {alt} { + if (altSrc && imageSrc !== `${altSrc}?fallback=true`) { + console.warn('using placeholder'); + set_imageSrc(`${altSrc}?fallback=true`); + return; + } set_imageSrc('/placeholder.png'); set_imageStyle({filter: 'opacity(0.2)'}); }} @@ -39,3 +41,5 @@ export function ImageWithFallback(props: TImageWithFallback): ReactElement { /> ); } + +export {ImageWithFallback}; diff --git a/apps/common/hooks/useFetchYearnVaults.ts b/apps/common/hooks/useFetchYearnVaults.ts index 71dea6da8..ef96f1066 100644 --- a/apps/common/hooks/useFetchYearnVaults.ts +++ b/apps/common/hooks/useFetchYearnVaults.ts @@ -9,122 +9,160 @@ import type {KeyedMutator} from 'swr'; import type {TYDaemonVault, TYDaemonVaults} from '@yearn-finance/web-lib/utils/schemas/yDaemonVaultsSchemas'; import type {TDict} from '@builtbymom/web3/types'; -/****************************************************************************** - ** The useFetchYearnVaults hook is used to fetch the vaults from the yDaemon - ** API. - ** It will fetch 3 kinds of vaults: - ** - The active vaults - ** - The vaults that are in the migration process - ** - The retired vaults - *****************************************************************************/ -function useFetchYearnVaults(chainIDs?: number[] | undefined): { +/************************************************************************************************ + ** Constants and Types for the useFetchYearnVaults hook + ** These values are used to configure the pagination and API requests + ************************************************************************************************/ +const ITEMS_PER_PAGE = 200; +const DEFAULT_CHAIN_IDS = [1, 10, 137, 250, 8453, 42161]; + +type TUseFetchYearnVaultsProps = { + chainIDs?: number[]; + shouldFetchMigrations?: boolean; + shouldFetchRetired?: boolean; +}; + +type TUseFetchYearnVaultsReturn = { vaults: TDict; vaultsMigrations: TDict; vaultsRetired: TDict; isLoading: boolean; + error: Error | null; mutate: KeyedMutator; -} { - const {yDaemonBaseUri: yDaemonBaseUriWithoutChain} = useYDaemonBaseURI(); +}; + +/************************************************************************************************ + ** Helper function to create the URL parameters for the vaults API request + ** This ensures consistency in how we build our API URLs + ************************************************************************************************/ +function getVaultsURLParams({chainIDs, page, limit}: {chainIDs: number[]; page: number; limit: number}): string { + return new URLSearchParams({ + hideAlways: 'true', + orderBy: 'featuringScore', + orderDirection: 'desc', + strategiesDetails: 'withDetails', + strategiesCondition: 'inQueue', + chainIDs: chainIDs.join(','), + limit: limit.toString(), + page: page.toString() + }).toString(); +} + +/************************************************************************************************ + ** The useFetchYearnVaults hook fetches vault data from the yDaemon API + ** It handles pagination and provides access to active, migrating, and retired vaults + ** The hook now includes proper error handling and optional fetching of migrations/retired vaults + ************************************************************************************************/ +function useFetchYearnVaults({ + chainIDs = DEFAULT_CHAIN_IDS, + shouldFetchMigrations = true, + shouldFetchRetired = true +}: TUseFetchYearnVaultsProps = {}): TUseFetchYearnVaultsReturn { + const {yDaemonBaseUri: baseUri} = useYDaemonBaseURI(); const [allVaults, set_allVaults] = useState([]); const [currentPage, set_currentPage] = useState(1); - const limit = 200; + const [error, set_error] = useState(null); + const [isLoadingMore, set_isLoadingMore] = useState(false); + // Fetch active vaults with pagination const { - data: vaults, - isLoading, - mutate + data: currentPageVaults, + isLoading: isLoadingCurrentPage, + mutate, + error: currentPageError } = useFetch({ - endpoint: `${yDaemonBaseUriWithoutChain}/vaults?${new URLSearchParams({ - hideAlways: 'true', - orderBy: 'featuringScore', - orderDirection: 'desc', - strategiesDetails: 'withDetails', - strategiesCondition: 'inQueue', - chainIDs: chainIDs ? chainIDs.join(',') : [1, 10, 137, 250, 8453, 42161].join(','), - limit: limit.toString(), - page: currentPage.toString() + endpoint: `${baseUri}/vaults?${getVaultsURLParams({ + chainIDs, + page: currentPage, + limit: ITEMS_PER_PAGE })}`, schema: yDaemonVaultsSchema }); + // Handle pagination and vault accumulation useEffect(() => { - let hasMore = true; - if (vaults) { - if (vaults.length < limit) { - hasMore = false; - } - set_allVaults(prev => [...prev, ...vaults]); - if (hasMore) { - set_currentPage(prev => prev + 1); - } + if (currentPageError) { + set_error(currentPageError); + return; } - }, [vaults]); - // const vaultsMigrations: TYDaemonVaults = useMemo(() => [], []); + if (!currentPageVaults || isLoadingMore) { + return; + } + + set_isLoadingMore(true); + set_allVaults(prev => [...prev, ...currentPageVaults]); + + const hasMore = currentPageVaults.length === ITEMS_PER_PAGE; + if (hasMore) { + set_currentPage(prev => prev + 1); + } + set_isLoadingMore(false); + }, [currentPageVaults, currentPageError, isLoadingMore]); + + // Fetch migration vaults if enabled const {data: vaultsMigrations} = useFetch({ - endpoint: `${yDaemonBaseUriWithoutChain}/vaults?${new URLSearchParams({ - chainIDs: chainIDs ? chainIDs.join(',') : [1, 10, 137, 250, 8453, 42161].join(','), - migratable: 'nodust' - })}`, + endpoint: shouldFetchMigrations + ? `${baseUri}/vaults?${new URLSearchParams({ + chainIDs: chainIDs.join(','), + migratable: 'nodust' + })}` + : null, schema: yDaemonVaultsSchema }); - // const vaultsRetired: TYDaemonVaults = useMemo(() => [], []); + // Fetch retired vaults if enabled const {data: vaultsRetired} = useFetch({ - endpoint: `${yDaemonBaseUriWithoutChain}/vaults/retired`, + endpoint: shouldFetchRetired ? `${baseUri}/vaults/retired` : null, schema: yDaemonVaultsSchema }); + // Process active vaults into dictionary const vaultsObject = useDeepCompareMemo((): TDict => { - if (!allVaults) { + if (!allVaults?.length) { return {}; } - const _vaultsObject = (allVaults || []).reduce((acc: TDict, vault): TDict => { + return allVaults.reduce((acc: TDict, vault): TDict => { if (!vault.migration.available) { acc[toAddress(vault.address)] = vault; } return acc; }, {}); - return _vaultsObject; }, [allVaults]); + // Process migration vaults into dictionary const vaultsMigrationsObject = useDeepCompareMemo((): TDict => { - if (!vaultsMigrations) { + if (!vaultsMigrations?.length) { return {}; } - const _migratableVaultsObject = (vaultsMigrations || []).reduce( - (acc: TDict, vault): TDict => { - if (toAddress(vault.address) !== toAddress(vault.migration.address)) { - acc[toAddress(vault.address)] = vault; - } - return acc; - }, - {} - ); - return _migratableVaultsObject; + return vaultsMigrations.reduce((acc: TDict, vault): TDict => { + if (toAddress(vault.address) !== toAddress(vault.migration.address)) { + acc[toAddress(vault.address)] = vault; + } + return acc; + }, {}); }, [vaultsMigrations]); + // Process retired vaults into dictionary const vaultsRetiredObject = useDeepCompareMemo((): TDict => { - if (!vaultsRetired) { + if (!vaultsRetired?.length) { return {}; } - const _retiredVaultsObject = (vaultsRetired || []).reduce( - (acc: TDict, vault): TDict => { - acc[toAddress(vault.address)] = vault; - return acc; - }, - {} - ); - return _retiredVaultsObject; + return vaultsRetired.reduce((acc: TDict, vault): TDict => { + acc[toAddress(vault.address)] = vault; + return acc; + }, {}); }, [vaultsRetired]); return { vaults: vaultsObject, vaultsMigrations: vaultsMigrationsObject, vaultsRetired: vaultsRetiredObject, - isLoading, + isLoading: isLoadingCurrentPage || isLoadingMore, + error, mutate }; } export {useFetchYearnVaults}; +export type {TUseFetchYearnVaultsProps, TUseFetchYearnVaultsReturn}; diff --git a/bun.lockb b/bun.lockb index 57ae287545002951240396a464d033bd28922dea..48ba0101ceba48748710f0ab8a28e23462035ee6 100755 GIT binary patch delta 46807 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

fo*RoGGiAaze{ z#q(-b-Jp^+$)^BmzIj-Fvov9kW4(Rs#=}fvG3Tz6k>Cmwy(pt)u86*ocwx&*-$guq z<_fKtE!oV9?ztjhi4Or3)Q>MjgM-%f=lv)|&Fh2}=uoiBW6Rzlivy43%wbU!WdP!= zLa|2xIZXz+3%m~%s}Y^XW>Bk|PZmB=h^Mw<)Y~Ul4bFVqB%P@q68n96t|FZ(-4G96 zup?)8KE~X+L2j_4UGA`MQHYrTm%m=ud*fz@J!iVkdtA&N{^+S^wn^QllqPeaGyy8| zz^5v#>9g6vP$=-6M2Nt*EUavGaFT3X)i31)P*@iTJ~avd)KP;owEXnznKjkl{;Yqx zn!{U3+|QtwXeA9AfSoN>Qqn-g&iDZ^<3tc-NjaR~H~dIP*pwdd6!Xf_v->JD#@=V1 z!BPt-ZBx>z0Wg9zK(JyUH>)&gW0Lk<5AI>CFt3`r@1o)3VjWekS{RXNQ8l5?lrC3M1JuGp|8e=+hQ^MWkWB{=u$)8#U0AY;_?6u-J z#j|$S7FSC31W}X{-?3-Q_{Vmao?ai!dkb^boT-Xjv?_LKd?McQO;3LJnCei6O7foC z@Y!HqA>ka|>F^K;TkcNY&+}QH9r*T>or6^1OfM+M=SR`IF2h$s66S)aA5;Q$Jr4=Q zR*I2p5U67)zmH4NP}(reU)50IFi3_H``$1l(Mk;v0kM%DM^cv43qU)xzIbNF3xr~mMt^dMI5NR`Xv3X;Xi9q80@x&5Cd~i< delta 44235 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 diff --git a/next.config.js b/next.config.js index 7757019f5..7de872b86 100755 --- a/next.config.js +++ b/next.config.js @@ -1,195 +1,193 @@ // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars const {withPlausibleProxy} = require('next-plausible'); /* eslint-disable @typescript-eslint/explicit-function-return-type */ -const withPWA = require('next-pwa')({ - dest: 'public', - disable: process.env.NODE_ENV !== 'production' -}); +// const withPWA = require('next-pwa')({ +// dest: 'public', +// disable: process.env.NODE_ENV !== 'production' +// }); module.exports = withPlausibleProxy({ scriptName: 'script', customDomain: 'https://yearn.fi' -})( - withPWA({ - images: { - remotePatterns: [ - { - protocol: 'https', - hostname: 'rawcdn.githack.com' - }, - { - protocol: 'https', - hostname: 'raw.githubusercontent.com' - }, - { - protocol: 'https', - hostname: 'assets.smold.app' - }, - { - protocol: 'https', - hostname: '**.yearn.fi' - } - ] - }, - async rewrites() { - return [ - { - source: '/js/script.js', - destination: 'https://plausible.io/js/script.js' - }, - { - source: '/api/event', - destination: 'https://plausible.io/api/event' - } - ]; - }, - redirects() { - return [ - { - source: '/ybribe/:path*', - destination: 'https://ybribe.yearn.fi/:path*', - permanent: true - }, - { - source: '/ycrv/:path*', - destination: 'https://ycrv.yearn.fi/:path*', - permanent: true - }, - { - source: '/veyfi/:path*', - destination: 'https://veyfi.yearn.fi/:path*', - permanent: true - }, - { - source: '/vaults/factory/:path*', - destination: 'https://factory.yearn.fi/:path*', - permanent: true - }, - { - source: '/:path*', - has: [{type: 'host', value: 'vote.yearn.fi'}], - destination: 'https://yearn.fi/veyfi/:path*', - permanent: true - }, - // - { - source: '/twitter', - destination: 'https://twitter.com/yearnfi', - permanent: true - }, - { - source: '/telegram', - destination: 'https://t.me/yearnfinance/', - permanent: true - }, - { - source: '/medium', - destination: 'https://medium.com/iearn', - permanent: true - }, - { - source: '/governance', - destination: 'https://gov.yearn.fi/', - permanent: true - }, - { - source: '/snapshot', - destination: 'https://snapshot.org/#/veyfi.eth', - permanent: true - }, - { - source: '/github', - destination: 'https://github.com/yearn/yearn.fi', - permanent: true - }, - { - source: '/static/tokenlist.json', - destination: 'https://raw.githubusercontent.com/SmolDapp/tokenLists/main/lists/yearn.json', - permanent: true - } - ]; - }, - env: { - /* 🔵 - Yearn Finance ************************************************** - ** Config over the RPC - **********************************************************************/ - RPC_URI_FOR: { - /********************************************************************************** - ** New RPC Setup for mainnet networks - *********************************************************************************/ - 1: process.env.RPC_URI_FOR_1, - 10: process.env.RPC_URI_FOR_10, - 56: process.env.RPC_URI_FOR_56, - 100: process.env.RPC_URI_FOR_100, - 137: process.env.RPC_URI_FOR_137, - 250: process.env.RPC_URI_FOR_250, - 252: process.env.RPC_URI_FOR_252, - 288: process.env.RPC_URI_FOR_288, - 8453: process.env.RPC_URI_FOR_8453, - 42161: process.env.RPC_URI_FOR_42161, - 42170: process.env.RPC_URI_FOR_42170, - 56288: process.env.RPC_URI_FOR_56288, - 81457: process.env.RPC_URI_FOR_81457, - 111188: process.env.RPC_URI_FOR_111188, - - /********************************************************************************** - ** New RPC Setup for testnet networks - *********************************************************************************/ - 97: process.env.RPC_URL_BINANCE_TESTNET, - 400: process.env.RPC_URL_OPTIMISM_GOERLI, - 2522: process.env.RPC_URI_FOR_2522, - 9728: process.env.RPC_URI_FOR_9728, - 17000: process.env.RPC_URI_FOR_17000, - 18233: process.env.RPC_URI_FOR_18233, - 28882: process.env.RPC_URI_FOR_28882, - 80001: process.env.RPC_URI_FOR_80001, - 84532: process.env.RPC_URI_FOR_84532, - 421614: process.env.RPC_URI_FOR_421614, - 11155111: process.env.RPC_URI_FOR_11155111, - 11155420: process.env.RPC_URI_FOR_11155420 +})({ + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'rawcdn.githack.com' + }, + { + protocol: 'https', + hostname: 'raw.githubusercontent.com' + }, + { + protocol: 'https', + hostname: 'assets.smold.app' + }, + { + protocol: 'https', + hostname: '**.yearn.fi' + } + ] + }, + async rewrites() { + return [ + { + source: '/js/script.js', + destination: 'https://plausible.io/js/script.js' + }, + { + source: '/api/event', + destination: 'https://plausible.io/api/event' + } + ]; + }, + redirects() { + return [ + { + source: '/ybribe/:path*', + destination: 'https://ybribe.yearn.fi/:path*', + permanent: true + }, + { + source: '/ycrv/:path*', + destination: 'https://ycrv.yearn.fi/:path*', + permanent: true + }, + { + source: '/veyfi/:path*', + destination: 'https://veyfi.yearn.fi/:path*', + permanent: true + }, + { + source: '/vaults/factory/:path*', + destination: 'https://factory.yearn.fi/:path*', + permanent: true + }, + { + source: '/:path*', + has: [{type: 'host', value: 'vote.yearn.fi'}], + destination: 'https://yearn.fi/veyfi/:path*', + permanent: true }, + // + { + source: '/twitter', + destination: 'https://twitter.com/yearnfi', + permanent: true + }, + { + source: '/telegram', + destination: 'https://t.me/yearnfinance/', + permanent: true + }, + { + source: '/medium', + destination: 'https://medium.com/iearn', + permanent: true + }, + { + source: '/governance', + destination: 'https://gov.yearn.fi/', + permanent: true + }, + { + source: '/snapshot', + destination: 'https://snapshot.org/#/veyfi.eth', + permanent: true + }, + { + source: '/github', + destination: 'https://github.com/yearn/yearn.fi', + permanent: true + }, + { + source: '/static/tokenlist.json', + destination: 'https://raw.githubusercontent.com/SmolDapp/tokenLists/main/lists/yearn.json', + permanent: true + } + ]; + }, + env: { + /* 🔵 - Yearn Finance ************************************************** + ** Config over the RPC + **********************************************************************/ + RPC_URI_FOR: { /********************************************************************************** - ** Legacy RPC configuration, mainnet and testnet + ** New RPC Setup for mainnet networks *********************************************************************************/ - JSON_RPC_URL: { - 1: process.env.RPC_URI_FOR_1, - 10: process.env.RPC_URI_FOR_10, - 56: process.env.RPC_URI_FOR_56, - 97: process.env.RPC_URL_FOR_97, - 137: process.env.RPC_URL_FOR_137, - 250: process.env.RPC_URL_FOR_250, - 420: process.env.RPC_URL_FOR_420, - 8453: process.env.RPC_URL_FOR_8453, - 80001: process.env.RPC_URL_FOR_80001, - 42161: process.env.RPC_URL_FOR_42161, - 11155111: process.env.RPC_URL_FOR_11155111 - }, - RPC_URI_FOR_1: process.env.RPC_URI_FOR_1, - RPC_URI_FOR_10: process.env.RPC_URI_FOR_10, - RPC_URI_FOR_137: process.env.RPC_URI_FOR_137, - RPC_URI_FOR_252: process.env.RPC_URI_FOR_252, - RPC_URI_FOR_288: process.env.RPC_URI_FOR_288, - RPC_URI_FOR_8453: process.env.RPC_URI_FOR_8453, - RPC_URI_FOR_42161: process.env.RPC_URI_FOR_42161, - RPC_URI_FOR_42170: process.env.RPC_URI_FOR_42170, - RPC_URI_FOR_56288: process.env.RPC_URI_FOR_56288, - RPC_URI_FOR_81457: process.env.RPC_URI_FOR_81457, - RPC_URI_FOR_111188: process.env.RPC_URI_FOR_111188, + 1: process.env.RPC_URI_FOR_1, + 10: process.env.RPC_URI_FOR_10, + 56: process.env.RPC_URI_FOR_56, + 100: process.env.RPC_URI_FOR_100, + 137: process.env.RPC_URI_FOR_137, + 250: process.env.RPC_URI_FOR_250, + 252: process.env.RPC_URI_FOR_252, + 288: process.env.RPC_URI_FOR_288, + 8453: process.env.RPC_URI_FOR_8453, + 42161: process.env.RPC_URI_FOR_42161, + 42170: process.env.RPC_URI_FOR_42170, + 56288: process.env.RPC_URI_FOR_56288, + 81457: process.env.RPC_URI_FOR_81457, + 111188: process.env.RPC_URI_FOR_111188, - ALCHEMY_KEY: process.env.ALCHEMY_KEY, - ALCHEMY_API_KEY: process.env.ALCHEMY_API_KEY, - INFURA_PROJECT_ID: process.env.INFURA_PROJECT_ID, - WALLETCONNECT_PROJECT_ID: process.env.WALLETCONNECT_PROJECT_ID, + /********************************************************************************** + ** New RPC Setup for testnet networks + *********************************************************************************/ + 97: process.env.RPC_URL_BINANCE_TESTNET, + 400: process.env.RPC_URL_OPTIMISM_GOERLI, + 2522: process.env.RPC_URI_FOR_2522, + 9728: process.env.RPC_URI_FOR_9728, + 17000: process.env.RPC_URI_FOR_17000, + 18233: process.env.RPC_URI_FOR_18233, + 28882: process.env.RPC_URI_FOR_28882, + 80001: process.env.RPC_URI_FOR_80001, + 84532: process.env.RPC_URI_FOR_84532, + 421614: process.env.RPC_URI_FOR_421614, + 11155111: process.env.RPC_URI_FOR_11155111, + 11155420: process.env.RPC_URI_FOR_11155420 + }, + /********************************************************************************** + ** Legacy RPC configuration, mainnet and testnet + *********************************************************************************/ + JSON_RPC_URL: { + 1: process.env.RPC_URI_FOR_1, + 10: process.env.RPC_URI_FOR_10, + 56: process.env.RPC_URI_FOR_56, + 97: process.env.RPC_URL_FOR_97, + 137: process.env.RPC_URL_FOR_137, + 250: process.env.RPC_URL_FOR_250, + 420: process.env.RPC_URL_FOR_420, + 8453: process.env.RPC_URL_FOR_8453, + 80001: process.env.RPC_URL_FOR_80001, + 42161: process.env.RPC_URL_FOR_42161, + 11155111: process.env.RPC_URL_FOR_11155111 + }, + RPC_URI_FOR_1: process.env.RPC_URI_FOR_1, + RPC_URI_FOR_10: process.env.RPC_URI_FOR_10, + RPC_URI_FOR_137: process.env.RPC_URI_FOR_137, + RPC_URI_FOR_252: process.env.RPC_URI_FOR_252, + RPC_URI_FOR_288: process.env.RPC_URI_FOR_288, + RPC_URI_FOR_8453: process.env.RPC_URI_FOR_8453, + RPC_URI_FOR_42161: process.env.RPC_URI_FOR_42161, + RPC_URI_FOR_42170: process.env.RPC_URI_FOR_42170, + RPC_URI_FOR_56288: process.env.RPC_URI_FOR_56288, + RPC_URI_FOR_81457: process.env.RPC_URI_FOR_81457, + RPC_URI_FOR_111188: process.env.RPC_URI_FOR_111188, + + ALCHEMY_KEY: process.env.ALCHEMY_KEY, + ALCHEMY_API_KEY: process.env.ALCHEMY_API_KEY, + INFURA_PROJECT_ID: process.env.INFURA_PROJECT_ID, + WALLETCONNECT_PROJECT_ID: process.env.WALLETCONNECT_PROJECT_ID, - PARTNER_ID_ADDRESS: '0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52', - SHOULD_USE_PARTNER_CONTRACT: true, - RANGE_LIMIT: 1_000_000, + PARTNER_ID_ADDRESS: '0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52', + SHOULD_USE_PARTNER_CONTRACT: true, + RANGE_LIMIT: 1_000_000, - YDAEMON_BASE_URI: process.env.YDAEMON_BASE_URI, - // YDAEMON_BASE_URI: 'http://localhost:8080', - BASE_YEARN_ASSETS_URI: 'https://assets.smold.app/api/token', - BASE_YEARN_CHAIN_URI: 'https://assets.smold.app/api/chain', - SMOL_ASSETS_URL: 'https://assets.smold.app/api' - } - }) -); + YDAEMON_BASE_URI: process.env.YDAEMON_BASE_URI, + // YDAEMON_BASE_URI: 'http://localhost:8080', + BASE_YEARN_ASSETS_URI: 'https://assets.smold.app/api/token', + BASE_YEARN_CHAIN_URI: 'https://assets.smold.app/api/chain', + SMOL_ASSETS_URL: 'https://assets.smold.app/api' + } +}); diff --git a/package.json b/package.json index b8691e364..ff5993f0e 100644 --- a/package.json +++ b/package.json @@ -1,87 +1,87 @@ { - "name": "yearnfi", - "version": "0.3.7", - "scripts": { - "dev": "next", - "inspect": "NODE_OPTIONS='--inspect' next", - "dev:ts": "tsc --watch", - "start": "tsc && next build && next start", - "build": "tsc && next build", - "export": "tsc && next build && next export -o ipfs", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx", - "prettier": "prettier --check \"./**/**/*.{json,js,ts,tsx,scss}\"", - "prettier-format": "prettier --config .prettierrc \"./**/**/*.{json,js,ts,tsx,scss,md}\" --write", - "tslint": "tsc -p tsconfig.json --noEmit", - "bump": "bump", - "test": "vitest run" - }, - "dependencies": { - "@builtbymom/web3": "0.0.202", - "@cowprotocol/cow-sdk": "2.1.0", - "@headlessui/react": "^2.0.4", - "@rainbow-me/rainbowkit": "2.1.3", - "@tailwindcss/typography": "^0.5.13", - "@tanstack/react-query": "^5.51.11", - "@wagmi/core": "^2.11.7", - "@yearn-finance/web-lib": "^4.1.4", - "axios": "^1.7.2", - "ethers": "5.7.2", - "framer-motion": "^11.2.10", - "graphql": "^16.8.2", - "graphql-request": "^7.0.1", - "next": "^14.2.5", - "next-plausible": "^3.12.0", - "next-pwa": "^5.6.0", - "nprogress": "^0.2.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-paginate": "^8.2.0", - "recharts": "^2.12.7", - "swr": "^2.2.5", - "viem": "2.17.3", - "vite": "^5.2.13", - "wagmi": "2.10.10", - "xxhashjs": "^0.2.2", - "zod": "^3.23.8" - }, - "devDependencies": { - "@next/bundle-analyzer": "^14.2.4", - "@next/eslint-plugin-next": "^14.2.4", - "@testing-library/react": "^16.0.0", - "@types/node": "^20.14.2", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^7.13.0", - "@typescript-eslint/parser": "^7.13.0", - "@vitejs/plugin-react": "^4.3.1", - "autoprefixer": "^10.4.19", - "babel-loader": "^9.1.3", - "bump": "^0.2.5", - "eslint": "^8.57.0", - "eslint-config-next": "^14.2.4", - "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-brackets": "^0.1.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.2", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-simple-import-sort": "^12.1.0", - "eslint-plugin-tailwindcss": "^3.17.3", - "eslint-plugin-unused-imports": "^4.0.0", - "husky": "^9.0.11", - "lint-staged": "^15.2.7", - "next-transpile-modules": "^10.0.1", - "postcss": "^8.4.38", - "postcss-import": "^16.1.0", - "postcss-nesting": "^12.1.5", - "prettier": "^3.3.2", - "sass": "^1.77.5", - "stylelint": "^16.6.1", - "stylelint-config-standard": "^36.0.0", - "tailwindcss": "^3.4.4", - "ts-loader": "^9.5.1", - "typescript": "^5.5.3", - "vitest": "^1.6.0", - "webpack": "^5.92.1" - } + "name": "yearnfi", + "version": "0.3.7", + "scripts": { + "dev": "next", + "inspect": "NODE_OPTIONS='--inspect' next", + "dev:ts": "tsc --watch", + "start": "tsc && next build && next start", + "build": "tsc && next build", + "export": "tsc && next build && next export -o ipfs", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "prettier": "prettier --check \"./**/**/*.{json,js,ts,tsx,scss}\"", + "prettier-format": "prettier --config .prettierrc \"./**/**/*.{json,js,ts,tsx,scss,md}\" --write", + "tslint": "tsc -p tsconfig.json --noEmit", + "bump": "bump", + "test": "vitest run" + }, + "dependencies": { + "@builtbymom/web3": "0.0.202", + "@cowprotocol/cow-sdk": "2.1.0", + "@headlessui/react": "^2.0.4", + "@rainbow-me/rainbowkit": "2.1.3", + "@tailwindcss/typography": "^0.5.13", + "@tanstack/react-query": "^5.51.11", + "@wagmi/core": "^2.11.7", + "@yearn-finance/web-lib": "^4.1.4", + "axios": "^1.7.2", + "ethers": "5.7.2", + "framer-motion": "^11.2.10", + "graphql": "^16.8.2", + "graphql-request": "^7.0.1", + "next": "^15.0.3", + "next-plausible": "^3.12.0", + "next-pwa": "^5.6.0", + "nprogress": "^0.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-paginate": "^8.2.0", + "recharts": "^2.12.7", + "swr": "^2.2.5", + "viem": "2.17.3", + "vite": "^5.2.13", + "wagmi": "2.10.10", + "xxhashjs": "^0.2.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "@next/bundle-analyzer": "^14.2.4", + "@next/eslint-plugin-next": "^14.2.4", + "@testing-library/react": "^16.0.0", + "@types/node": "^20.14.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.13.0", + "@typescript-eslint/parser": "^7.13.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.19", + "babel-loader": "^9.1.3", + "bump": "^0.2.5", + "eslint": "^8.57.0", + "eslint-config-next": "^14.2.4", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-brackets": "^0.1.3", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-tailwindcss": "^3.17.3", + "eslint-plugin-unused-imports": "^4.0.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.7", + "next-transpile-modules": "^10.0.1", + "postcss": "^8.4.38", + "postcss-import": "^16.1.0", + "postcss-nesting": "^12.1.5", + "prettier": "^3.3.2", + "sass": "^1.77.5", + "stylelint": "^16.6.1", + "stylelint-config-standard": "^36.0.0", + "tailwindcss": "^3.4.4", + "ts-loader": "^9.5.1", + "typescript": "^5.5.3", + "vitest": "^1.6.0", + "webpack": "^5.92.1" + } }