From b843cb06a61ce63b18ae0f4deff93386c6b58687 Mon Sep 17 00:00:00 2001 From: sven Date: Wed, 29 Jan 2025 14:07:21 +0800 Subject: [PATCH 1/7] fetch --- .../trade/hooks/use-owner-liquidity.ts | 65 +++++++ .../trade/liquidity/list/add-stake-modal.tsx | 184 ++++++++++++++++++ .../trade/liquidity/list/farm-row-item.tsx | 176 +++++++++++++++++ .../trade/liquidity/list/farm_list.tsx | 142 ++++++++++++++ .../list/owner-liquidity-row-item.tsx | 29 +-- .../liquidity/list/owner_liquidity_list.tsx | 52 +---- .../liquidity/list/remove-liquidity-modal.tsx | 16 +- .../sections/trade/liquidity/list/view.tsx | 4 +- infra/rooch-portal-v2/src/utils/env.ts | 1 - 9 files changed, 578 insertions(+), 91 deletions(-) create mode 100644 infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts create mode 100644 infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx create mode 100644 infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx create mode 100644 infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts new file mode 100644 index 0000000000..884e02ea2d --- /dev/null +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts @@ -0,0 +1,65 @@ +import { BalanceInfoView } from '@roochnetwork/rooch-sdk'; +import { useCurrentAddress, useRoochClientQuery } from '@roochnetwork/rooch-sdk-kit'; +import { useMemo, useState, useCallback } from 'react'; +import { useNetworkVariable } from 'src/hooks/use-networks'; + +export type OwnerLiquidityItemType = { + x: { + name: string; + type: string; + }; + y: { + name: string; + type: string; + }; +} & BalanceInfoView; + +export type UseOwnerLiquidityReturn = { + lpTokens: OwnerLiquidityItemType[]; + isPending: boolean; +}; + +export function useOwnerLiquidity(): UseOwnerLiquidityReturn { + const currentAddress = useCurrentAddress(); + const dex = useNetworkVariable('dex'); + + const { data: assetsList, isPending } = useRoochClientQuery('getBalances', { + owner: currentAddress?.toStr() || '', + }); + + const lpTokens = useMemo(() => { + if (!assetsList) { + return []; + } + const tokens: OwnerLiquidityItemType[] = assetsList!.data + .filter((item) => item.symbol.startsWith('RDexLP')) + .map((item) => { + const t = item.coin_type + .replaceAll(' ', '') + .replace(`${dex.address}::swap::LPToken<`, '') + .split(','); + const x = t[0]; + const y = t[1].substring(0, t[1].length - 1); + const xName = x.split('::'); + const yName = y.split('::'); + return { + ...item, + x: { + type: x, + name: xName[xName.length - 1], + }, + y: { + type: y, + name: yName[yName.length - 1], + }, + }; + }) + .sort((a, b) => b.fixedBalance - a.fixedBalance); + return tokens; + }, [assetsList, dex.address]); + + return { + lpTokens, + isPending, + }; +} diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx new file mode 100644 index 0000000000..265db12ea5 --- /dev/null +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx @@ -0,0 +1,184 @@ +import { useState } from 'react'; +import BigNumber from 'bignumber.js'; +import { Args, Transaction } from '@roochnetwork/rooch-sdk'; +import { SessionKeyGuard, useSignAndExecuteTransaction } from '@roochnetwork/rooch-sdk-kit'; + +import { LoadingButton } from '@mui/lab'; +import { + Box, + Stack, + Button, + Dialog, + TextField, + Typography, + DialogTitle, + FormControl, + DialogActions, + DialogContent, + InputAdornment, +} from '@mui/material'; + +import { useNetworkVariable } from 'src/hooks/use-networks'; + +import { toDust } from 'src/utils/number'; +import { formatCoin } from 'src/utils/format-number'; + +import { toast } from 'src/components/snackbar'; + +import type { FarmRowItemType } from './farm-row-item'; + +// TODO: 计算收入 +export default function AddSrakeModal({ + open, + onClose, + row, +}: { + open: boolean; + onClose: () => void; + row: FarmRowItemType; +}) { + const dex = useNetworkVariable('dex'); + + const { mutateAsync, isPending } = useSignAndExecuteTransaction(); + + const [amount, setAmount] = useState(''); + const [slippage, setSlippage] = useState(0.005); + const [customSlippage, setCustomSlippage] = useState(''); + + const handleStake = () => { + const fixdAmount = toDust(amount, row.liquidity!.decimals); + const tx = new Transaction(); + tx.callFunction({ + target: `${dex.address}::liquidity_incentive::stake`, + args: [Args.u256(fixdAmount), Args.objectId(row.id)], + typeArgs: [row.x.type, row.y.type, row.reward], + }); + mutateAsync({ + transaction: tx, + }) + .then((result) => { + if (result.execution_info.status.type === 'executed') { + toast.success('stake success'); + } else { + console.log(result); + toast.error('stake failed'); + } + }) + .catch((e: any) => { + console.log(e); + toast.error('stake failed'); + }) + .finally(() => { + onClose(); + }); + }; + + return ( + + Stake + + + + + + {row.x.name}-{row.y.name} + + {row.liquidity?.symbol} + + + + Balance: {row.liquidity?.fixedBalance} + + + + + + { + setAmount(e.target.value); + }} + InputProps={{ + endAdornment: ( + + + + + + + ), + }} + /> + + + + + + + + + + Confirm + + + + + ); +} diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx new file mode 100644 index 0000000000..ab61cadd82 --- /dev/null +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx @@ -0,0 +1,176 @@ +import { Args, type BalanceInfoView } from '@roochnetwork/rooch-sdk'; + +import { + useCurrentAddress, + useRoochClient, + useRoochClientQuery, + WalletGuard, +} from '@roochnetwork/rooch-sdk-kit'; + +import { + Box, + Button, + TableRow, + TableCell, + ListItemText, + Collapse, + Stack, + Card, + CardHeader, + CardContent, + Typography, + Icon, +} from '@mui/material'; +import dayjs from 'dayjs'; +import { Fragment, useEffect, useMemo, useState } from 'react'; +import { LoadingButton } from '@mui/lab'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; +import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; +import { useNetworkVariable } from 'src/hooks/use-networks'; + +export type FarmRowItemType = { + id: string; + alive: boolean; + endtime: number; + assetTotalWeight: number; + harvestIndex: number; + releasePerSecond: number; + x: { + type: string; + name: string; + }; + y: { type: string; name: string }; + reward: string; + liquidity?: OwnerLiquidityItemType; +}; + +type RowItemProps = { + row: FarmRowItemType; + onOpenStakeModal: (row: FarmRowItemType) => void; +}; + +export default function FarmRowItem({ row, onOpenStakeModal }: RowItemProps) { + const [openCollapse, setOpenCollapse] = useState(false); + const client = useRoochClient(); + const dex = useNetworkVariable('dex'); + const currentAddress = useCurrentAddress(); + const [harvest, setHarvest] = useState(0); + + useEffect(() => { + if (!openCollapse || harvest) { + return; + } + client + .executeViewFunction({ + target: `${dex.address}::liquidity_incentive::query_harvest_token_amount`, + args: [Args.address(currentAddress?.toStr() || ''), Args.objectId(row.id)], + typeArgs: [row.x.type, row.y.type, row.reward], + }) + .then((result) => { + const s = result.return_values![0].decoded_value as number; + setHarvest(s); + console.log(result); + }); + }, [openCollapse]); + + return ( + + { + setOpenCollapse(!openCollapse); + }} + > + + + + + + + + + + + + + + + + + + + + {openCollapse ? : } + {/* { + onOpenViewModal(row); + }} + > + + */} + + + + + + + + + + Get {row.x.name}-{row.y.name} LP + + + + + + + Balance: + + + Harvest + + + + + + + + + + + + + + ); +} diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx new file mode 100644 index 0000000000..250cf6817b --- /dev/null +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx @@ -0,0 +1,142 @@ +import { useMemo, useState } from 'react'; +import { useCurrentAddress, useRoochClientQuery } from '@roochnetwork/rooch-sdk-kit'; + +import { Card, Table, TableBody } from '@mui/material'; + +import { useNetworkVariable } from 'src/hooks/use-networks'; + +import { Scrollbar } from 'src/components/scrollbar'; +import WalletGuard from 'src/components/guard/WalletGuard'; +import TableSkeleton from 'src/components/skeleton/table-skeleton'; +import { TableNoData, TableHeadCustom } from 'src/components/table'; + +import FarmRowItem, { FarmRowItemType } from './farm-row-item'; + +import AddSrakeModal from './add-stake-modal'; +import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; + +const headerLabel = [ + { id: 'lp', label: 'LP' }, + { id: 'harvest_index', label: 'Harvest Index' }, + { id: 'release_per_second', label: 'Release Per Second' }, + { id: 'asset_total_weight', label: 'Asset Total Weight' }, + { id: 'endtime', label: 'Endtime' }, + { id: 'action', label: '', align: 'right' }, +]; + +export default function FarmList() { + const currentAddress = useCurrentAddress(); + const dex = useNetworkVariable('dex'); + + const { data: farms } = useRoochClientQuery('queryObjectStates', { + filter: { + object_type: `${dex.address}::liquidity_incentive::FarmingAsset`, + }, + }); + + const { lpTokens } = useOwnerLiquidity(); + + const resolvedFarms = useMemo(() => { + if (!farms) { + return []; + } + return farms.data.map((item) => { + const view = item.decoded_value!.value; + const types = item.object_type + .replace(`${dex.address}::liquidity_incentive::FarmingAsset<`, '') + .trim() + .split(','); + const x = { + type: types[0].trim(), + name: types[0].split('::')[2].trim(), + }; + const y = { + type: types[1].trim(), + name: types[1].split('::')[2].trim(), + }; + return { + id: item.id, + alive: view['alive'] as boolean, + endtime: view['end_time'] as number, + assetTotalWeight: view['asset_total_weight'] as number, + harvestIndex: view['harvest_index'] as number, + releasePerSecond: view['release_per_second'] as number, + x: x, + y: y, + reward: types[2].replace('>', '').trim(), + liquidity: lpTokens.find((item) => item.x.type === x.type && item.y.type === y.type), + }; + }); + }, [farms, lpTokens]); + + const { + data: assetsList, + isPending, + refetch: refetchAssetsList, + } = useRoochClientQuery( + 'getBalances', + { + owner: currentAddress?.toStr() || '', + }, + { refetchInterval: 5000 } + ); + + const [openRemoveLiquidityModal, setOpenRemoveLiquidityModal] = useState(false); + const [selectedRow, setSelectedRow] = useState(); + + const handleAddModal = (row: FarmRowItemType) => { + setSelectedRow(row); + setOpenRemoveLiquidityModal(true); + }; + + const handleCloseRemoveModal = () => { + setOpenRemoveLiquidityModal(false); + setSelectedRow(undefined); + }; + + return ( + + + {/* + + + + + + */} + + + + + + {isPending ? ( + + ) : ( + <> + {resolvedFarms?.map((row) => ( + + ))} + + + )} + +
+
+ + {selectedRow && ( + + )} +
+
+ ); +} diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx index bb7240cb21..fe969d1643 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx @@ -3,17 +3,7 @@ import type { BalanceInfoView } from '@roochnetwork/rooch-sdk'; import { WalletGuard } from '@roochnetwork/rooch-sdk-kit'; import { Box, Button, TableRow, TableCell, ListItemText } from '@mui/material'; - -export type OwnerLiquidityItemType = { - x: { - name: string; - type: string; - }; - y: { - name: string; - type: string; - }; -} & BalanceInfoView; +import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; type RowItemProps = { row: OwnerLiquidityItemType; @@ -21,23 +11,6 @@ type RowItemProps = { }; export default function OwnerLiquidityRowItem({ row, onOpenViewModal }: RowItemProps) { - // const coin = useMemo(() => { - // const t = row.coin_type.split(','); - // const x = t[0]; - // const y = t[1]; - // const xName = x.split('::'); - // const yName = y.split('::'); - // return { - // x: { - // type: x, - // name: xName[xName.length - 1].replaceAll('>', ''), - // }, - // y: { - // type: y, - // name: yName[yName.length - 1].replaceAll('>', ''), - // }, - // }; - // }, [row]); return ( diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx index 31e40368c1..317cf00552 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx @@ -1,10 +1,7 @@ import { useMemo, useState } from 'react'; -import { useCurrentAddress, useRoochClientQuery } from '@roochnetwork/rooch-sdk-kit'; import { Card, Table, TableBody } from '@mui/material'; -import { useNetworkVariable } from 'src/hooks/use-networks'; - import { Scrollbar } from 'src/components/scrollbar'; import WalletGuard from 'src/components/guard/WalletGuard'; import TableSkeleton from 'src/components/skeleton/table-skeleton'; @@ -14,6 +11,7 @@ import RemoveLiquidityModal from './remove-liquidity-modal'; import OwnerLiquidityRowItem from './owner-liquidity-row-item'; import type { OwnerLiquidityItemType } from './owner-liquidity-row-item'; +import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; const headerLabel = [ { id: 'lp', label: 'LP' }, @@ -25,53 +23,7 @@ const headerLabel = [ ]; export default function OwnerLiquidityList() { - const currentAddress = useCurrentAddress(); - const dex = useNetworkVariable('dex'); - - const { - data: assetsList, - isPending, - refetch: refetchAssetsList, - } = useRoochClientQuery( - 'getBalances', - { - owner: currentAddress?.toStr() || '', - }, - { refetchInterval: 5000 } - ); - - const lpTokens = useMemo(() => { - if (!assetsList) { - return []; - } - const tokens: OwnerLiquidityItemType[] = assetsList!.data - .filter((item) => item.symbol.startsWith('RDexLP')) - .map((item) => { - const t = item.coin_type - .replaceAll(' ', '') - .replace(`${dex.address}::swap::LPToken<`, '') - .split(','); - const x = t[0]; - const y = t[1].substring(0, t[1].length - 1); - const xName = x.split('::'); - const yName = y.split('::'); - return { - ...item, - x: { - type: x, - name: xName[xName.length - 1], - }, - y: { - type: y, - name: yName[yName.length - 1], - }, - }; - }) - .sort((a, b) => b.fixedBalance - a.fixedBalance); - return tokens; - }, [assetsList, dex.address]); - - console.log('my token', lpTokens); + const { lpTokens, isPending } = useOwnerLiquidity(); const [openRemoveLiquidityModal, setOpenRemoveLiquidityModal] = useState(false); const [selectedRow, setSelectedRow] = useState(); diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/remove-liquidity-modal.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/remove-liquidity-modal.tsx index af92530aab..fff30dfb61 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/remove-liquidity-modal.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/remove-liquidity-modal.tsx @@ -1,17 +1,11 @@ - import { useState } from 'react'; import BigNumber from 'bignumber.js'; -import { - Args, - Transaction, -} from '@roochnetwork/rooch-sdk'; -import { - SessionKeyGuard, - useSignAndExecuteTransaction, -} from '@roochnetwork/rooch-sdk-kit'; +import { Args, Transaction } from '@roochnetwork/rooch-sdk'; +import { SessionKeyGuard, useSignAndExecuteTransaction } from '@roochnetwork/rooch-sdk-kit'; import { LoadingButton } from '@mui/lab'; -import { Box , +import { + Box, Stack, Button, Dialog, @@ -31,7 +25,7 @@ import { formatCoin } from 'src/utils/format-number'; import { toast } from 'src/components/snackbar'; -import type { OwnerLiquidityItemType } from './owner-liquidity-row-item'; +import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; // TODO: 计算收入 export default function RemoveLiquidityModal({ diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx index 31552631cc..dadce5dc51 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx @@ -8,11 +8,12 @@ import { DashboardContent } from 'src/layouts/dashboard'; import AllLiquidityList from './all_liquidity_list'; import OwnerLiquidityList from './owner_liquidity_list'; +import FarmList from './farm_list'; const TABS = [ { label: 'All Liquidity', value: 'all_liquidity' }, { label: 'Your Liquidity', value: 'you_liquidity' }, - // { label: 'Farm', value: 'farm' }, + { label: 'Farm', value: 'farm' }, ]; export default function LiquidityListView() { @@ -35,6 +36,7 @@ export default function LiquidityListView() { {tabs.value === 'all_liquidity' && } {tabs.value === 'you_liquidity' && } + {tabs.value === 'farm' && } ); } diff --git a/infra/rooch-portal-v2/src/utils/env.ts b/infra/rooch-portal-v2/src/utils/env.ts index 61d42a422c..6462740e2d 100644 --- a/infra/rooch-portal-v2/src/utils/env.ts +++ b/infra/rooch-portal-v2/src/utils/env.ts @@ -1,7 +1,6 @@ 'use client'; export function isMainNetwork() { - return true; if (typeof window !== 'undefined') { return ( window.location.hostname === 'portal.rooch.network' || From 02e131079524fd100a5cce2227d9267455ec785f Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 05:44:59 +0800 Subject: [PATCH 2/7] fix bugs --- .../sections/trade/hooks/use-all-liquidity.ts | 87 +++++++++ .../trade/hooks/use-owner-liquidity.ts | 1 + .../liquidity/list/add-liquidity-modal.tsx | 6 +- .../liquidity/list/all_liquidity_list.tsx | 12 -- .../trade/liquidity/list/farm-row-item.tsx | 166 +++++++++++++++--- .../trade/liquidity/list/farm_list.tsx | 66 ++++--- 6 files changed, 272 insertions(+), 66 deletions(-) create mode 100644 infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts new file mode 100644 index 0000000000..a0686ee95e --- /dev/null +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts @@ -0,0 +1,87 @@ +import { AnnotatedMoveStructView, BalanceInfoView } from '@roochnetwork/rooch-sdk'; +import { + useCurrentAddress, + useRoochClient, + useRoochClientQuery, +} from '@roochnetwork/rooch-sdk-kit'; +import { useMemo, useState, useCallback } from 'react'; +import { useNetworkVariable } from 'src/hooks/use-networks'; +import { formatCoin } from 'src/utils/format-number'; + +export type AllLiquidityItemType = { + id: string; + createAt: number; + x: { + id: string; + symbol: string; + type: string; + }; + y: { + id: string; + symbol: string; + type: string; + }; + lpTokenId: string; + creator: string; +}; + +export type UseAllLiquidityReturn = { + lpTokens: AllLiquidityItemType[]; + isPending: boolean; +}; + +export function useAllLiquidity(): UseAllLiquidityReturn { + const currentAddress = useCurrentAddress(); + const dex = useNetworkVariable('dex'); + const client = useRoochClient(); + + const { data: tokenPairs, isPending } = useRoochClientQuery('queryObjectStates', { + filter: { + object_type: `${dex.address}::swap::TokenPair`, + }, + queryOption: { + showDisplay: true, + }, + }); + + const resolvedTokenPairs = useMemo(() => { + if (!tokenPairs) { + return []; + } + + const rowItme: AllLiquidityItemType[] = tokenPairs!.data.map((item) => { + const xView = item.decoded_value!.value.balance_x as AnnotatedMoveStructView; + let xType = xView.type.replace('0x2::object::Object<0x3::coin_store::CoinStore<', ''); + xType = xType.replace('>>', ''); + const xName = xType.split('::'); + const yView = item.decoded_value!.value.balance_y as AnnotatedMoveStructView; + let yType = yView.type.replace('0x2::object::Object<0x3::coin_store::CoinStore<', ''); + yType = yType.replace('>>', ''); + const yName = yType.split('::'); + const lpView = item.decoded_value!.value.coin_info as AnnotatedMoveStructView; + return { + id: item.id, + creator: item.decoded_value!.value.creator as string, + createAt: Number(item.created_at), + lpTokenId: lpView.value.id as string, + x: { + id: xView.value.id as string, + symbol: xName[xName.length - 1].replace('>>', ''), + type: xType, + }, + y: { + id: yView.value.id as string, + symbol: yName[xName.length - 1].replace('>>', ''), + type: yType, + }, + }; + }); + + return rowItme; + }, [tokenPairs]); + + return { + lpTokens: resolvedTokenPairs, + isPending, + }; +} diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts index 884e02ea2d..dcd8d578f5 100644 --- a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts @@ -31,6 +31,7 @@ export function useOwnerLiquidity(): UseOwnerLiquidityReturn { if (!assetsList) { return []; } + console.log('owner', assetsList); const tokens: OwnerLiquidityItemType[] = assetsList!.data .filter((item) => item.symbol.startsWith('RDexLP')) .map((item) => { diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx index 8bb1ec811f..0d865d4c17 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx @@ -1,6 +1,6 @@ import type { BalanceInfoView, AnnotatedMoveStructView } from '@roochnetwork/rooch-sdk'; -import { toast } from 'sonner'; +import { toast } from 'src/components/snackbar'; import BigNumber from 'bignumber.js'; import { useDebounce } from 'react-use'; import { Args, Transaction } from '@roochnetwork/rooch-sdk'; @@ -221,7 +221,9 @@ export default function AddLiquidityModal({ const y = BigNumber(yBalance).multipliedBy(xRate); if (y.toNumber() > Number(assetsMap.get(row.y.type)?.balance || 0)) { - setYLabelError(`Insufficient`); + setYLabelError('Insufficient'); + } else { + setYLabelError(undefined); } setYAmount(y.toFixed(0, 1)); }, [xAmount, reserveX, reserveY, row.x.type, row.y.type, assetsMap]); diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/all_liquidity_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/all_liquidity_list.tsx index 95a19abd52..73d1c19abe 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/all_liquidity_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/all_liquidity_list.tsx @@ -158,18 +158,6 @@ export default function AllLiquidityList() { } }, [paginationModel, tokenPairs]); - // const { - // data: assetsList, - // isPending, - // refetch: refetchAssetsList, - // } = useRoochClientQuery( - // 'getBalances', - // { - // owner: currentAddress?.toStr() || '', - // }, - // { refetchInterval: 5000 } - // ); - const [openAddLiquidityModal, setOpenAddLiquidityModal] = useState(false); const [selectedRow, setSelectedRow] = useState(); diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx index ab61cadd82..1d1af4177e 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx @@ -1,9 +1,11 @@ -import { Args, type BalanceInfoView } from '@roochnetwork/rooch-sdk'; +import { Args, Transaction, type BalanceInfoView } from '@roochnetwork/rooch-sdk'; import { + SessionKeyGuard, useCurrentAddress, useRoochClient, useRoochClientQuery, + useSignAndExecuteTransaction, WalletGuard, } from '@roochnetwork/rooch-sdk-kit'; @@ -22,12 +24,13 @@ import { Icon, } from '@mui/material'; import dayjs from 'dayjs'; -import { Fragment, useEffect, useMemo, useState } from 'react'; +import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; import { LoadingButton } from '@mui/lab'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; import { useNetworkVariable } from 'src/hooks/use-networks'; +import { toast } from 'src/components/snackbar'; export type FarmRowItemType = { id: string; @@ -47,32 +50,121 @@ export type FarmRowItemType = { type RowItemProps = { row: FarmRowItemType; + selectRow?: FarmRowItemType; onOpenStakeModal: (row: FarmRowItemType) => void; + onOpenAddLiquidityModal: (row: FarmRowItemType) => void; }; -export default function FarmRowItem({ row, onOpenStakeModal }: RowItemProps) { +export default function FarmRowItem({ + row, + onOpenStakeModal, + onOpenAddLiquidityModal, + selectRow, +}: RowItemProps) { const [openCollapse, setOpenCollapse] = useState(false); const client = useRoochClient(); const dex = useNetworkVariable('dex'); const currentAddress = useCurrentAddress(); + const [staked, setStaked] = useState(false); const [harvest, setHarvest] = useState(0); + const [rewardCoin, setRewardCoin] = useState(); + const { mutateAsync, isPending } = useSignAndExecuteTransaction(); - useEffect(() => { - if (!openCollapse || harvest) { + const fetchHarvest = useCallback(() => { + if (!openCollapse) { return; } client .executeViewFunction({ - target: `${dex.address}::liquidity_incentive::query_harvest_token_amount`, - args: [Args.address(currentAddress?.toStr() || ''), Args.objectId(row.id)], + target: `${dex.address}::liquidity_incentive::query_stake`, + args: [Args.objectId(row.id), Args.address(currentAddress?.toStr() || '')], typeArgs: [row.x.type, row.y.type, row.reward], }) .then((result) => { const s = result.return_values![0].decoded_value as number; - setHarvest(s); - console.log(result); + console.log('staked', s); + setStaked(s > 0); + if (s > 0) { + client + .executeViewFunction({ + target: `${dex.address}::liquidity_incentive::query_harvest_token_amount`, + args: [Args.address(currentAddress?.toStr() || ''), Args.objectId(row.id)], + typeArgs: [row.x.type, row.y.type, row.reward], + }) + .then((result) => { + const s = result.return_values![0].decoded_value as number; + setHarvest(s); + }); + } + }); + }, [client, dex, openCollapse, row]); + + useEffect(() => { + fetchHarvest(); + console.log('sel'); + }, [selectRow]); + + useEffect(() => { + fetchHarvest(); + }, [fetchHarvest]); + + useEffect(() => { + client + .getBalance({ + owner: currentAddress?.toStr() || '', + coinType: row.reward, + }) + .then((result) => { + setRewardCoin(result); + }); + }, [openCollapse, client, currentAddress, row]); + + const handleHarvest = () => { + const tx = new Transaction(); + tx.callFunction({ + target: `${dex.address}::liquidity_incentive::harvest`, + args: [Args.objectId(row.id)], + typeArgs: [row.x.type, row.y.type, row.reward], + }); + mutateAsync({ + transaction: tx, + }) + .then((result) => { + if (result.execution_info.status.type === 'executed') { + fetchHarvest(); + toast.success('harvest success'); + } else { + toast.error('harvest failed'); + } + }) + .catch((e: any) => { + console.log(e); + toast.error('harvest failed'); + }); + }; + + const handleAction = (target: 'harvest' | 'unstake') => { + const tx = new Transaction(); + tx.callFunction({ + target: `${dex.address}::liquidity_incentive::${target}`, + args: [Args.objectId(row.id)], + typeArgs: [row.x.type, row.y.type, row.reward], + }); + mutateAsync({ + transaction: tx, + }) + .then((result) => { + if (result.execution_info.status.type === 'executed') { + fetchHarvest(); + toast.success(`${target} success`); + } else { + toast.error(`${target} failed`); + } + }) + .catch((e: any) => { + toast.error(`${target} failed`); }); - }, [openCollapse]); + }; return ( @@ -104,15 +196,6 @@ export default function FarmRowItem({ row, onOpenStakeModal }: RowItemProps) { {openCollapse ? : } - {/* { - onOpenViewModal(row); - }} - > - - */} @@ -133,19 +216,46 @@ export default function FarmRowItem({ row, onOpenStakeModal }: RowItemProps) { height: '100%', }} > - + - - - Balance: - - - Harvest - + + + + Eligible ${rewardCoin?.symbol}: {harvest} + + {staked && ( + { + handleAction(harvest > 0 ? 'harvest' : 'unstake'); + }} + > + + {harvest > 0 && 'Harvest'} + {harvest < 1 && 'Unstake'} + + + )} + diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx index 250cf6817b..27e4c37478 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx @@ -14,6 +14,8 @@ import FarmRowItem, { FarmRowItemType } from './farm-row-item'; import AddSrakeModal from './add-stake-modal'; import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; +import AddLiquidityModal from './add-liquidity-modal'; +import { useAllLiquidity } from '../../hooks/use-all-liquidity'; const headerLabel = [ { id: 'lp', label: 'LP' }, @@ -27,6 +29,11 @@ const headerLabel = [ export default function FarmList() { const currentAddress = useCurrentAddress(); const dex = useNetworkVariable('dex'); + const [openStakeModal, setOpenStakeModal] = useState(false); + const [openAddLiquidityModal, setOpenAddLiquidityModal] = useState(false); + const [selectedRow, setSelectedRow] = useState(); + const { lpTokens } = useOwnerLiquidity(); + const { lpTokens: allLPTokens } = useAllLiquidity(); const { data: farms } = useRoochClientQuery('queryObjectStates', { filter: { @@ -34,8 +41,6 @@ export default function FarmList() { }, }); - const { lpTokens } = useOwnerLiquidity(); - const resolvedFarms = useMemo(() => { if (!farms) { return []; @@ -81,34 +86,29 @@ export default function FarmList() { { refetchInterval: 5000 } ); - const [openRemoveLiquidityModal, setOpenRemoveLiquidityModal] = useState(false); - const [selectedRow, setSelectedRow] = useState(); + const handleOpenStakeModal = (row: FarmRowItemType) => { + setSelectedRow(row); + setOpenStakeModal(true); + }; - const handleAddModal = (row: FarmRowItemType) => { + const handleCloseStakeModal = () => { + setOpenStakeModal(false); + setSelectedRow(undefined); + }; + + const handleOpenAddLiquidityModal = (row: FarmRowItemType) => { setSelectedRow(row); - setOpenRemoveLiquidityModal(true); + setOpenAddLiquidityModal(true); }; - const handleCloseRemoveModal = () => { - setOpenRemoveLiquidityModal(false); + const handleCloseAddLiquidityModal = () => { + setOpenAddLiquidityModal(false); setSelectedRow(undefined); }; return ( - {/* - - - - - - */} @@ -119,7 +119,13 @@ export default function FarmList() { ) : ( <> {resolvedFarms?.map((row) => ( - + ))} @@ -130,10 +136,22 @@ export default function FarmList() { {selectedRow && ( + )} + {selectedRow && ( + item.x.type === selectedRow.x.type && item.y.type === selectedRow.y.type + )! + } + key={openAddLiquidityModal ? 'open' : 'closed'} /> )} From c8bbe11f7de82af1708ac5965601434bea10eea9 Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 06:18:55 +0800 Subject: [PATCH 3/7] fix swap price --- .../sections/trade/components/select-token-pair.tsx | 2 +- .../rooch-portal-v2/src/sections/trade/swap/view.tsx | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/infra/rooch-portal-v2/src/sections/trade/components/select-token-pair.tsx b/infra/rooch-portal-v2/src/sections/trade/components/select-token-pair.tsx index 362d6c04d7..fd2235d6d8 100644 --- a/infra/rooch-portal-v2/src/sections/trade/components/select-token-pair.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/components/select-token-pair.tsx @@ -170,7 +170,7 @@ export default function SelectTokenPair({ onLoading, onCallback }: SelectTokenPa type: yCoin.coin_type, icon: yCoin.icon_url || undefined, symbol: yCoin.symbol, - amount: yCount, + amount: fixdYCount.toString(), decimal: yCoin.decimals, } ); diff --git a/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx b/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx index 1b68765370..5cc136f73d 100644 --- a/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx @@ -14,6 +14,7 @@ import SwapConfirmModal from './confirm-modal'; import SelectTokenPair from '../components/select-token-pair'; import type { TradeCoinType } from '../components/types'; +import { toDust } from 'src/utils/number'; export default function SwapView() { const dex = useNetworkVariable('dex'); @@ -25,6 +26,7 @@ export default function SwapView() { const [slippage, setSlippage] = useState(0.005); const [customSlippage, setCustomSlippage] = useState(''); const [openSwapModal, setOpenSwapModal] = useState(false); + const [price, setPrice] = useState(''); return ( <> @@ -41,13 +43,14 @@ export default function SwapView() { onCallback={(x, y) => { setX(x); setY(y); + const ratio = BigNumber(y!.amount).div(x!.amount); + const fixedRatio = ratio.toFixed(8, 1); + const finalRatio = ratio.isInteger() ? ratio.toFixed(0) : fixedRatio; + setPrice(finalRatio); }} /> - Price{' '} - {x && y - ? `1 ${x?.symbol} ≈ ${BigNumber(y?.amount).div(x?.amount).toFixed(0, 1)} ${y?.symbol}` - : '-'} + Price {x && y ? `1 ${x?.symbol} ≈ ${price} ${y?.symbol}` : '-'} Slippage From f3f598436b795165d59b8cd6a2db20fbeac75b71 Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 06:24:46 +0800 Subject: [PATCH 4/7] rm console --- .../src/sections/trade/hooks/use-owner-liquidity.ts | 2 +- .../src/sections/trade/liquidity/list/farm-row-item.tsx | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts index dcd8d578f5..c8f0442d86 100644 --- a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts @@ -31,7 +31,7 @@ export function useOwnerLiquidity(): UseOwnerLiquidityReturn { if (!assetsList) { return []; } - console.log('owner', assetsList); + const tokens: OwnerLiquidityItemType[] = assetsList!.data .filter((item) => item.symbol.startsWith('RDexLP')) .map((item) => { diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx index 1d1af4177e..8aff7fb422 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx @@ -82,7 +82,6 @@ export default function FarmRowItem({ }) .then((result) => { const s = result.return_values![0].decoded_value as number; - console.log('staked', s); setStaked(s > 0); if (s > 0) { client @@ -101,7 +100,6 @@ export default function FarmRowItem({ useEffect(() => { fetchHarvest(); - console.log('sel'); }, [selectRow]); useEffect(() => { From 65f475367e2641a40d2862743dda877359bb40a9 Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 06:28:04 +0800 Subject: [PATCH 5/7] fix lint --- .../src/components/iconify copy/iconify.tsx | 6 ++-- .../src/components/iconify copy/types.ts | 2 +- .../swap/swap-transaction-header.tsx | 5 +++ .../history/components/empty-content.tsx | 4 ++- .../history/components/table-no-data.tsx | 3 +- .../components/table-pagination-custom.tsx | 8 ++--- .../sections/history/components/use-table.ts | 2 +- .../sections/trade/hooks/use-all-liquidity.ts | 9 ++--- .../trade/hooks/use-owner-liquidity.ts | 6 ++-- .../liquidity/list/add-liquidity-modal.tsx | 5 +-- .../trade/liquidity/list/add-stake-modal.tsx | 1 - .../trade/liquidity/list/farm-row-item.tsx | 36 +++++++++---------- .../trade/liquidity/list/farm_list.tsx | 23 ++++++------ .../list/owner-liquidity-row-item.tsx | 2 +- .../liquidity/list/owner_liquidity_list.tsx | 4 +-- .../sections/trade/liquidity/list/view.tsx | 2 +- .../src/sections/trade/swap/view.tsx | 1 - 17 files changed, 65 insertions(+), 54 deletions(-) diff --git a/infra/rooch-portal-v2/src/components/iconify copy/iconify.tsx b/infra/rooch-portal-v2/src/components/iconify copy/iconify.tsx index 87aaafec74..f1df5a1401 100644 --- a/infra/rooch-portal-v2/src/components/iconify copy/iconify.tsx +++ b/infra/rooch-portal-v2/src/components/iconify copy/iconify.tsx @@ -1,9 +1,11 @@ +import type { BoxProps } from '@mui/material/Box'; + import { forwardRef } from 'react'; import { Icon } from '@iconify/react'; -import Box, { BoxProps } from '@mui/material/Box'; +import Box from '@mui/material/Box'; -import { IconifyProps } from './types'; +import type { IconifyProps } from './types'; // ---------------------------------------------------------------------- diff --git a/infra/rooch-portal-v2/src/components/iconify copy/types.ts b/infra/rooch-portal-v2/src/components/iconify copy/types.ts index a7537a9624..270d344cad 100644 --- a/infra/rooch-portal-v2/src/components/iconify copy/types.ts +++ b/infra/rooch-portal-v2/src/components/iconify copy/types.ts @@ -1,4 +1,4 @@ -import { IconifyIcon } from '@iconify/react'; +import type { IconifyIcon } from '@iconify/react'; // ---------------------------------------------------------------------- diff --git a/infra/rooch-portal-v2/src/components/swap/swap-transaction-header.tsx b/infra/rooch-portal-v2/src/components/swap/swap-transaction-header.tsx index e17d35eebe..e3fd54603c 100644 --- a/infra/rooch-portal-v2/src/components/swap/swap-transaction-header.tsx +++ b/infra/rooch-portal-v2/src/components/swap/swap-transaction-header.tsx @@ -62,6 +62,11 @@ + + + + + diff --git a/infra/rooch-portal-v2/src/sections/history/components/empty-content.tsx b/infra/rooch-portal-v2/src/sections/history/components/empty-content.tsx index bfdd347ef1..6d2932978f 100644 --- a/infra/rooch-portal-v2/src/sections/history/components/empty-content.tsx +++ b/infra/rooch-portal-v2/src/sections/history/components/empty-content.tsx @@ -1,7 +1,9 @@ +import type { StackProps } from '@mui/material/Stack'; + import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import { alpha } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import Stack, { StackProps } from '@mui/material/Stack'; // ---------------------------------------------------------------------- diff --git a/infra/rooch-portal-v2/src/sections/history/components/table-no-data.tsx b/infra/rooch-portal-v2/src/sections/history/components/table-no-data.tsx index d114d39a60..ab63c74385 100644 --- a/infra/rooch-portal-v2/src/sections/history/components/table-no-data.tsx +++ b/infra/rooch-portal-v2/src/sections/history/components/table-no-data.tsx @@ -1,6 +1,7 @@ +import type { Theme, SxProps } from '@mui/material/styles'; + import TableRow from '@mui/material/TableRow'; import TableCell from '@mui/material/TableCell'; -import { Theme, SxProps } from '@mui/material/styles'; import EmptyContent from './empty-content'; diff --git a/infra/rooch-portal-v2/src/sections/history/components/table-pagination-custom.tsx b/infra/rooch-portal-v2/src/sections/history/components/table-pagination-custom.tsx index 0074f51b13..7e9b6099d0 100644 --- a/infra/rooch-portal-v2/src/sections/history/components/table-pagination-custom.tsx +++ b/infra/rooch-portal-v2/src/sections/history/components/table-pagination-custom.tsx @@ -1,8 +1,8 @@ +import type { Theme, SxProps } from '@mui/material/styles'; +import type { TablePaginationProps } from '@mui/material/TablePagination'; + import Box from '@mui/material/Box'; -import Switch from '@mui/material/Switch'; -import { Theme, SxProps } from '@mui/material/styles'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import TablePagination, { TablePaginationProps } from '@mui/material/TablePagination'; +import TablePagination from '@mui/material/TablePagination'; // ---------------------------------------------------------------------- diff --git a/infra/rooch-portal-v2/src/sections/history/components/use-table.ts b/infra/rooch-portal-v2/src/sections/history/components/use-table.ts index e1af163ca0..f1d57ef11d 100644 --- a/infra/rooch-portal-v2/src/sections/history/components/use-table.ts +++ b/infra/rooch-portal-v2/src/sections/history/components/use-table.ts @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; -import { TableProps } from './types'; +import type { TableProps } from './types'; // ---------------------------------------------------------------------- diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts index a0686ee95e..92d882851f 100644 --- a/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-all-liquidity.ts @@ -1,12 +1,13 @@ -import { AnnotatedMoveStructView, BalanceInfoView } from '@roochnetwork/rooch-sdk'; +import type { AnnotatedMoveStructView} from '@roochnetwork/rooch-sdk'; + +import { useMemo } from 'react'; import { - useCurrentAddress, useRoochClient, + useCurrentAddress, useRoochClientQuery, } from '@roochnetwork/rooch-sdk-kit'; -import { useMemo, useState, useCallback } from 'react'; + import { useNetworkVariable } from 'src/hooks/use-networks'; -import { formatCoin } from 'src/utils/format-number'; export type AllLiquidityItemType = { id: string; diff --git a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts index c8f0442d86..7675e79deb 100644 --- a/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts +++ b/infra/rooch-portal-v2/src/sections/trade/hooks/use-owner-liquidity.ts @@ -1,6 +1,8 @@ -import { BalanceInfoView } from '@roochnetwork/rooch-sdk'; +import type { BalanceInfoView } from '@roochnetwork/rooch-sdk'; + +import { useMemo } from 'react'; import { useCurrentAddress, useRoochClientQuery } from '@roochnetwork/rooch-sdk-kit'; -import { useMemo, useState, useCallback } from 'react'; + import { useNetworkVariable } from 'src/hooks/use-networks'; export type OwnerLiquidityItemType = { diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx index 0d865d4c17..3078c33eb5 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-liquidity-modal.tsx @@ -1,6 +1,5 @@ import type { BalanceInfoView, AnnotatedMoveStructView } from '@roochnetwork/rooch-sdk'; -import { toast } from 'src/components/snackbar'; import BigNumber from 'bignumber.js'; import { useDebounce } from 'react-use'; import { Args, Transaction } from '@roochnetwork/rooch-sdk'; @@ -35,6 +34,8 @@ import { useNetworkVariable } from 'src/hooks/use-networks'; import { formatCoin } from 'src/utils/format-number'; import { toDust, bigNumberToBigInt } from 'src/utils/number'; +import { toast } from 'src/components/snackbar'; + import Icon from '../components/icon'; import type { AllLiquidityItemType } from './all-liquidity-row-item'; @@ -259,7 +260,7 @@ export default function AddLiquidityModal({ inputMode="decimal" autoComplete="off" onChange={(e) => { - const value = e.target.value; + const {value} = e.target; if (/^\d*\.?\d*$/.test(value) === false) { return; } diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx index 265db12ea5..6773974715 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/add-stake-modal.tsx @@ -5,7 +5,6 @@ import { SessionKeyGuard, useSignAndExecuteTransaction } from '@roochnetwork/roo import { LoadingButton } from '@mui/lab'; import { - Box, Stack, Button, Dialog, diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx index 8aff7fb422..dc4af8363f 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm-row-item.tsx @@ -1,37 +1,35 @@ +import dayjs from 'dayjs'; +import { Fragment, useState, useEffect, useCallback } from 'react'; import { Args, Transaction, type BalanceInfoView } from '@roochnetwork/rooch-sdk'; - import { + useRoochClient, SessionKeyGuard, useCurrentAddress, - useRoochClient, - useRoochClientQuery, useSignAndExecuteTransaction, - WalletGuard, } from '@roochnetwork/rooch-sdk-kit'; +import { LoadingButton } from '@mui/lab'; +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import { Box, + Card, + Stack, Button, TableRow, - TableCell, - ListItemText, Collapse, - Stack, - Card, - CardHeader, - CardContent, + TableCell, Typography, - Icon, + CardContent, + ListItemText, } from '@mui/material'; -import dayjs from 'dayjs'; -import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; -import { LoadingButton } from '@mui/lab'; -import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; -import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; + import { useNetworkVariable } from 'src/hooks/use-networks'; + import { toast } from 'src/components/snackbar'; +import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; + export type FarmRowItemType = { id: string; alive: boolean; @@ -96,11 +94,11 @@ export default function FarmRowItem({ }); } }); - }, [client, dex, openCollapse, row]); + }, [client, dex, openCollapse, row, currentAddress]); useEffect(() => { fetchHarvest(); - }, [selectRow]); + }, [selectRow, fetchHarvest]); useEffect(() => { fetchHarvest(); diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx index 27e4c37478..770d966e95 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx @@ -10,12 +10,13 @@ import WalletGuard from 'src/components/guard/WalletGuard'; import TableSkeleton from 'src/components/skeleton/table-skeleton'; import { TableNoData, TableHeadCustom } from 'src/components/table'; -import FarmRowItem, { FarmRowItemType } from './farm-row-item'; - +import FarmRowItem from './farm-row-item'; import AddSrakeModal from './add-stake-modal'; -import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; import AddLiquidityModal from './add-liquidity-modal'; import { useAllLiquidity } from '../../hooks/use-all-liquidity'; +import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; + +import type { FarmRowItemType } from './farm-row-item'; const headerLabel = [ { id: 'lp', label: 'LP' }, @@ -61,18 +62,18 @@ export default function FarmList() { }; return { id: item.id, - alive: view['alive'] as boolean, - endtime: view['end_time'] as number, - assetTotalWeight: view['asset_total_weight'] as number, - harvestIndex: view['harvest_index'] as number, - releasePerSecond: view['release_per_second'] as number, - x: x, - y: y, + alive: view.alive as boolean, + endtime: view.end_time as number, + assetTotalWeight: view.asset_total_weight as number, + harvestIndex: view.harvest_index as number, + releasePerSecond: view.release_per_second as number, + x, + y, reward: types[2].replace('>', '').trim(), liquidity: lpTokens.find((item) => item.x.type === x.type && item.y.type === y.type), }; }); - }, [farms, lpTokens]); + }, [farms, lpTokens, dex.address]); const { data: assetsList, diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx index fe969d1643..7ebbc4c80c 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner-liquidity-row-item.tsx @@ -1,8 +1,8 @@ -import type { BalanceInfoView } from '@roochnetwork/rooch-sdk'; import { WalletGuard } from '@roochnetwork/rooch-sdk-kit'; import { Box, Button, TableRow, TableCell, ListItemText } from '@mui/material'; + import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; type RowItemProps = { diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx index 317cf00552..a775b5b101 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import { useState } from 'react'; import { Card, Table, TableBody } from '@mui/material'; @@ -9,9 +9,9 @@ import { TableNoData, TableHeadCustom } from 'src/components/table'; import RemoveLiquidityModal from './remove-liquidity-modal'; import OwnerLiquidityRowItem from './owner-liquidity-row-item'; +import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; import type { OwnerLiquidityItemType } from './owner-liquidity-row-item'; -import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; const headerLabel = [ { id: 'lp', label: 'LP' }, diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx index dadce5dc51..209413fbad 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/view.tsx @@ -6,9 +6,9 @@ import { useTabs } from 'src/hooks/use-tabs'; import { DashboardContent } from 'src/layouts/dashboard'; +import FarmList from './farm_list'; import AllLiquidityList from './all_liquidity_list'; import OwnerLiquidityList from './owner_liquidity_list'; -import FarmList from './farm_list'; const TABS = [ { label: 'All Liquidity', value: 'all_liquidity' }, diff --git a/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx b/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx index 5cc136f73d..6e4f2ffcc5 100644 --- a/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/swap/view.tsx @@ -14,7 +14,6 @@ import SwapConfirmModal from './confirm-modal'; import SelectTokenPair from '../components/select-token-pair'; import type { TradeCoinType } from '../components/types'; -import { toDust } from 'src/utils/number'; export default function SwapView() { const dex = useNetworkVariable('dex'); From c4b35b87b041dcf1e5be0f4ddb71ec75e3c25cd6 Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 06:33:37 +0800 Subject: [PATCH 6/7] fix build --- .../src/sections/trade/liquidity/list/owner_liquidity_list.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx index a775b5b101..3225ec56cb 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/owner_liquidity_list.tsx @@ -11,7 +11,7 @@ import RemoveLiquidityModal from './remove-liquidity-modal'; import OwnerLiquidityRowItem from './owner-liquidity-row-item'; import { useOwnerLiquidity } from '../../hooks/use-owner-liquidity'; -import type { OwnerLiquidityItemType } from './owner-liquidity-row-item'; +import type { OwnerLiquidityItemType } from '../../hooks/use-owner-liquidity'; const headerLabel = [ { id: 'lp', label: 'LP' }, From 601d6c334f58033247b3deab777997c21ab13fcb Mon Sep 17 00:00:00 2001 From: sven Date: Thu, 30 Jan 2025 06:39:48 +0800 Subject: [PATCH 7/7] fix CodeQL --- .../src/sections/trade/liquidity/list/farm_list.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx index 770d966e95..8cc6589823 100644 --- a/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx +++ b/infra/rooch-portal-v2/src/sections/trade/liquidity/list/farm_list.tsx @@ -69,7 +69,7 @@ export default function FarmList() { releasePerSecond: view.release_per_second as number, x, y, - reward: types[2].replace('>', '').trim(), + reward: types[2].replaceAll('>', '').trim(), liquidity: lpTokens.find((item) => item.x.type === x.type && item.y.type === y.type), }; });