From e042010540f672606bf5aadcce6959fdab7f01fe Mon Sep 17 00:00:00 2001 From: FiboApe <94012134+FiboApe@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:08:57 -0300 Subject: [PATCH] feat(mean-finance): Improve Mean Finance label to show position info (#781) --- src/apps/mean-finance/helpers/intervals.ts | 40 +++++++++++++++---- .../optimism/mean-finance.balance-fetcher.ts | 25 +++++++++--- ....dca-position.contract-position-fetcher.ts | 25 +++++++++--- .../optimism/mean-finance.tvl-fetcher.ts | 4 +- .../polygon/mean-finance.balance-fetcher.ts | 27 ++++++++++--- ....dca-position.contract-position-fetcher.ts | 26 +++++++++--- .../polygon/mean-finance.tvl-fetcher.ts | 4 +- src/position/position.utils.ts | 12 +++--- 8 files changed, 127 insertions(+), 36 deletions(-) diff --git a/src/apps/mean-finance/helpers/intervals.ts b/src/apps/mean-finance/helpers/intervals.ts index 8d94809fb..03e8ad155 100644 --- a/src/apps/mean-finance/helpers/intervals.ts +++ b/src/apps/mean-finance/helpers/intervals.ts @@ -27,12 +27,36 @@ const ONE_DAY = FOUR_HOURS * 6; const ONE_WEEK = ONE_DAY * 7; export const STRING_SWAP_INTERVALS = { - [ONE_MINUTE]: (left: number) => `${toReadable(left, ONE_MINUTE)} (${left} swaps)`, - [FIVE_MINUTES]: (left: number) => `${toReadable(left, FIVE_MINUTES)} (${left} swaps)`, - [FIFTEEN_MINUTES]: (left: number) => `${toReadable(left, FIFTEEN_MINUTES)} (${left} swaps)`, - [THIRTY_MINUTES]: (left: number) => `${toReadable(left, THIRTY_MINUTES)} (${left} swaps)`, - [ONE_HOUR]: (left: number) => `${toReadable(left, ONE_HOUR)} (${left} swaps)`, - [FOUR_HOURS]: (left: number) => `${toReadable(left, FOUR_HOURS)} (${left} swaps)`, - [ONE_DAY]: (left: number) => `${toReadable(left, ONE_DAY)} (${left} swaps)`, - [ONE_WEEK]: (left: number) => `${toReadable(left, ONE_WEEK)} (${left} swaps)`, + [ONE_MINUTE]: { + plural: (left: number) => `${toReadable(left, ONE_MINUTE)} (${left} swaps)`, + adverb: 'every 1 minute', + }, + [FIVE_MINUTES]: { + plural: (left: number) => `${toReadable(left, FIVE_MINUTES)} (${left} swaps)`, + adverb: 'every 5 minutes', + }, + [FIFTEEN_MINUTES]: { + plural: (left: number) => `${toReadable(left, FIFTEEN_MINUTES)} (${left} swaps)`, + adverb: 'every 15 minutes', + }, + [THIRTY_MINUTES]: { + plural: (left: number) => `${toReadable(left, THIRTY_MINUTES)} (${left} swaps)`, + adverb: 'every 30 minutes', + }, + [ONE_HOUR]: { + plural: (left: number) => `${toReadable(left, ONE_HOUR)} (${left} swaps)`, + adverb: 'every hour', + }, + [FOUR_HOURS]: { + plural: (left: number) => `${toReadable(left, FOUR_HOURS)} (${left} swaps)`, + adverb: 'every 4 hours', + }, + [ONE_DAY]: { + plural: (left: number) => `${toReadable(left, ONE_DAY)} (${left} swaps)`, + adverb: 'every day', + }, + [ONE_WEEK]: { + plural: (left: number) => `${toReadable(left, ONE_WEEK)} (${left} swaps)`, + adverb: 'every week', + }, }; diff --git a/src/apps/mean-finance/optimism/mean-finance.balance-fetcher.ts b/src/apps/mean-finance/optimism/mean-finance.balance-fetcher.ts index cae0a6faf..16d25a17e 100644 --- a/src/apps/mean-finance/optimism/mean-finance.balance-fetcher.ts +++ b/src/apps/mean-finance/optimism/mean-finance.balance-fetcher.ts @@ -10,6 +10,8 @@ import { BalanceFetcher } from '~balance/balance-fetcher.interface'; import { ContractType } from '~position/contract.interface'; import { WithMetaType } from '~position/display.interface'; import { BaseTokenBalance, ContractPositionBalance } from '~position/position-balance.interface'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; import { Network } from '~types/network.interface'; import { getUserPositions } from '../helpers/graph'; @@ -36,8 +38,15 @@ export class OptimismMeanFinanceBalanceFetcher implements BalanceFetcher { const contractPositionBalances: ContractPositionBalance[] = positions.map(dcaPosition => { const toWithdraw = dcaPosition.current.idleSwapped; const remainingLiquidity = dcaPosition.current.remainingLiquidity; - const remainingSwaps = dcaPosition.current.remainingSwaps; - const swapInterval = dcaPosition.swapInterval.interval; + const remainingSwaps = Number(dcaPosition.current.remainingSwaps); + const swapInterval = Number(dcaPosition.swapInterval.interval) as keyof typeof STRING_SWAP_INTERVALS; + const rawRate = dcaPosition.current.rate; + const rate = Number(rawRate) / 10 ** Number(dcaPosition.from.decimals); + let formattedRate = rate.toFixed(3); + + if (rate < 0.001) { + formattedRate = '<0.001' + } const from = baseTokens.find(v => v.address === dcaPosition.from.address); const to = baseTokens.find(v => v.address === dcaPosition.to.address); @@ -54,7 +63,7 @@ export class OptimismMeanFinanceBalanceFetcher implements BalanceFetcher { } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); images = [ ...images, ...getImagesFromToken(to), @@ -62,9 +71,15 @@ export class OptimismMeanFinanceBalanceFetcher implements BalanceFetcher { } const balanceUSD = sumBy(tokens, t => t.balanceUSD); + const swapIntervalAdverb = STRING_SWAP_INTERVALS[swapInterval].adverb; + let label = ''; - const label = `Swapping ${from?.symbol} to ${to?.symbol}`; - const secondaryLabel = parseInt(remainingSwaps, 10) && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval](remainingSwaps)} left` : 'Position finished'; + if (remainingSwaps > 0) { + label = `Swapping ~${formattedRate} ${from?.symbol || dcaPosition.from.symbol} ${swapIntervalAdverb} to ${to?.symbol || dcaPosition.from.symbol}`; + } else { + label = `Swapping ${from?.symbol || dcaPosition.from.symbol} to ${to?.symbol || dcaPosition.from.symbol}`; + } + const secondaryLabel = remainingSwaps && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval].plural(remainingSwaps)} left` : 'Position finished'; return { type: ContractType.POSITION, diff --git a/src/apps/mean-finance/optimism/mean-finance.dca-position.contract-position-fetcher.ts b/src/apps/mean-finance/optimism/mean-finance.dca-position.contract-position-fetcher.ts index 3ffd8b980..ff2dc4044 100644 --- a/src/apps/mean-finance/optimism/mean-finance.dca-position.contract-position-fetcher.ts +++ b/src/apps/mean-finance/optimism/mean-finance.dca-position.contract-position-fetcher.ts @@ -10,6 +10,8 @@ import { WithMetaType } from '~position/display.interface'; import { BaseTokenBalance } from '~position/position-balance.interface'; import { PositionFetcher } from '~position/position-fetcher.interface'; import { ContractPosition } from '~position/position.interface'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; import { Network } from '~types/network.interface'; import { MeanFinanceContractFactory } from '../contracts'; @@ -37,8 +39,15 @@ export class OptimismMeanFinanceDcaPositionContractPositionFetcher implements Po const contractPositions: ContractPosition[] = positions.map(dcaPosition => { const toWithdraw = dcaPosition.current.idleSwapped; const remainingLiquidity = dcaPosition.current.remainingLiquidity; - const remainingSwaps = dcaPosition.current.remainingSwaps; - const swapInterval = dcaPosition.swapInterval.interval; + const remainingSwaps = Number(dcaPosition.current.remainingSwaps); + const swapInterval = Number(dcaPosition.swapInterval.interval) as keyof typeof STRING_SWAP_INTERVALS; + const rawRate = dcaPosition.current.rate; + const rate = Number(rawRate) / 10 ** Number(dcaPosition.from.decimals); + let formattedRate = rate.toFixed(3); + + if (rate < 0.001) { + formattedRate = '<0.001' + } const from = baseTokens.find(v => v.address === dcaPosition.from.address); const to = baseTokens.find(v => v.address === dcaPosition.to.address); @@ -55,7 +64,7 @@ export class OptimismMeanFinanceDcaPositionContractPositionFetcher implements Po } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); images = [ ...images, ...getImagesFromToken(to), @@ -63,10 +72,16 @@ export class OptimismMeanFinanceDcaPositionContractPositionFetcher implements Po } const balanceUSD = sumBy(tokens, t => t.balanceUSD); + const swapIntervalAdverb = STRING_SWAP_INTERVALS[swapInterval].adverb; + let label = ''; - const label = `Swapping ${from?.symbol} to ${to?.symbol}`; - const secondaryLabel = parseInt(remainingSwaps, 10) && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval](remainingSwaps)} left` : 'Position finished'; + if (remainingSwaps > 0) { + label = `Swapping ~${formattedRate} ${from?.symbol || dcaPosition.from.symbol} ${swapIntervalAdverb} to ${to?.symbol || dcaPosition.from.symbol}`; + } else { + label = `Swapping ${from?.symbol || dcaPosition.from.symbol} to ${to?.symbol || dcaPosition.from.symbol}`; + } + const secondaryLabel = remainingSwaps && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval].plural(remainingSwaps)} left` : 'Position finished'; return { type: ContractType.POSITION, address: dcaPosition.id, diff --git a/src/apps/mean-finance/optimism/mean-finance.tvl-fetcher.ts b/src/apps/mean-finance/optimism/mean-finance.tvl-fetcher.ts index 7d2344b4e..ac6625090 100644 --- a/src/apps/mean-finance/optimism/mean-finance.tvl-fetcher.ts +++ b/src/apps/mean-finance/optimism/mean-finance.tvl-fetcher.ts @@ -11,6 +11,8 @@ import { Network } from '~types/network.interface'; import { getPositions } from '../helpers/graph'; import { MEAN_FINANCE_DEFINITION } from '../mean-finance.definition'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; const appId = MEAN_FINANCE_DEFINITION.id; const network = Network.OPTIMISM_MAINNET; @@ -39,7 +41,7 @@ export class OptimismMeanFinanceTvlFetcher implements TvlFetcher { } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); } const balanceUSD = sumBy(tokens, t => t.balanceUSD); diff --git a/src/apps/mean-finance/polygon/mean-finance.balance-fetcher.ts b/src/apps/mean-finance/polygon/mean-finance.balance-fetcher.ts index 8fc9eac99..f640044ea 100644 --- a/src/apps/mean-finance/polygon/mean-finance.balance-fetcher.ts +++ b/src/apps/mean-finance/polygon/mean-finance.balance-fetcher.ts @@ -10,6 +10,8 @@ import { BalanceFetcher } from '~balance/balance-fetcher.interface'; import { ContractType } from '~position/contract.interface'; import { WithMetaType } from '~position/display.interface'; import { BaseTokenBalance, ContractPositionBalance } from '~position/position-balance.interface'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; import { Network } from '~types/network.interface'; import { getUserPositions } from '../helpers/graph'; @@ -36,8 +38,15 @@ export class PolygonMeanFinanceBalanceFetcher implements BalanceFetcher { const contractPositionBalances: ContractPositionBalance[] = positions.map(dcaPosition => { const toWithdraw = dcaPosition.current.idleSwapped; const remainingLiquidity = dcaPosition.current.remainingLiquidity; - const remainingSwaps = dcaPosition.current.remainingSwaps; - const swapInterval = dcaPosition.swapInterval.interval; + const remainingSwaps = Number(dcaPosition.current.remainingSwaps); + const swapInterval = Number(dcaPosition.swapInterval.interval) as keyof typeof STRING_SWAP_INTERVALS; + const rawRate = dcaPosition.current.rate; + const rate = Number(rawRate) / 10 ** Number(dcaPosition.from.decimals); + let formattedRate = rate.toFixed(3); + + if (rate < 0.001) { + formattedRate = '<0.001' + } const from = baseTokens.find(v => v.address === dcaPosition.from.address); const to = baseTokens.find(v => v.address === dcaPosition.to.address); @@ -54,7 +63,7 @@ export class PolygonMeanFinanceBalanceFetcher implements BalanceFetcher { } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); images = [ ...images, ...getImagesFromToken(to), @@ -63,8 +72,16 @@ export class PolygonMeanFinanceBalanceFetcher implements BalanceFetcher { const balanceUSD = sumBy(tokens, t => t.balanceUSD); - const label = `Swapping ${from?.symbol} to ${to?.symbol}`; - const secondaryLabel = parseInt(remainingSwaps, 10) && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval](remainingSwaps)} left` : 'Position finished'; + const swapIntervalAdverb = STRING_SWAP_INTERVALS[swapInterval].adverb; + let label = ''; + + if (remainingSwaps > 0) { + label = `Swapping ~${formattedRate} ${from?.symbol || dcaPosition.from.symbol} ${swapIntervalAdverb} to ${to?.symbol || dcaPosition.from.symbol}`; + } else { + label = `Swapping ${from?.symbol || dcaPosition.from.symbol} to ${to?.symbol || dcaPosition.from.symbol}`; + } + + const secondaryLabel = remainingSwaps && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval].plural(remainingSwaps)} left` : 'Position finished'; return { type: ContractType.POSITION, diff --git a/src/apps/mean-finance/polygon/mean-finance.dca-position.contract-position-fetcher.ts b/src/apps/mean-finance/polygon/mean-finance.dca-position.contract-position-fetcher.ts index af2dc1dc0..5f3a4eea9 100644 --- a/src/apps/mean-finance/polygon/mean-finance.dca-position.contract-position-fetcher.ts +++ b/src/apps/mean-finance/polygon/mean-finance.dca-position.contract-position-fetcher.ts @@ -9,6 +9,8 @@ import { WithMetaType } from '~position/display.interface'; import { BaseTokenBalance } from '~position/position-balance.interface'; import { PositionFetcher } from '~position/position-fetcher.interface'; import { ContractPosition } from '~position/position.interface'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; import { Network } from '~types/network.interface'; import { MeanFinanceContractFactory } from '../contracts'; @@ -36,8 +38,15 @@ export class PolygonMeanFinanceDcaPositionContractPositionFetcher implements Pos const contractPositions: ContractPosition[] = positions.map(dcaPosition => { const toWithdraw = dcaPosition.current.idleSwapped; const remainingLiquidity = dcaPosition.current.remainingLiquidity; - const remainingSwaps = dcaPosition.current.remainingSwaps; - const swapInterval = dcaPosition.swapInterval.interval; + const remainingSwaps = Number(dcaPosition.current.remainingSwaps); + const swapInterval = Number(dcaPosition.swapInterval.interval) as keyof typeof STRING_SWAP_INTERVALS; + const rawRate = dcaPosition.current.rate; + const rate = Number(rawRate) / 10 ** Number(dcaPosition.from.decimals); + let formattedRate = rate.toFixed(3); + + if (rate < 0.001) { + formattedRate = '<0.001' + } const from = baseTokens.find(v => v.address === dcaPosition.from.address); const to = baseTokens.find(v => v.address === dcaPosition.to.address); @@ -54,7 +63,7 @@ export class PolygonMeanFinanceDcaPositionContractPositionFetcher implements Pos } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); images = [ ...images, ...getImagesFromToken(to), @@ -63,8 +72,15 @@ export class PolygonMeanFinanceDcaPositionContractPositionFetcher implements Pos const balanceUSD = sumBy(tokens, t => t.balanceUSD); - const label = `Swapping ${from?.symbol} to ${to?.symbol}`; - const secondaryLabel = parseInt(remainingSwaps, 10) && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval](remainingSwaps)} left` : 'Position finished'; + const swapIntervalAdverb = STRING_SWAP_INTERVALS[swapInterval].adverb; + let label = ''; + + if (remainingSwaps > 0) { + label = `Swapping ~${formattedRate} ${from?.symbol || dcaPosition.from.symbol} ${swapIntervalAdverb} to ${to?.symbol || dcaPosition.from.symbol}`; + } else { + label = `Swapping ${from?.symbol || dcaPosition.from.symbol} to ${to?.symbol || dcaPosition.from.symbol}`; + } + const secondaryLabel = remainingSwaps && STRING_SWAP_INTERVALS[swapInterval] ? `${STRING_SWAP_INTERVALS[swapInterval].plural(remainingSwaps)} left` : 'Position finished'; return { type: ContractType.POSITION, diff --git a/src/apps/mean-finance/polygon/mean-finance.tvl-fetcher.ts b/src/apps/mean-finance/polygon/mean-finance.tvl-fetcher.ts index ac9e35077..cc8f0fee5 100644 --- a/src/apps/mean-finance/polygon/mean-finance.tvl-fetcher.ts +++ b/src/apps/mean-finance/polygon/mean-finance.tvl-fetcher.ts @@ -11,6 +11,8 @@ import { Network } from '~types/network.interface'; import { getPositions } from '../helpers/graph'; import { MEAN_FINANCE_DEFINITION } from '../mean-finance.definition'; +import { claimable } from '~position/position.utils'; +import { BaseToken } from '~position/token.interface'; const appId = MEAN_FINANCE_DEFINITION.id; const network = Network.POLYGON_MAINNET; @@ -39,7 +41,7 @@ export class PolygonMeanFinanceTvlFetcher implements TvlFetcher { } if (to) { to.network = network; - tokens.push(drillBalance(to, toWithdraw)); + tokens.push(drillBalance(claimable(to), toWithdraw)); } const balanceUSD = sumBy(tokens, t => t.balanceUSD); diff --git a/src/position/position.utils.ts b/src/position/position.utils.ts index 41c49801e..9953c9fd4 100644 --- a/src/position/position.utils.ts +++ b/src/position/position.utils.ts @@ -8,9 +8,9 @@ export const isClaimable = (token: WithMetaType) => token.metaType === Me export const isVesting = (token: WithMetaType) => token.metaType === MetaType.VESTING; export const isLocked = (token: WithMetaType) => token.metaType === MetaType.LOCKED; -export const wallet = (token: T): WithMetaType => ({ metaType: MetaType.WALLET, ...token }); -export const supplied = (token: T): WithMetaType => ({ metaType: MetaType.SUPPLIED, ...token }); -export const borrowed = (token: T): WithMetaType => ({ metaType: MetaType.BORROWED, ...token }); -export const claimable = (token: T): WithMetaType => ({ metaType: MetaType.CLAIMABLE, ...token }); -export const vesting = (token: T): WithMetaType => ({ metaType: MetaType.VESTING, ...token }); -export const locked = (token: T): WithMetaType => ({ metaType: MetaType.LOCKED, ...token }); +export const wallet = (token: T): WithMetaType => ({ metaType: MetaType.WALLET, ...token }); +export const supplied = (token: T): WithMetaType => ({ metaType: MetaType.SUPPLIED, ...token }); +export const borrowed = (token: T): WithMetaType => ({ metaType: MetaType.BORROWED, ...token }); +export const claimable = (token: T): WithMetaType => ({ metaType: MetaType.CLAIMABLE, ...token }); +export const vesting = (token: T): WithMetaType => ({ metaType: MetaType.VESTING, ...token }); +export const locked = (token: T): WithMetaType => ({ metaType: MetaType.LOCKED, ...token });