From e1eed2e2a649bcfba4f340430115e3cfabe51b4a Mon Sep 17 00:00:00 2001 From: Thor <109517311+swimthor@users.noreply.github.com> Date: Thu, 13 Oct 2022 20:37:58 +0100 Subject: [PATCH] refactor(ui): handle swimUSD as stable coin --- apps/ui/package.json | 2 +- apps/ui/src/components/SwapForm/SwapForm.tsx | 3 ++- apps/ui/src/components/SwapFormV2/SwapFormV2.tsx | 3 ++- apps/ui/src/hooks/swim/useIsLargeSwap.ts | 6 ++++-- apps/ui/src/hooks/swim/useIsLargeSwapV2.ts | 8 ++++++-- apps/ui/src/hooks/swim/usePoolUsdValues.ts | 9 ++++++--- apps/ui/src/models/amount.ts | 3 ++- apps/ui/src/models/swim/utils.ts | 9 ++++++--- yarn.lock | 2 +- 9 files changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/ui/package.json b/apps/ui/package.json index 7ad9c00ea..40cd60aaa 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -51,7 +51,7 @@ "@solana/spl-token": "^0.3.5", "@solana/web3.js": "^1.62.0", "@swim-io/aptos": "^0.36.0", - "@swim-io/core": "^0.36.0", + "@swim-io/core": "workspace:^", "@swim-io/evm": "^0.36.0", "@swim-io/evm-contracts": "^0.36.0", "@swim-io/pool-math": "^0.36.0", diff --git a/apps/ui/src/components/SwapForm/SwapForm.tsx b/apps/ui/src/components/SwapForm/SwapForm.tsx index 1c79c92d8..5658eda0c 100644 --- a/apps/ui/src/components/SwapForm/SwapForm.tsx +++ b/apps/ui/src/components/SwapForm/SwapForm.tsx @@ -110,7 +110,8 @@ export const SwapForm = ({ maxSlippageFraction }: Props): ReactElement => { const isLargeSwap = useIsLargeSwap(fromToken, toToken, inputAmount); const isSmallEthSwap = - TOKEN_PROJECTS_BY_ID[fromToken.projectId].isStablecoin && + (TOKEN_PROJECTS_BY_ID[fromToken.projectId].isStablecoin || + TOKEN_PROJECTS_BY_ID[fromToken.projectId].isSwimUsd) && [fromToken.nativeEcosystemId, toToken.nativeEcosystemId].includes( EvmEcosystemId.Ethereum, ) && diff --git a/apps/ui/src/components/SwapFormV2/SwapFormV2.tsx b/apps/ui/src/components/SwapFormV2/SwapFormV2.tsx index 1d013d8a8..a4e894791 100644 --- a/apps/ui/src/components/SwapFormV2/SwapFormV2.tsx +++ b/apps/ui/src/components/SwapFormV2/SwapFormV2.tsx @@ -108,7 +108,8 @@ export const SwapFormV2 = ({ maxSlippageFraction }: Props): ReactElement => { inputAmount, ); const isSmallEthSwap = - TOKEN_PROJECTS_BY_ID[fromTokenConfig.projectId].isStablecoin && + (TOKEN_PROJECTS_BY_ID[fromTokenConfig.projectId].isStablecoin || + TOKEN_PROJECTS_BY_ID[fromTokenConfig.projectId].isSwimUsd) && [fromTokenOption.ecosystemId, toTokenOption.ecosystemId].includes( EvmEcosystemId.Ethereum, ) && diff --git a/apps/ui/src/hooks/swim/useIsLargeSwap.ts b/apps/ui/src/hooks/swim/useIsLargeSwap.ts index 390f84820..895339156 100644 --- a/apps/ui/src/hooks/swim/useIsLargeSwap.ts +++ b/apps/ui/src/hooks/swim/useIsLargeSwap.ts @@ -27,13 +27,15 @@ export const useIsLargeSwap = ( const inputPoolUsdValue = pools[0].poolUsdValue; const outputPoolUsdValue = pools[pools.length - 1].poolUsdValue; const outputAmount = useSwapOutputAmountEstimate(inputAmount, toToken); + const fromTokenProject = TOKEN_PROJECTS_BY_ID[fromToken.projectId]; + const toTokenProject = TOKEN_PROJECTS_BY_ID[toToken.projectId]; return ( - (TOKEN_PROJECTS_BY_ID[fromToken.projectId].isStablecoin && + ((fromTokenProject.isStablecoin || fromTokenProject.isSwimUsd) && inputPoolUsdValue !== null && inputAmount .toHuman(SOLANA_ECOSYSTEM_ID) .gt(inputPoolUsdValue.mul(0.1))) || - (TOKEN_PROJECTS_BY_ID[toToken.projectId].isStablecoin && + ((toTokenProject.isStablecoin || toTokenProject.isSwimUsd) && outputPoolUsdValue !== null && outputAmount !== null && outputAmount.toHuman(SOLANA_ECOSYSTEM_ID).gt(outputPoolUsdValue.mul(0.1))) diff --git a/apps/ui/src/hooks/swim/useIsLargeSwapV2.ts b/apps/ui/src/hooks/swim/useIsLargeSwapV2.ts index c1147059d..178762b76 100644 --- a/apps/ui/src/hooks/swim/useIsLargeSwapV2.ts +++ b/apps/ui/src/hooks/swim/useIsLargeSwapV2.ts @@ -33,11 +33,15 @@ export const useIsLargeSwapV2 = ( } const inputBalance = sum(poolBalances[0]); const outputBalance = sum(poolBalances[poolBalances.length - 1]); + const fromTokenProject = + TOKEN_PROJECTS_BY_ID[fromTokenOption.tokenConfig.projectId]; + const toTokenProject = + TOKEN_PROJECTS_BY_ID[toTokenOption.tokenConfig.projectId]; return ( - (TOKEN_PROJECTS_BY_ID[fromTokenOption.tokenConfig.projectId].isStablecoin && + ((fromTokenProject.isStablecoin || fromTokenProject.isSwimUsd) && inputBalance !== null && inputAmount.gt(inputBalance.mul(0.1))) || - (TOKEN_PROJECTS_BY_ID[toTokenOption.tokenConfig.projectId].isStablecoin && + ((toTokenProject.isStablecoin || toTokenProject.isSwimUsd) && outputBalance !== null && outputAmount !== null && outputAmount.gt(outputBalance.mul(0.1))) diff --git a/apps/ui/src/hooks/swim/usePoolUsdValues.ts b/apps/ui/src/hooks/swim/usePoolUsdValues.ts index 9d8448ed9..e7c005e84 100644 --- a/apps/ui/src/hooks/swim/usePoolUsdValues.ts +++ b/apps/ui/src/hooks/swim/usePoolUsdValues.ts @@ -30,15 +30,18 @@ export const usePoolUsdValues = (poolSpecs: readonly PoolSpec[]) => { poolTokens.some( (tokenConfig) => !TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isStablecoin && + !TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isSwimUsd && !prices.get(tokenConfig.id), ) ) { return new Decimal(0); } return poolTokens.reduce((sum, tokenConfig, i) => { - const price = TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isStablecoin - ? new Decimal(1) - : prices.get(tokenConfig.id) ?? new Decimal(1); + const price = + TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isStablecoin || + TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isSwimUsd + ? new Decimal(1) + : prices.get(tokenConfig.id) ?? new Decimal(1); return sum.add(poolBalances[i].mul(price)); }, new Decimal(0)); } diff --git a/apps/ui/src/models/amount.ts b/apps/ui/src/models/amount.ts index 01ce3fd9e..fba91bbf6 100644 --- a/apps/ui/src/models/amount.ts +++ b/apps/ui/src/models/amount.ts @@ -114,7 +114,8 @@ export class Amount { i18next.resolvedLanguage, ); const numberFormatter = new Intl.NumberFormat(language, { - ...(TOKEN_PROJECTS_BY_ID[this.tokenConfig.projectId].isStablecoin + ...(TOKEN_PROJECTS_BY_ID[this.tokenConfig.projectId].isStablecoin || + TOKEN_PROJECTS_BY_ID[this.tokenConfig.projectId].isSwimUsd ? { minimumFractionDigits: 2, maximumFractionDigits: 2, diff --git a/apps/ui/src/models/swim/utils.ts b/apps/ui/src/models/swim/utils.ts index 4b01038d6..45969fbe8 100644 --- a/apps/ui/src/models/swim/utils.ts +++ b/apps/ui/src/models/swim/utils.ts @@ -187,9 +187,12 @@ export const getPoolUsdValue = ( tokens: readonly TokenConfig[], poolTokenAccounts: readonly TokenAccount[], ): Decimal | null => - tokens.every( - (tokenConfig) => TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isStablecoin, - ) + tokens.every((tokenConfig) => { + return ( + TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isStablecoin || + TOKEN_PROJECTS_BY_ID[tokenConfig.projectId].isSwimUsd + ); + }) ? poolTokenAccounts.reduce((acc, account) => { const tokenConfig = tokens.find( (spec) => diff --git a/yarn.lock b/yarn.lock index a76316596..62093dde3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7304,7 +7304,7 @@ __metadata: "@storybook/node-logger": ^6.5.10 "@storybook/react": ^6.5.10 "@swim-io/aptos": ^0.36.0 - "@swim-io/core": ^0.36.0 + "@swim-io/core": "workspace:^" "@swim-io/eslint-config": "workspace:^" "@swim-io/evm": ^0.36.0 "@swim-io/evm-contracts": ^0.36.0