From e01026905e576f3124c721a84bae4f78733701f4 Mon Sep 17 00:00:00 2001 From: Peiman <25097709+Rickk137@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:33:23 +0330 Subject: [PATCH] fix: stable coin reference (#312) * fix: stable coin reference * update import * address feedback * show stablecoin symbol on positions list * hide mainnet * deps --------- Co-authored-by: jmzwar --- liquidity/lib/usePoolsList/usePoolsList.ts | 3 +- liquidity/lib/useStablecoin/index.ts | 1 + liquidity/lib/useStablecoin/package.json | 12 ++++++++ liquidity/lib/useStablecoin/useStablecoin.ts | 29 +++++++++++++++++++ liquidity/lib/withERC7412/withERC7412.ts | 1 - liquidity/ui/package.json | 1 + liquidity/ui/src/components/Borrow/Borrow.tsx | 13 +++++---- .../src/components/Manage/ManageActions.tsx | 6 ++-- .../components/Positions/PositionsList.tsx | 13 +++++++-- .../Positions/PositionsTable/PositionsRow.tsx | 7 ++++- .../PositionsTable/PositionsTable.tsx | 13 ++++++++- liquidity/ui/src/components/Repay/Repay.tsx | 16 +++++----- liquidity/ui/src/pages/Pool.tsx | 1 + yarn.lock | 12 ++++++++ 14 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 liquidity/lib/useStablecoin/index.ts create mode 100644 liquidity/lib/useStablecoin/package.json create mode 100644 liquidity/lib/useStablecoin/useStablecoin.ts diff --git a/liquidity/lib/usePoolsList/usePoolsList.ts b/liquidity/lib/usePoolsList/usePoolsList.ts index a7e38a8d6..67fb20816 100644 --- a/liquidity/lib/usePoolsList/usePoolsList.ts +++ b/liquidity/lib/usePoolsList/usePoolsList.ts @@ -40,7 +40,8 @@ export function usePool(networkId: number, poolId: string) { }; } -const supportedNetworks = [1, 8453, 42161]; +// TODO: Add 1 and 10 to support Mainnet and Optimism +const supportedNetworks = [8453, 42161]; async function fetchTorosPool() { return fetch('https://api-v2.dhedge.org/graphql', { diff --git a/liquidity/lib/useStablecoin/index.ts b/liquidity/lib/useStablecoin/index.ts new file mode 100644 index 000000000..dcd5496fb --- /dev/null +++ b/liquidity/lib/useStablecoin/index.ts @@ -0,0 +1 @@ +export * from './useStablecoin'; diff --git a/liquidity/lib/useStablecoin/package.json b/liquidity/lib/useStablecoin/package.json new file mode 100644 index 000000000..bc9f12833 --- /dev/null +++ b/liquidity/lib/useStablecoin/package.json @@ -0,0 +1,12 @@ +{ + "name": "@snx-v3/useStablecoin", + "private": true, + "main": "index.ts", + "version": "0.0.1", + "dependencies": { + "@snx-v3/useBlockchain": "workspace:*", + "@snx-v3/useGetUSDTokens": "workspace:*", + "@snx-v3/useTokenInfo": "workspace:*", + "@tanstack/react-query": "^5.8.3" + } +} diff --git a/liquidity/lib/useStablecoin/useStablecoin.ts b/liquidity/lib/useStablecoin/useStablecoin.ts new file mode 100644 index 000000000..2493bdc79 --- /dev/null +++ b/liquidity/lib/useStablecoin/useStablecoin.ts @@ -0,0 +1,29 @@ +import { useQuery } from '@tanstack/react-query'; +import { useNetwork } from '@snx-v3/useBlockchain'; +import { useGetUSDTokens } from '@snx-v3/useGetUSDTokens'; +import { useTokenInfo } from '@snx-v3/useTokenInfo'; + +export function useStablecoin() { + const { network } = useNetwork(); + + const { data: USDTokens } = useGetUSDTokens(); + const { data: stablecoinInfo } = useTokenInfo(USDTokens?.snxUSD); + + return useQuery({ + queryKey: [`${network?.id}-${network?.preset}`, 'stablecoin', USDTokens?.snxUSD], + queryFn: async function () { + if (!stablecoinInfo) { + throw new Error('useStablecoin requires more information'); + } + + const { name, symbol } = stablecoinInfo; + + return { + symbol, + name, + address: USDTokens?.snxUSD, + }; + }, + enabled: Boolean(USDTokens?.snxUSD && stablecoinInfo), + }); +} diff --git a/liquidity/lib/withERC7412/withERC7412.ts b/liquidity/lib/withERC7412/withERC7412.ts index a22ff99ef..97ed4c268 100644 --- a/liquidity/lib/withERC7412/withERC7412.ts +++ b/liquidity/lib/withERC7412/withERC7412.ts @@ -181,7 +181,6 @@ const parseError = async (error: any, provider: providers.JsonRpcProvider, netwo const AllErrors = await importAllErrors(network.id, network.preset); const AllErrorsInterface = new ethers.utils.Interface([...AllErrors.abi, ...PYTH_ERRORS]); const decodedError = AllErrorsInterface.parseError(errorData); - console.log(`decodedError`, decodedError); return decodedError; // return ERC7412ErrorSchema.parse(decodedError); } catch (parseError) { diff --git a/liquidity/ui/package.json b/liquidity/ui/package.json index 2ec19feb6..8aa477f27 100644 --- a/liquidity/ui/package.json +++ b/liquidity/ui/package.json @@ -59,6 +59,7 @@ "@snx-v3/usePoolData": "workspace:*", "@snx-v3/usePoolsList": "workspace:*", "@snx-v3/useRewards": "workspace:^", + "@snx-v3/useStablecoin": "workspace:*", "@snx-v3/useTokenBalance": "workspace:*", "@snx-v3/useTransferAccountId": "workspace:*", "@snx-v3/useTransferableSynthetix": "workspace:*", diff --git a/liquidity/ui/src/components/Borrow/Borrow.tsx b/liquidity/ui/src/components/Borrow/Borrow.tsx index 3008dced4..2131fed6a 100644 --- a/liquidity/ui/src/components/Borrow/Borrow.tsx +++ b/liquidity/ui/src/components/Borrow/Borrow.tsx @@ -13,6 +13,7 @@ import Wei from '@synthetixio/wei'; import { useNetwork } from '@snx-v3/useBlockchain'; import { isBaseAndromeda } from '@snx-v3/isBaseAndromeda'; import { SUSDCIcon } from '@snx-v3/icons/SUSDCIcon'; +import { useStablecoin } from '@snx-v3/useStablecoin'; const BorrowUi: FC<{ debtChange: Wei; @@ -20,22 +21,24 @@ const BorrowUi: FC<{ setDebtChange: (val: Wei) => void; }> = ({ debtChange, setDebtChange, maxDebt }) => { const { network } = useNetwork(); + const { data: stablecoin } = useStablecoin(); + const isBase = isBaseAndromeda(network?.id, network?.preset); return ( - {isBase ? 'Claim USDC' : 'Borrow snxUSD'} + {isBase ? 'Claim USDC' : `Borrow ${stablecoin?.symbol}`} {isBase ? 'Claim USDC fees you have earned from providing liquidity. These will be available in 24h for withdrawal.' - : `Take an interest-free loan of snxUSD against your collateral. This + : `Take an interest-free loan of ${stablecoin?.symbol} against your collateral. This increases your debt and decreases your C-Ratio.`} {isBase ? : } - {isBase ? 'USDC' : 'snxUSD'} + {isBase ? 'USDC' : stablecoin?.symbol} Max: - {isBase ? 'USDC' : 'snxUSD'} + {isBase ? 'USDC' : stablecoin?.symbol} ); diff --git a/liquidity/ui/src/components/Manage/ManageActions.tsx b/liquidity/ui/src/components/Manage/ManageActions.tsx index 316731158..002c6a829 100644 --- a/liquidity/ui/src/components/Manage/ManageActions.tsx +++ b/liquidity/ui/src/components/Manage/ManageActions.tsx @@ -29,6 +29,7 @@ import { safeImport } from '@synthetixio/safe-import'; import { calculateCRatio } from '@snx-v3/calculations'; import { Network, useNetwork } from '@snx-v3/useBlockchain'; import { isBaseAndromeda } from '@snx-v3/isBaseAndromeda'; +import { useStablecoin } from '@snx-v3/useStablecoin'; const RepayModal = lazy(() => safeImport(() => import('@snx-v3/RepayModal'))); const BorrowModal = lazy(() => safeImport(() => import('@snx-v3/BorrowModal'))); @@ -83,6 +84,7 @@ const ManageActionUi: FC<{ }> = ({ setActiveAction, manageAction, onSubmit, liquidityPosition, network }) => { const debt = Number(liquidityPosition?.debt?.toString()); const isBase = isBaseAndromeda(network?.id, network?.preset); + const { data: stablecoin } = useStablecoin(); return ( @@ -96,7 +98,7 @@ const ManageActionUi: FC<{ action="repay" activeAction={manageAction} > - Repay {isBase ? '' : 'snxUSD'} + Repay {isBase ? '' : stablecoin?.symbol} @@ -109,7 +111,7 @@ const ManageActionUi: FC<{ action="borrow" activeAction={manageAction} > - {isBase ? 'Claim' : 'Borrow snxUSD'} + {isBase ? 'Claim' : `Borrow ${stablecoin?.symbol}`} diff --git a/liquidity/ui/src/components/Positions/PositionsList.tsx b/liquidity/ui/src/components/Positions/PositionsList.tsx index 7d1386dcc..0a3d6f0fd 100644 --- a/liquidity/ui/src/components/Positions/PositionsList.tsx +++ b/liquidity/ui/src/components/Positions/PositionsList.tsx @@ -6,26 +6,35 @@ import { useParams } from '@snx-v3/useParams'; import { useApr } from '@snx-v3/useApr'; import { isBaseAndromeda } from '@snx-v3/isBaseAndromeda'; import { useNetwork } from '@snx-v3/useBlockchain'; +import { useStablecoin } from '@snx-v3/useStablecoin'; export const PositionsList = () => { const { accountId } = useParams(); const { network } = useNetwork(); - const { data: positionsByKey, isLoading } = useLiquidityPositions({ + const { data: positionsByKey, isLoading: isLiquidityPositionsLoading } = useLiquidityPositions({ accountId, }); const { data: apr } = useApr(); + const { data: stablecoinInfo, isLoading: isStablecoinLoading } = useStablecoin(); const isBase = isBaseAndromeda(network?.id, network?.preset); const positions = calculatePositions(positionsByKey, isBase); const parsedPositions = positions.filter((position) => position.collateralAmount.gt(0)); + const isLoading = isLiquidityPositionsLoading || isStablecoinLoading; + return ( Positions - + ); }; diff --git a/liquidity/ui/src/components/Positions/PositionsTable/PositionsRow.tsx b/liquidity/ui/src/components/Positions/PositionsTable/PositionsRow.tsx index 4462445fa..dbf02872d 100644 --- a/liquidity/ui/src/components/Positions/PositionsTable/PositionsRow.tsx +++ b/liquidity/ui/src/components/Positions/PositionsTable/PositionsRow.tsx @@ -10,6 +10,7 @@ interface PositionRow extends LiquidityPositionType { final: boolean; isBase: boolean; apr?: number; + stablecoinSymbol?: string; } []; @@ -22,14 +23,17 @@ export function PositionRow({ cRatio, isBase, apr, + stablecoinSymbol, }: PositionRow) { const [queryParams] = useSearchParams(); const navigate = useNavigate(); + const { data: liquidityPosition } = useLiquidityPosition({ tokenAddress: collateralType.tokenAddress, accountId, poolId, }); + const { data: borrow } = useGetBorrow({ accountId, poolId, @@ -37,6 +41,7 @@ export function PositionRow({ }); const parsedCRatio = collateralType.issuanceRatioD18.gt(cRatio) ? 'MANAGE' : 'HEALTHY'; + return ( @@ -103,7 +108,7 @@ export function PositionRow({ {parseFloat( utils.formatEther(borrow?.position?.net_issuance.toString() || '0') ).toFixed(2)}{' '} - snxUSD + {stablecoinSymbol} diff --git a/liquidity/ui/src/components/Positions/PositionsTable/PositionsTable.tsx b/liquidity/ui/src/components/Positions/PositionsTable/PositionsTable.tsx index 9dddace21..3c486cc79 100644 --- a/liquidity/ui/src/components/Positions/PositionsTable/PositionsTable.tsx +++ b/liquidity/ui/src/components/Positions/PositionsTable/PositionsTable.tsx @@ -16,9 +16,19 @@ interface PositionsTableInterface { isLoading: boolean; positions?: LiquidityPositionType[]; apr?: number; + stablecoinInfo?: { + symbol?: string; + name?: string; + address?: string; + }; } -export const PositionsTable = ({ isLoading, positions, apr }: PositionsTableInterface) => { +export const PositionsTable = ({ + isLoading, + positions, + apr, + stablecoinInfo, +}: PositionsTableInterface) => { const { activeWallet } = useWallet(); const { network } = useNetwork(); const isBase = isBaseAndromeda(network?.id, network?.preset); @@ -79,6 +89,7 @@ export const PositionsTable = ({ isLoading, positions, apr }: PositionsTableInte final={index === positions.length - 1} isBase={isBase} apr={apr} + stablecoinSymbol={stablecoinInfo?.symbol} /> ))} diff --git a/liquidity/ui/src/components/Repay/Repay.tsx b/liquidity/ui/src/components/Repay/Repay.tsx index 98bfdaef2..73ee003c0 100644 --- a/liquidity/ui/src/components/Repay/Repay.tsx +++ b/liquidity/ui/src/components/Repay/Repay.tsx @@ -13,6 +13,7 @@ import { isBaseAndromeda } from '@snx-v3/isBaseAndromeda'; import { useNetwork } from '@snx-v3/useBlockchain'; import { RepayAllDebt } from './'; import { Tooltip } from '@snx-v3/Tooltip'; +import { useStablecoin } from '@snx-v3/useStablecoin'; export const RepayUi: FC<{ debtChange: Wei; @@ -26,20 +27,21 @@ export const RepayUi: FC<{ snxUSDBalance && availableUSDCollateral ? snxUSDBalance.add(availableUSDCollateral) : undefined; const { network } = useNetwork(); const isBase = isBaseAndromeda(network?.id, network?.preset); + const { data: stablecoin } = useStablecoin(); return ( - Repay {isBase ? 'USDC' : 'snxUSD'} + Repay {isBase ? 'USDC' : stablecoin?.symbol} - Pay down your position’s debt with {isBase ? 'USDC' : 'snxUSD'}. This decreases your debt - and increases your C-Ratio. + Pay down your position’s debt with {isBase ? 'USDC' : stablecoin?.symbol}. This decreases + your debt and increases your C-Ratio. - {isBase ? 'USDC' : 'snxUSD'} + {isBase ? 'USDC' : stablecoin?.symbol} {/* TODO Figure out why repay is causing issues */} @@ -97,8 +99,8 @@ export const RepayUi: FC<{ @@ -112,7 +114,7 @@ export const RepayUi: FC<{ type="submit" isDisabled={!(max && snxUSDBalance && currentDebt && availableUSDCollateral)} > - Repay {isBase ? 'USDC' : 'snxUSD'} + Repay {isBase ? 'USDC' : stablecoin?.symbol} ); diff --git a/liquidity/ui/src/pages/Pool.tsx b/liquidity/ui/src/pages/Pool.tsx index 028225416..350ae251d 100644 --- a/liquidity/ui/src/pages/Pool.tsx +++ b/liquidity/ui/src/pages/Pool.tsx @@ -18,6 +18,7 @@ export const Pool = () => { ?.map((info) => info.pool.registered_distributors) .flat() ?.filter((item, pos, self) => self.findIndex((d) => d.id === item.id) === pos); + const collateralTypes = poolInfo?.map((info) => info.collateral_type); const network = NETWORKS.find((n) => n.id === Number(networkId)); diff --git a/yarn.lock b/yarn.lock index d05277cbb..6b8c2eb81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5806,6 +5806,7 @@ __metadata: "@snx-v3/usePoolData": "workspace:*" "@snx-v3/usePoolsList": "workspace:*" "@snx-v3/useRewards": "workspace:^" + "@snx-v3/useStablecoin": "workspace:*" "@snx-v3/useTokenBalance": "workspace:*" "@snx-v3/useTransferAccountId": "workspace:*" "@snx-v3/useTransferableSynthetix": "workspace:*" @@ -6653,6 +6654,17 @@ __metadata: languageName: unknown linkType: soft +"@snx-v3/useStablecoin@workspace:*, @snx-v3/useStablecoin@workspace:liquidity/lib/useStablecoin": + version: 0.0.0-use.local + resolution: "@snx-v3/useStablecoin@workspace:liquidity/lib/useStablecoin" + dependencies: + "@snx-v3/useBlockchain": "workspace:*" + "@snx-v3/useGetUSDTokens": "workspace:*" + "@snx-v3/useTokenInfo": "workspace:*" + "@tanstack/react-query": "npm:^5.8.3" + languageName: unknown + linkType: soft + "@snx-v3/useTeleport@workspace:liquidity/lib/useTeleport": version: 0.0.0-use.local resolution: "@snx-v3/useTeleport@workspace:liquidity/lib/useTeleport"