diff --git a/components/MarketsList/Item/index.tsx b/components/MarketsList/Item/index.tsx index 2e1383b8a..09393e89e 100644 --- a/components/MarketsList/Item/index.tsx +++ b/components/MarketsList/Item/index.tsx @@ -93,10 +93,10 @@ function Item({ market, type, fixedMarketData }: Props) { } try { - const fixedMarket = fixedMarketData?.find((element) => element.market == market.market); + const fixedMarket = fixedMarketData?.find((element) => element.market === market.market); - if (type == 'borrow') { - const pool = fixedMarket?.borrows.find((pool) => pool.maturity.toString() == date?.value); + if (type === 'borrow') { + const pool = fixedMarket?.borrows.find((pool) => pool.maturity.toString() === date?.value); if (!fixedMarket || !pool) return; const initialAssets = fixedMarket.assets; @@ -114,8 +114,8 @@ function Item({ market, type, fixedMarketData }: Props) { } else { setRate(`${borrowFixedAPY.toFixed(2)}%`); } - } else if (type == 'deposit') { - const pool = fixedMarket?.deposits.find((pool) => pool.maturity.toString() == date?.value); + } else if (type === 'deposit') { + const pool = fixedMarket?.deposits.find((pool) => pool.maturity.toString() === date?.value); if (!fixedMarket || !pool) return; const initialAssets = fixedMarket.assets; diff --git a/components/MarketsList/index.tsx b/components/MarketsList/index.tsx index 1bc8ebd10..3be21a212 100644 --- a/components/MarketsList/index.tsx +++ b/components/MarketsList/index.tsx @@ -1,6 +1,7 @@ import { useContext, useEffect, useState } from 'react'; -import { parseFixed } from '@ethersproject/bignumber'; +import { formatFixed, parseFixed } from '@ethersproject/bignumber'; import dynamic from 'next/dynamic'; +import { captureMessage } from '@sentry/nextjs'; const Item = dynamic(() => import('components/MarketsList/Item')); import Tooltip from 'components/Tooltip'; @@ -22,6 +23,7 @@ import keys from './translations.json'; import formatMarkets from 'utils/formatMarkets'; import numbers from 'config/numbers.json'; +const { usdAmount, maxAPYValue, minAPYValue } = numbers; function MarketsList() { const previewerData = useContext(PreviewerContext); @@ -53,6 +55,57 @@ function MarketsList() { } } + const checkWeirdAPY = (marketsData: any) => { + if (!markets.length) return; // not ready to do the check yet + + const findings = []; + // iterate through every market asset + for (let index = 0; index < marketsData.length; index++) { + const marketData = marketsData[index]; + const { + borrows: borrowPools, + deposits: depositPools, + assets: initialAssets, + market: marketAddress + } = marketData; + const { name: marketName } = markets.find( + ({ market }) => market.toLowerCase() === marketAddress.toLowerCase() + )!; + // iterate through every borrow & deposit pools - parallel arrays + for (let j = 0; j < borrowPools.length; j++) { + const { assets: borrowFinalAssets, maturity: timestampEnd } = borrowPools[j]; + const { assets: depositFinalAssets } = depositPools[j]; + + const timestampNow = new Date().getTime() / 1_000; + + // 31_536_000 = seconds in 1 year + const timePerYear = 31_536_000 / (timestampEnd - timestampNow); + + const borrowRate = borrowFinalAssets.mul(parseFixed('1', 18)).div(initialAssets); + const borrowFixedAPY = (Number(formatFixed(borrowRate, 18)) ** timePerYear - 1) * 100; + + const depositRate = depositFinalAssets.mul(parseFixed('1', 18)).div(initialAssets); + const depositFixedAPY = (Number(formatFixed(depositRate, 18)) ** timePerYear - 1) * 100; + + if (depositFixedAPY > borrowFixedAPY) { + findings.push(`Market: ${marketName} -> deposit APY > borrow APY.`); + } + + if (depositFixedAPY > maxAPYValue || borrowFixedAPY > maxAPYValue) { + findings.push(`Market: ${marketName} -> APY > ${maxAPYValue}%`); + } + + if (depositFixedAPY < minAPYValue || borrowFixedAPY < minAPYValue) { + findings.push(`Market: ${marketName} -> APY < ${minAPYValue}%`); + } + } + } + + if (findings.length) { + captureMessage(`Weird Fixed APYs | ${findings.join(' | ')}`); + } + }; + async function getPreviewFixed() { try { const previewerContract = getInstance( @@ -61,11 +114,12 @@ function MarketsList() { 'previewer' ); - const data = await previewerContract?.previewFixed( - parseFixed(numbers.usdAmount.toString(), 18) + const marketData = await previewerContract?.previewFixed( + parseFixed(usdAmount.toString(), 18) ); - setFixedMarketData(data); + checkWeirdAPY(marketData); + setFixedMarketData(marketData); } catch (e) { console.log(e); } diff --git a/components/SmartPoolList/Item/index.tsx b/components/SmartPoolList/Item/index.tsx index 87a3429e8..2b15ca808 100644 --- a/components/SmartPoolList/Item/index.tsx +++ b/components/SmartPoolList/Item/index.tsx @@ -53,7 +53,7 @@ function Item({ market, type }: Props) { async function getFixedLenderContract() { if (!market) return; - const filteredFixedLender = fixedLenderData.find((fl) => fl.address == market.market); + const filteredFixedLender = fixedLenderData.find((fl) => fl.address === market.market); setEMarketAddress(filteredFixedLender?.address); } @@ -90,20 +90,20 @@ function Item({ market, type }: Props) { if (!eMarketAddress) return; - if (type == 'deposit') { + if (type === 'deposit') { const maxFuturePools = accountData[market?.symbol.toUpperCase()].maxFuturePools; const data = await queryRate(subgraphUrl, eMarketAddress, 'deposit', { maxFuturePools }); interestRate = data[0].rate.toFixed(2); } - if (type == 'borrow') { + if (type === 'borrow') { const data = await queryRate(subgraphUrl, eMarketAddress, 'borrow'); interestRate = data[0].rate.toFixed(2); } - if (interestRate && rate && `${interestRate}%` == rate) { + if (interestRate && rate && `${interestRate}%` === rate) { return; } @@ -163,10 +163,10 @@ function Item({ market, type }: Props) { return (
- +
{(market && ( }

@@ -193,12 +193,12 @@ function Item({ market, type }: Props) {
{(market && (
diff --git a/config/numbers.json b/config/numbers.json index 31814710b..e6e076f97 100644 --- a/config/numbers.json +++ b/config/numbers.json @@ -9,5 +9,5 @@ "gasLimitMultiplier": 1.25, "debounceTime": 500, "minAPYValue": 0, - "maxAPYValue": 100 + "maxAPYValue": 30 }