Optimize your {groupedPosition.loanAsset} lending strategy by redistributing funds
across markets, add "Rebalance" actions to fine-tune your portfolio.
@@ -344,18 +344,18 @@ export function RebalanceModal({
diff --git a/app/positions/components/RebalanceProcessModal.tsx b/app/positions/components/RebalanceProcessModal.tsx
index ac273426..5385095a 100644
--- a/app/positions/components/RebalanceProcessModal.tsx
+++ b/app/positions/components/RebalanceProcessModal.tsx
@@ -65,7 +65,7 @@ export function RebalanceProcessModal({
@@ -176,7 +136,7 @@ export function SupplyProcessModal({
return (
span]:opacity-0 [&>svg]:opacity-0 [&>*:not(.loading-spinner)]:opacity-0',
+ },
+ ],
+});
+
+export type ButtonProps = React.ComponentProps
;
+
+Button.displayName = 'Button';
diff --git a/src/components/common/MarketInfoBlock.tsx b/src/components/common/MarketInfoBlock.tsx
new file mode 100644
index 00000000..526b6b3c
--- /dev/null
+++ b/src/components/common/MarketInfoBlock.tsx
@@ -0,0 +1,59 @@
+import React from 'react';
+import Image from 'next/image';
+import { formatUnits } from 'viem';
+import { formatBalance } from '@/utils/balance';
+import { findToken } from '@/utils/tokens';
+import { Market } from '@/utils/types';
+import OracleVendorBadge from '../OracleVendorBadge';
+
+type MarketAmountBlockProps = {
+ market: Market;
+ amount?: bigint;
+ lltv?: string;
+ apy?: string;
+ className?: string;
+};
+
+export function MarketAmountBlock({ market, amount }: MarketAmountBlockProps): JSX.Element {
+ const collateralToken = findToken(market.collateralAsset.address, market.morphoBlue.chain.id);
+
+ return (
+
+
+ {collateralToken?.img && (
+
+
+
+ )}
+
+
+ {market.collateralAsset.symbol}
+
+ {formatUnits(BigInt(market.lltv), 16)}% LTV
+
+
+ {amount ? (
+
+ {formatBalance(amount, market.loanAsset.decimals)} {market.loanAsset.symbol}
+
+ ) : (
+
+ )}
+
+
+
+
{(market.state.supplyApy * 100).toFixed(2)}%
+
Supply APY
+
+
+ );
+}
diff --git a/src/components/common/PrimaryButton.tsx b/src/components/common/PrimaryButton.tsx
deleted file mode 100644
index 0645c88e..00000000
--- a/src/components/common/PrimaryButton.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import Link from 'next/link';
-
-type PrimaryButtonProps = {
- href: string;
- children: React.ReactNode;
- className?: string;
- isSecondary?: boolean;
-};
-
-export default function PrimaryButton({
- href,
- children,
- className = '',
- isSecondary,
-}: PrimaryButtonProps) {
- return (
-
-
- {children}
-
-
- );
-}
diff --git a/src/components/common/index.ts b/src/components/common/index.ts
new file mode 100644
index 00000000..8b166a86
--- /dev/null
+++ b/src/components/common/index.ts
@@ -0,0 +1 @@
+export * from './Button';
diff --git a/src/components/supplyModal.tsx b/src/components/supplyModal.tsx
index 41756b73..d105d5cc 100644
--- a/src/components/supplyModal.tsx
+++ b/src/components/supplyModal.tsx
@@ -4,7 +4,7 @@ import { Cross1Icon, ExternalLinkIcon } from '@radix-ui/react-icons';
import Image from 'next/image';
import Link from 'next/link';
import { toast } from 'react-toastify';
-import { Address, encodeFunctionData, formatUnits } from 'viem';
+import { Address, encodeFunctionData } from 'viem';
import { useAccount, useBalance, useSwitchChain } from 'wagmi';
import morphoBundlerAbi from '@/abis/bundlerV2';
import Input from '@/components/Input/Input';
@@ -18,6 +18,8 @@ import { getExplorerURL } from '@/utils/external';
import { getBundlerV2, getIRMTitle, MONARCH_TX_IDENTIFIER } from '@/utils/morpho';
import { findToken } from '@/utils/tokens';
import { Market } from '@/utils/types';
+import { Button } from './common';
+import { MarketAmountBlock } from './common/MarketInfoBlock';
import OracleVendorBadge from './OracleVendorBadge';
import { SupplyProcessModal } from './SupplyProcessModal';
@@ -37,7 +39,6 @@ export function SupplyModal({ market, onClose }: SupplyModalProps): JSX.Element
const { address: account, isConnected, chainId } = useAccount();
- const collateralToken = findToken(market.collateralAsset.address, market.morphoBlue.chain.id);
const loanToken = findToken(market.loanAsset.address, market.morphoBlue.chain.id);
const { switchChain } = useSwitchChain();
@@ -330,18 +331,21 @@ export function SupplyModal({ market, onClose }: SupplyModalProps): JSX.Element
{' '}
-
+
Supply {loanToken ? loanToken.symbol : market.loanAsset.symbol}
{loanToken?.img && }
- {' '}
You are supplying {market.loanAsset.symbol} to the following market:{' '}
-
-
+
+
+
+
Details
+
+
Market ID:
@@ -349,21 +353,7 @@ export function SupplyModal({ market, onClose }: SupplyModalProps): JSX.Element
-
-
Collateral Token:
-
-
{market.collateralAsset.symbol}
-
- {collateralToken?.img && (
-
- )}{' '}
-
-
-
-
-
LLTV:
-
{formatUnits(BigInt(market.lltv), 16)} %
-
+
diff --git a/src/components/withdrawModal.tsx b/src/components/withdrawModal.tsx
index b868e3f1..bbfe6044 100644
--- a/src/components/withdrawModal.tsx
+++ b/src/components/withdrawModal.tsx
@@ -7,6 +7,7 @@ import { toast } from 'react-toastify';
import { Address, encodeFunctionData } from 'viem';
import { useAccount, useSwitchChain } from 'wagmi';
import morphoAbi from '@/abis/morpho';
+import { MarketAmountBlock } from '@/components/common/MarketInfoBlock';
import Input from '@/components/Input/Input';
import AccountConnect from '@/components/layout/header/AccountConnect';
import { useTransactionWithToast } from '@/hooks/useTransactionWithToast';
@@ -106,7 +107,7 @@ export function WithdrawModal({ position, onClose, refetch }: ModalProps): JSX.E
{' '}
-
+
Withdraw {loanToken ? loanToken.symbol : position.market.loanAsset.symbol}
{loanToken?.img && }
@@ -127,12 +128,7 @@ export function WithdrawModal({ position, onClose, refetch }: ModalProps): JSX.E
-
-
Market ID:
-
- {position.market.uniqueKey.slice(2, 8)}
-
-
+
Available Liquidity:
diff --git a/src/contexts/MarketsContext.tsx b/src/contexts/MarketsContext.tsx
index 9483c4dd..89864672 100644
--- a/src/contexts/MarketsContext.tsx
+++ b/src/contexts/MarketsContext.tsx
@@ -113,15 +113,18 @@ export function MarketsProvider({ children }: MarketsProviderProps) {
} catch (_error) {
setError(_error);
} finally {
- setLoading(false);
- setIsRefetching(false);
+ if (isRefetch) {
+ setIsRefetching(false);
+ } else {
+ setLoading(false);
+ }
}
},
[liquidatedMarketIds],
);
useEffect(() => {
- if (!liquidationsLoading) {
+ if (!liquidationsLoading && markets.length === 0) {
fetchMarkets().catch(console.error);
}
}, [liquidationsLoading, fetchMarkets]);
diff --git a/yarn.lock b/yarn.lock
index abd89802..ddb43faf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15323,6 +15323,7 @@ __metadata:
stylelint-config-idiomatic-order: "npm:^10.0.0"
stylelint-config-standard: "npm:^35.0.0"
stylelint-order: "npm:^6.0.4"
+ tailwind-merge: "npm:^2.5.5"
tailwindcss: "npm:^3.4.0"
ts-jest: "npm:^29.1.1"
typescript: "npm:~5.3.3"
@@ -18372,6 +18373,13 @@ __metadata:
languageName: node
linkType: hard
+"tailwind-merge@npm:^2.5.5":
+ version: 2.5.5
+ resolution: "tailwind-merge@npm:2.5.5"
+ checksum: 10c0/32614dd2b4ddd4fab070d5ec569e6da00e2b34269b9ac2f2ff16733cef29a076c8e2210fbfc1904d7983a8fdb6b3e63d18ca117645f21b12ca7bcf8fe3507241
+ languageName: node
+ linkType: hard
+
"tailwind-variants@npm:^0.1.20":
version: 0.1.20
resolution: "tailwind-variants@npm:0.1.20"