From 987848e32e990a508c9730e60fc1c9ef2682ae3b Mon Sep 17 00:00:00 2001 From: Sophia Date: Fri, 8 Dec 2023 09:54:57 -0500 Subject: [PATCH] Centrifuge App: transfer CFG to EVM address (#1720) * Add cfg row to table * Rename to holdings and install drawer * Add heading and label value stacks * Add subscan as block explorer for evm on cent chain * Add send cfg form * Add receive cfg component * Fetch wrapped CFG token price * Add CFG Price chart * Get price chart data * Adjust receive tab for substrate connected wallets * Update order of nav bar components * Adapt some colors pre input update * Enable drawer on prime but hide send/receive * Add hook to fetch historical token prices * Use most current price for label * Add filters and price difference in percent * Move chart to be reused and fix decimal errors in input * Correct USDT to USD in holdings table * Fix evm to cent trasnfers and tx toast * Fix currency in toast * Fix x axis ticks on charts * Add tooltip * Clean up address conversion * Show native currency only on native network * Remove addressToHex * Change address fetching * Update styles and copy * Subtract txFee from max send * Update tx fee hook * Remove extended evm address to avoid confusion * Memoize Price chart * Improve x axis on price chart --- .../Charts/PoolAssetReserveChart.tsx | 12 +- .../src/components/Charts/PriceChart.tsx | 105 +++++++ .../src/components/Charts/PriceYieldChart.tsx | 13 +- .../Charts/ReserveCashDragChart.tsx | 12 +- .../src/components/Charts/StackedBarChart.tsx | 12 +- .../{CustomChartElements.tsx => Tooltip.tsx} | 32 +-- centrifuge-app/src/components/Menu/index.tsx | 25 +- .../components/Portfolio/AssetClassChart.tsx | 2 +- .../src/components/Portfolio/CFGTransfer.tsx | 269 ++++++++++++++++++ .../{InvestedTokens.tsx => Holdings.tsx} | 68 ++++- centrifuge-app/src/components/Tooltips.tsx | 4 + centrifuge-app/src/pages/Portfolio/index.tsx | 6 +- centrifuge-app/src/pages/Prime/Detail.tsx | 4 +- centrifuge-app/src/utils/useCFGTokenPrice.ts | 67 +++++ .../src/utils/useTransactionFeeEstimate.ts | 23 +- centrifuge-js/src/CentrifugeBase.ts | 2 +- centrifuge-js/src/modules/tokens.ts | 9 +- .../WalletProvider/WalletProvider.tsx | 2 +- fabric/src/components/InputBox/index.tsx | 2 +- fabric/src/theme/altairDark.ts | 3 +- fabric/src/theme/altairLight.ts | 3 +- fabric/src/theme/centrifugeDark.ts | 3 +- fabric/src/theme/centrifugeLight.ts | 3 +- fabric/src/theme/tokens/modeLight.ts | 2 +- fabric/src/theme/types.ts | 1 + 25 files changed, 594 insertions(+), 90 deletions(-) create mode 100644 centrifuge-app/src/components/Charts/PriceChart.tsx rename centrifuge-app/src/components/Charts/{CustomChartElements.tsx => Tooltip.tsx} (63%) create mode 100644 centrifuge-app/src/components/Portfolio/CFGTransfer.tsx rename centrifuge-app/src/components/Portfolio/{InvestedTokens.tsx => Holdings.tsx} (63%) create mode 100644 centrifuge-app/src/utils/useCFGTokenPrice.ts diff --git a/centrifuge-app/src/components/Charts/PoolAssetReserveChart.tsx b/centrifuge-app/src/components/Charts/PoolAssetReserveChart.tsx index fa19d43d59..63a2314b0d 100644 --- a/centrifuge-app/src/components/Charts/PoolAssetReserveChart.tsx +++ b/centrifuge-app/src/components/Charts/PoolAssetReserveChart.tsx @@ -7,7 +7,7 @@ import { daysBetween } from '../../utils/date' import { formatBalance, formatBalanceAbbreviated } from '../../utils/formatting' import { useDailyPoolStates, usePool } from '../../utils/usePools' import { Tooltips } from '../Tooltips' -import { CustomizedTooltip, CustomizedXAxisTick } from './CustomChartElements' +import { CustomizedTooltip } from './Tooltip' type ChartData = { day: Date @@ -56,9 +56,15 @@ const PoolAssetReserveChart: React.VFC = () => { 30 ? 'months' : 'days'} />} tickLine={false} - interval={chartData.length < 18 || chartData.length > 30 ? 0 : 1} + type="category" + tickFormatter={(tick: number) => { + if (data.length > 180) { + return new Date(tick).toLocaleString('en-US', { month: 'short' }) + } + return new Date(tick).toLocaleString('en-US', { day: 'numeric', month: 'short' }) + }} + style={{ fontSize: '10px', fill: theme.colors.textSecondary, letterSpacing: '-0.5px' }} /> > +} + +export const PriceChart = ({ data, currency, filter, setFilter }: PriceChartProps) => { + const theme = useTheme() + const currentPrice = data.at(-1)?.price + + const priceDifference = React.useMemo(() => { + return Dec(data.at(0)?.price || 1).div(currentPrice || 1) + }, [data, filter]) + + return ( + + + + {currentPrice && ( + + {currency} - {currentPrice.toFixed(4)} USD + + )} + + {' '} + {priceDifference.gte(0) ? '+' : '-'} {priceDifference.mul(100).toFixed(2)}% + + + {filter && setFilter && ( + +