diff --git a/package.json b/package.json index de720c9ada..279f70af96 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@kyberswap/ks-sdk-classic": "^1.0.3", "@kyberswap/ks-sdk-core": "1.1.8", "@kyberswap/ks-sdk-elastic": "^1.1.2", - "@kyberswap/liquidity-widgets": "1.1.11", + "@kyberswap/liquidity-widgets": "1.1.12", "@kyberswap/zap-migration-widgets": "1.0.7", "@kyberswap/oauth2": "1.0.2", "@lingui/macro": "^4.6.0", diff --git a/src/pages/Earns/PositionDetail/LeftSection.tsx b/src/pages/Earns/PositionDetail/LeftSection.tsx index 223ba91a07..574b7f5b80 100644 --- a/src/pages/Earns/PositionDetail/LeftSection.tsx +++ b/src/pages/Earns/PositionDetail/LeftSection.tsx @@ -1,12 +1,15 @@ -import { CurrencyAmount, Token, WETH } from '@kyberswap/ks-sdk-core' +import { ChainId, CurrencyAmount, Token, WETH } from '@kyberswap/ks-sdk-core' import { t } from '@lingui/macro' -import { useCallback, useEffect, useState } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { Flex, Text } from 'rebass' +import { PositionHistoryType, usePositionHistoryQuery } from 'services/zapEarn' import HelpIcon from 'assets/svg/help-circle.svg' +import CopyHelper from 'components/Copy' import InfoHelper from 'components/InfoHelper' import Loader from 'components/Loader' import NonfungiblePositionManagerABI from 'constants/abis/uniswapv3NftManagerContract.json' +import { NETWORKS_INFO } from 'constants/networks' import { useActiveWeb3React } from 'hooks' import { useReadingContract } from 'hooks/useContract' import useTheme from 'hooks/useTheme' @@ -40,6 +43,8 @@ export interface FeeInfo { totalValue: number } +const formatDateTime = (number: number) => (number < 10 ? `0${number}` : number) + const LeftSection = ({ position }: { position: ParsedPosition }) => { const theme = useTheme() const [openClaimFeeModal, setOpenClaimFeeModal] = useState(false) @@ -50,6 +55,12 @@ const LeftSection = ({ position }: { position: ParsedPosition }) => { const allTransactions = useAllTransactions(true) const { account } = useActiveWeb3React() + const { data: historyData } = usePositionHistoryQuery({ + chainId: position.chainId, + tokenAddress: position.tokenAddress, + tokenId: position.id, + }) + const nftManagerContractOfDex = NFT_MANAGER_CONTRACT[position.dex as keyof typeof NFT_MANAGER_CONTRACT] const nftManagerContract = typeof nftManagerContractOfDex === 'string' @@ -60,6 +71,19 @@ const LeftSection = ({ position }: { position: ParsedPosition }) => { const isToken0Native = isNativeToken(position.token0Address, position.chainId as keyof typeof WETH) const isToken1Native = isNativeToken(position.token1Address, position.chainId as keyof typeof WETH) + const createdTime = useMemo(() => { + const data = new Date(position.createdTime * 1000) + const hours = formatDateTime(data.getHours()) + const minutes = formatDateTime(data.getMinutes()) + const seconds = formatDateTime(data.getSeconds()) + return `${hours}:${minutes}:${seconds} ${data.toLocaleDateString()}` + }, [position.createdTime]) + + const txHash = useMemo(() => { + if (!historyData) return '' + return [...historyData].reverse().find(item => item.type === PositionHistoryType.DEPOSIT)?.txHash || '' + }, [historyData]) + const handleFetchUnclaimedFee = useCallback(async () => { if (!contract) return const maxUnit = '0x' + (2n ** 128n - 1n).toString(16) @@ -273,14 +297,14 @@ const LeftSection = ({ position }: { position: ParsedPosition }) => { - {/* + {t`Created Time`} - 2:12:34 12/12/2024 + {createdTime} - + {/* {t`Liquidity Source`} @@ -288,19 +312,23 @@ const LeftSection = ({ position }: { position: ParsedPosition }) => { {t`Value`} $12,600 - + */} - + {/* 345 KNC + 12.65 JUP + 0.18 ETH - + */} {t`Tnx Hash`} - - {shortenAddress(position.chainId as ChainId, '0xbf6ef625de5df898cc1d0f91868aae03976a2e2d', 4)} - + window.open(NETWORKS_INFO[position.chainId as ChainId].etherscanUrl + '/tx/' + txHash)} + sx={{ cursor: 'pointer' }} + marginRight={-1} + >{`${txHash.substring(0, 6)}...${txHash.substring(62)}`} + - + {/* {t`Past Actions`} {t`Increased Liquidity`} @@ -309,8 +337,8 @@ const LeftSection = ({ position }: { position: ParsedPosition }) => { $12,600 - - */} + */} + ) } diff --git a/src/pages/Earns/PositionDetail/index.tsx b/src/pages/Earns/PositionDetail/index.tsx index e23dd63d85..7af0f6f0df 100644 --- a/src/pages/Earns/PositionDetail/index.tsx +++ b/src/pages/Earns/PositionDetail/index.tsx @@ -50,6 +50,7 @@ export interface ParsedPosition { earning24h: number earning7d: number totalEarnedFee: number + createdTime: number } const PositionDetail = () => { @@ -106,6 +107,7 @@ const PositionDetail = () => { totalEarnedFee: position.feePending.reduce((a, b) => a + b.quotes.usd.value, 0) + position.feesClaimed.reduce((a, b) => a + b.quotes.usd.value, 0), + createdTime: position.createdTime, } }, [userPosition]) diff --git a/src/pages/Earns/useLiquidityWidget.tsx b/src/pages/Earns/useLiquidityWidget.tsx index 4a59c05b65..e4d50855f5 100644 --- a/src/pages/Earns/useLiquidityWidget.tsx +++ b/src/pages/Earns/useLiquidityWidget.tsx @@ -203,10 +203,8 @@ const useLiquidityWidget = () => { onOpenZapMigration: handleOpenZapMigrationWidget, onSubmitTx: async (txData: { from: string; to: string; data: string; value: string; gasLimit: string }) => { try { - console.log('txData', txData) if (!library) throw new Error('Library is not ready!') - const gas = await library.estimateGas(txData) - console.log(gas) + await library.estimateGas(txData) const res = await library?.getSigner().sendTransaction(txData) if (!res) throw new Error('Transaction failed') return res.hash diff --git a/src/services/zapEarn.ts b/src/services/zapEarn.ts index 5bf9145dd6..59ea75da5d 100644 --- a/src/services/zapEarn.ts +++ b/src/services/zapEarn.ts @@ -101,17 +101,6 @@ export interface PositionAmount { } } -export interface PositionQueryParams { - chainIds?: string - addresses: string - positionId?: string - protocols?: string - status?: string - q?: string - sortBy?: string - orderBy?: string -} - export interface EarnPosition { [x: string]: any chainName: 'eth' @@ -180,15 +169,6 @@ export interface EarnPosition { } } -export interface PositionEarning { - date: string - timestamp: number - totalFeeEarning: number - totalFarmEarning: number - totalEarning: number - earningByDay: number -} - interface PoolsExplorerResponse { code: number message: string @@ -201,6 +181,32 @@ interface PoolsExplorerResponse { requestId: string } +export enum PositionHistoryType { + DEPOSIT = 'DEPOSIT', +} + +export interface PositionHistory { + txHash: string + type: PositionHistoryType +} + +export interface PositionQueryParams { + chainIds?: string + addresses: string + positionId?: string + protocols?: string + status?: string + q?: string + sortBy?: string + orderBy?: string +} + +interface PositionHistoryParams { + chainId: ChainId + tokenAddress: string + tokenId: string +} + interface AddRemoveFavoriteParams { chainId: ChainId message: string @@ -277,6 +283,20 @@ const zapEarnServiceApi = createApi({ } }, }), + positionHistory: builder.query, PositionHistoryParams>({ + query: params => ({ + url: `/v1/userPositions/positionHistory`, + params, + }), + transformResponse: (response: { data: Array }) => response.data, + async onQueryStarted(agr, { dispatch, queryFulfilled }) { + try { + await queryFulfilled + } catch { + dispatch(zapEarnServiceApi.util.upsertQueryData('positionHistory', agr, [])) + } + }, + }), addFavorite: builder.mutation({ query: body => ({ method: 'POST', @@ -299,6 +319,7 @@ export const { useSupportedProtocolsQuery, usePoolsExplorerQuery, useUserPositionsQuery, + usePositionHistoryQuery, useAddFavoriteMutation, useRemoveFavoriteMutation, } = zapEarnServiceApi diff --git a/yarn.lock b/yarn.lock index a08e8b1281..84566896ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3765,10 +3765,10 @@ tiny-invariant "^1.1.0" tiny-warning "^1.0.3" -"@kyberswap/liquidity-widgets@1.1.11": - version "1.1.11" - resolved "https://registry.yarnpkg.com/@kyberswap/liquidity-widgets/-/liquidity-widgets-1.1.11.tgz#f78d8a5a8f2240c8c178967af5b1a983a42e4bf7" - integrity sha512-HKpd1/8yuXSqRS1mArfkCKMXCQVyIVchOqV0WquZmvJq5D7wg6zWOjWBCF9qPQNR2sMwL+NHME/Pa17D595hLA== +"@kyberswap/liquidity-widgets@1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@kyberswap/liquidity-widgets/-/liquidity-widgets-1.1.12.tgz#df869c388695055a8f0a885db1f97b0a43b656a9" + integrity sha512-GmXglif5ZOog3aAQoQ6AyqRuJWuRLsSw2u8C2LfNsHdcZxXkFLBFaYCyP1qLLL9maTLK2nWoOWRWEZM0+EJvFw== dependencies: "@popperjs/core" "^2.11.8" "@radix-ui/react-accordion" "^1.2.1"