From f6bd5e35f59491e9bacf4bfca4e1da6c2ed8dbf4 Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Thu, 15 Aug 2024 17:50:19 +0300 Subject: [PATCH 1/9] feat: enable fx pool type querying --- lib/modules/pool/pool.types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/modules/pool/pool.types.ts b/lib/modules/pool/pool.types.ts index 3543b4999..ea10ec932 100644 --- a/lib/modules/pool/pool.types.ts +++ b/lib/modules/pool/pool.types.ts @@ -69,6 +69,7 @@ export const poolTypeFilters = [ GqlPoolType.LiquidityBootstrapping, GqlPoolType.Gyro, GqlPoolType.CowAmm, + GqlPoolType.Fx, ] as const export type PoolFilterType = (typeof poolTypeFilters)[number] // We need to map toggalable pool types to their corresponding set of GqlPoolTypes. @@ -78,6 +79,7 @@ export const POOL_TYPE_MAP: { [key in PoolFilterType]: GqlPoolType[] } = { [GqlPoolType.LiquidityBootstrapping]: [GqlPoolType.LiquidityBootstrapping], [GqlPoolType.Gyro]: [GqlPoolType.Gyro, GqlPoolType.Gyro3, GqlPoolType.Gyroe], [GqlPoolType.CowAmm]: [GqlPoolType.CowAmm], + [GqlPoolType.Fx]: [GqlPoolType.Fx], } export const poolCategoryFilters = [ From 452f518302a52a9168f531274f52a17c87341c68 Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Thu, 15 Aug 2024 17:59:54 +0300 Subject: [PATCH 2/9] feat: add xave partner redirect on liq add/remove --- .../pool/PoolDetail/PoolHeader/PoolHeader.tsx | 27 ++++++++- .../pool/PoolDetail/PoolMyLiquidity.tsx | 57 +++++++++++++++---- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/lib/modules/pool/PoolDetail/PoolHeader/PoolHeader.tsx b/lib/modules/pool/PoolDetail/PoolHeader/PoolHeader.tsx index 9e18512a8..43070acf3 100644 --- a/lib/modules/pool/PoolDetail/PoolHeader/PoolHeader.tsx +++ b/lib/modules/pool/PoolDetail/PoolHeader/PoolHeader.tsx @@ -1,23 +1,39 @@ -import { Stack, Button, VStack } from '@chakra-ui/react' +import { Stack, Button, VStack, useDisclosure } from '@chakra-ui/react' import { usePathname, useRouter } from 'next/navigation' import PoolMetaBadges from './PoolMetaBadges' import { usePool } from '../../PoolProvider' -import { shouldBlockAddLiquidity } from '../../pool.helpers' +import { isFx, shouldBlockAddLiquidity } from '../../pool.helpers' import { AnalyticsEvent, trackEvent } from '@/lib/shared/services/fathom/Fathom' import { PoolCategories } from '../../categories/PoolCategories' import { PoolBreadcrumbs } from './PoolBreadcrumbs' +import { + PartnerRedirectModal, + RedirectPartner, +} from '@/lib/shared/components/modals/PartnerRedirectModal' +import { useState } from 'react' export function PoolHeader() { const pathname = usePathname() const { pool } = usePool() const router = useRouter() + const [redirectPartner, setRedirectPartner] = useState(RedirectPartner.Xave) + const partnerRedirectDisclosure = useDisclosure() const isAddLiquidityBlocked = shouldBlockAddLiquidity(pool) + function openRedirectModal(partner: RedirectPartner) { + setRedirectPartner(partner) + partnerRedirectDisclosure.onOpen() + } + function handleClick() { trackEvent(AnalyticsEvent.ClickAddLiquidity) - router.push(`${pathname}/add-liquidity`) + if (isFx(pool.type)) { + openRedirectModal(RedirectPartner.Xave) + } else { + router.push(`${pathname}/add-liquidity`) + } } return ( @@ -40,6 +56,11 @@ export function PoolHeader() { > Add liquidity + diff --git a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx index dc26c770b..946d2674e 100644 --- a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx +++ b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx @@ -37,7 +37,7 @@ import { shouldMigrateStake, calcGaugeStakedBalance, } from '../user-balance.helpers' -import { isVebalPool, shouldBlockAddLiquidity, calcUserShareOfPool } from '../pool.helpers' +import { isVebalPool, shouldBlockAddLiquidity, calcUserShareOfPool, isFx } from '../pool.helpers' import { getCanStake, migrateStakeTooltipLabel } from '../actions/stake.helpers' import { InfoOutlineIcon } from '@chakra-ui/icons' @@ -72,7 +72,9 @@ export default function PoolMyLiquidity() { const { toCurrency } = useCurrency() const { isConnected, isConnecting } = useUserAccount() const router = useRouter() - const auraDisclosure = useDisclosure() + const partnerRedirectDisclosure = useDisclosure() + const [redirectPartner, setRedirectPartner] = useState(RedirectPartner.Aura) + const [redirectPartnerUrl, setRedirectPartnerUrl] = useState() const isVeBal = isVebalPool(pool.id) const tabs = useMemo(() => { @@ -222,6 +224,34 @@ export default function PoolMyLiquidity() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [tabs, pool]) + function openRedirectModal(partner: RedirectPartner) { + setRedirectPartner(partner) + let url + if (partner === RedirectPartner.Aura && pool?.staking?.aura?.auraPoolId) { + url = pool?.staking?.aura?.auraPoolId + ? getAuraPoolLink(chainId, pool.staking.aura.auraPoolId) + : undefined + } + setRedirectPartnerUrl(url) + partnerRedirectDisclosure.onOpen() + } + + function handleAddLiquidity() { + if (isFx(pool.type)) { + openRedirectModal(RedirectPartner.Xave) + } else { + router.push(`${pathname}/add-liquidity`) + } + } + + function handleRemoveLiquidity() { + if (isFx(pool.type)) { + openRedirectModal(RedirectPartner.Xave) + } else { + router.push(`${pathname}/remove-liquidity`) + } + } + return ( @@ -273,19 +303,16 @@ export default function PoolMyLiquidity() { {activeTab.value === 'aura' && !totalBalanceUsd && pool.staking?.aura ? ( Aura APR: {fNum('apr', pool.staking.aura.apr)} - - - ) : ( pool.displayTokens.map(token => { @@ -301,11 +328,17 @@ export default function PoolMyLiquidity() { ) }) )} + diff --git a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx index 946d2674e..2d30349ea 100644 --- a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx +++ b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx @@ -23,7 +23,7 @@ import { Address } from 'viem' import { usePathname, useRouter } from 'next/navigation' import { useCurrency } from '@/lib/shared/hooks/useCurrency' import { keyBy } from 'lodash' -import { getAuraPoolLink, getProportionalExitAmountsFromScaledBptIn } from '../pool.utils' +import { getAuraPoolLink, getProportionalExitAmountsFromScaledBptIn, getXavePoolLink } from '../pool.utils' import { useUserAccount } from '../../web3/UserAccountProvider' import { bn, fNum } from '@/lib/shared/utils/numbers' import { @@ -228,9 +228,9 @@ export default function PoolMyLiquidity() { setRedirectPartner(partner) let url if (partner === RedirectPartner.Aura && pool?.staking?.aura?.auraPoolId) { - url = pool?.staking?.aura?.auraPoolId - ? getAuraPoolLink(chainId, pool.staking.aura.auraPoolId) - : undefined + url = getAuraPoolLink(chainId, pool.staking.aura.auraPoolId) + } else if (partner === RedirectPartner.Xave && pool?.address && pool.chain) { + url = getXavePoolLink(pool.chain, pool.address) } setRedirectPartnerUrl(url) partnerRedirectDisclosure.onOpen() diff --git a/lib/modules/pool/pool.utils.ts b/lib/modules/pool/pool.utils.ts index 80c60d3bb..965cde4da 100644 --- a/lib/modules/pool/pool.utils.ts +++ b/lib/modules/pool/pool.utils.ts @@ -270,6 +270,10 @@ export function getAuraPoolLink(chainId: number, pid: string) { return `https://app.aura.finance/#/${chainId}/pool/${pid}` } +export function getXavePoolLink(chain: string, poolAddress: string) { + return `https://app.xave.co/pool/${chain.toLowerCase()}/${poolAddress}` +} + export function shouldHideSwapFee(poolType: GqlPoolType) { return poolType === GqlPoolType.CowAmm } From ab1b731f421a4036974f42422c8f95a33e1847e9 Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Mon, 9 Sep 2024 22:59:45 +0300 Subject: [PATCH 6/9] chore: add fx pool badge --- lib/modules/pool/PoolDetail/PoolHeader/PoolBadges.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/modules/pool/PoolDetail/PoolHeader/PoolBadges.tsx b/lib/modules/pool/PoolDetail/PoolHeader/PoolBadges.tsx index 240e8a679..06ace952e 100644 --- a/lib/modules/pool/PoolDetail/PoolHeader/PoolBadges.tsx +++ b/lib/modules/pool/PoolDetail/PoolHeader/PoolBadges.tsx @@ -1,7 +1,7 @@ import { Badge, HStack } from '@chakra-ui/react' import React from 'react' import { Pool, usePool } from '../../PoolProvider' -import { isBoosted, isStable, isGyro, isWeighted } from '../../pool.helpers' +import { isBoosted, isStable, isGyro, isWeighted, isFx } from '../../pool.helpers' function getPoolBadges(pool: Pool) { const badges = [] @@ -12,6 +12,7 @@ function getPoolBadges(pool: Pool) { if (isStable(pool.type)) badges.push('Stable') if (isGyro(pool.type)) badges.push('Gyro') if (isWeighted(pool.type)) badges.push('Weighted') + if (isFx(pool.type)) badges.push('FX') return badges } From 5ee3499072ae3cc04228dba88f01fac402b085e8 Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Tue, 10 Sep 2024 11:14:03 +0300 Subject: [PATCH 7/9] fix: revert add liquidity page changes * error display fixed in main, so changes not needed anymore --- .../[id]/add-liquidity/[[...txHash]]/layout.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/(app)/pools/[chain]/[variant]/[id]/add-liquidity/[[...txHash]]/layout.tsx b/app/(app)/pools/[chain]/[variant]/[id]/add-liquidity/[[...txHash]]/layout.tsx index b4ed228b3..8132372fd 100644 --- a/app/(app)/pools/[chain]/[variant]/[id]/add-liquidity/[[...txHash]]/layout.tsx +++ b/app/(app)/pools/[chain]/[variant]/[id]/add-liquidity/[[...txHash]]/layout.tsx @@ -1,6 +1,6 @@ 'use client' -import { isFx, isNotSupported, shouldBlockAddLiquidity } from '@/lib/modules/pool/pool.helpers' +import { isNotSupported, shouldBlockAddLiquidity } from '@/lib/modules/pool/pool.helpers' import { usePool } from '@/lib/modules/pool/PoolProvider' import { RelayerSignatureProvider } from '@/lib/modules/relayer/RelayerSignatureProvider' import { TokenInputsValidationProvider } from '@/lib/modules/tokens/TokenInputsValidationProvider' @@ -24,17 +24,15 @@ export default function AddLiquidityLayout({ params: { txHash }, children }: Pro const maybeTxHash = txHash?.[0] || '' const urlTxHash = isHash(maybeTxHash) ? maybeTxHash : undefined - if (shouldBlockAddLiquidity(pool) || isFx(pool.type)) { + if (shouldBlockAddLiquidity(pool)) { return redirectToPoolPage() } if (isNotSupported(pool)) { return ( - - - This pool type is not currently supported in the Balancer V3 UI - - + + This pool type is not currently supported in the Balancer V3 UI + ) } From a0088b700629721559f7ca0a10d788faed759b9c Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Tue, 10 Sep 2024 11:14:47 +0300 Subject: [PATCH 8/9] chore: format --- lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx index 2d30349ea..62bc1e79d 100644 --- a/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx +++ b/lib/modules/pool/PoolDetail/PoolMyLiquidity.tsx @@ -23,7 +23,11 @@ import { Address } from 'viem' import { usePathname, useRouter } from 'next/navigation' import { useCurrency } from '@/lib/shared/hooks/useCurrency' import { keyBy } from 'lodash' -import { getAuraPoolLink, getProportionalExitAmountsFromScaledBptIn, getXavePoolLink } from '../pool.utils' +import { + getAuraPoolLink, + getProportionalExitAmountsFromScaledBptIn, + getXavePoolLink, +} from '../pool.utils' import { useUserAccount } from '../../web3/UserAccountProvider' import { bn, fNum } from '@/lib/shared/utils/numbers' import { From f9ae01c38cddd0bcd91fef4e01ab1eed8ef91d4e Mon Sep 17 00:00:00 2001 From: nook <0xnook@protonmail.com> Date: Tue, 17 Sep 2024 11:29:11 +0300 Subject: [PATCH 9/9] chore: add fx pool type label --- lib/modules/pool/PoolList/usePoolListQueryState.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/modules/pool/PoolList/usePoolListQueryState.tsx b/lib/modules/pool/PoolList/usePoolListQueryState.tsx index 1b18a9391..f16bd00bf 100644 --- a/lib/modules/pool/PoolList/usePoolListQueryState.tsx +++ b/lib/modules/pool/PoolList/usePoolListQueryState.tsx @@ -122,6 +122,8 @@ export function usePoolListQueryState() { return 'Gyro CLP' case GqlPoolType.CowAmm: return 'CoW AMM' + case GqlPoolType.Fx: + return 'FX' default: return poolType.toLowerCase() }