adding redeem only function for killed pools)
This commit is contained in:
@@ -49,6 +49,17 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
// Fetch all pools using the new hook
|
||||
const { poolDetails, loading: poolsLoading } = useGetAllPools();
|
||||
|
||||
// Filter pools based on mode: stake mode shows only working pools, unstake shows all
|
||||
const filteredPools = useMemo(() => {
|
||||
if (!poolDetails) return null;
|
||||
if (mode === 'stake') {
|
||||
// Stake mode: only show working (non-killed) pools
|
||||
return poolDetails.filter(pool => !pool.isKilled);
|
||||
}
|
||||
// Unstake mode: show all pools (working + killed)
|
||||
return poolDetails;
|
||||
}, [poolDetails, mode]);
|
||||
|
||||
// Get token details for the user
|
||||
const { tokenDetails, loading: tokensLoading } = useTokenDetails(address);
|
||||
|
||||
@@ -190,6 +201,14 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
fetchTokenDetails();
|
||||
}, [publicClient, selectedPool, mode, redeemAll]);
|
||||
|
||||
// Auto-enable Redeem All for killed pools in unstake mode
|
||||
useEffect(() => {
|
||||
if (mode === 'unstake' && selectedPool?.isKilled) {
|
||||
setRedeemAll(true);
|
||||
setSelectedToken(null); // Clear token selection for killed pools
|
||||
}
|
||||
}, [mode, selectedPool]);
|
||||
|
||||
// Close dropdowns when clicking outside
|
||||
useEffect(() => {
|
||||
const handleClickOutside = (event: MouseEvent) => {
|
||||
@@ -329,8 +348,8 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
</Button>
|
||||
{isPoolDropdownOpen && (
|
||||
<div className="absolute z-50 w-full mt-2 bg-popover border rounded-md shadow-lg max-h-[300px] overflow-y-auto">
|
||||
{poolDetails && poolDetails.length > 0 ? (
|
||||
poolDetails.map((pool) => (
|
||||
{filteredPools && filteredPools.length > 0 ? (
|
||||
filteredPools.map((pool) => (
|
||||
<button
|
||||
key={pool.address}
|
||||
className="w-full px-4 py-3 text-left hover:bg-accent focus:bg-accent focus:outline-none"
|
||||
@@ -381,7 +400,14 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
>
|
||||
{selectedPool ? (
|
||||
<div className="flex flex-col items-start">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="font-medium">{selectedPool.symbol}</span>
|
||||
{selectedPool.isKilled && (
|
||||
<span className="text-xs px-2 py-0.5 bg-orange-500/20 text-orange-600 dark:text-orange-400 border border-orange-500/30 rounded">
|
||||
Redeem Only
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<span className="text-xs text-muted-foreground">{selectedPool.name}</span>
|
||||
</div>
|
||||
) : (
|
||||
@@ -391,8 +417,8 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
</Button>
|
||||
{isPoolDropdownOpen && (
|
||||
<div className="absolute z-50 w-full mt-2 bg-popover border rounded-md shadow-lg max-h-[300px] overflow-y-auto">
|
||||
{poolDetails && poolDetails.length > 0 ? (
|
||||
poolDetails.map((pool) => (
|
||||
{filteredPools && filteredPools.length > 0 ? (
|
||||
filteredPools.map((pool) => (
|
||||
<button
|
||||
key={pool.address}
|
||||
className="w-full px-4 py-3 text-left hover:bg-accent focus:bg-accent focus:outline-none"
|
||||
@@ -402,12 +428,19 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
setSelectedToken(null);
|
||||
}}
|
||||
>
|
||||
<div className="flex justify-between items-center w-full">
|
||||
<div className="flex flex-col">
|
||||
<div className="flex justify-between items-center w-full gap-2">
|
||||
<div className="flex flex-col flex-1 min-w-0">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="font-medium">{pool.symbol}</span>
|
||||
{pool.isKilled && (
|
||||
<span className="text-xs px-2 py-0.5 bg-orange-500/20 text-orange-600 dark:text-orange-400 border border-orange-500/30 rounded whitespace-nowrap">
|
||||
Redeem Only
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<span className="text-xs text-muted-foreground">{pool.name}</span>
|
||||
</div>
|
||||
{(pool.price || pool.tvl) && (
|
||||
{!pool.isKilled && (pool.price || pool.tvl) && (
|
||||
<div className="flex flex-col items-end">
|
||||
{pool.price && (
|
||||
<span className="text-sm font-medium text-muted-foreground">{pool.price}</span>
|
||||
@@ -562,13 +595,15 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
|
||||
size="sm"
|
||||
className="h-6 px-2 text-xs"
|
||||
onClick={() => {
|
||||
// Prevent toggling off for killed pools
|
||||
if (selectedPool?.isKilled) return;
|
||||
setRedeemAll(!redeemAll);
|
||||
if (!redeemAll && lpBalance !== null) {
|
||||
setStakeAmount(formatUnits(lpBalance, 18));
|
||||
}
|
||||
}}
|
||||
disabled={!selectedPool}
|
||||
title="Burn entire LP token and receive all underlying tokens"
|
||||
disabled={!selectedPool || selectedPool?.isKilled}
|
||||
title={selectedPool?.isKilled ? "Killed pools can only use Redeem All mode" : "Burn entire LP token and receive all underlying tokens"}
|
||||
>
|
||||
{redeemAll ? 'Redeem All: ON' : 'Redeem All'}
|
||||
</Button>
|
||||
|
||||
@@ -379,6 +379,7 @@ export interface PoolDetails {
|
||||
tokens: readonly `0x${string}`[];
|
||||
price?: string; // Formatted price string
|
||||
tvl?: string; // Formatted TVL string (e.g., "$1.2M")
|
||||
isKilled: boolean; // Whether the pool has been killed
|
||||
}
|
||||
|
||||
export function useGetAllPools(offset: number = 0, limit: number = 100) {
|
||||
@@ -457,10 +458,12 @@ export function useGetAllPools(offset: number = 0, limit: number = 100) {
|
||||
}).catch(() => false),
|
||||
]);
|
||||
|
||||
// Only add pool if it's working
|
||||
// Fetch pool price and TVL (only for working pools)
|
||||
let priceStr: string | undefined;
|
||||
let tvlStr: string | undefined;
|
||||
|
||||
if (isWorking) {
|
||||
// Fetch pool price (use first token as quote, index 0)
|
||||
let priceStr: string | undefined;
|
||||
try {
|
||||
const priceRaw = await publicClient.readContract({
|
||||
address: partyInfoAddress as `0x${string}`,
|
||||
@@ -489,7 +492,6 @@ export function useGetAllPools(offset: number = 0, limit: number = 100) {
|
||||
}
|
||||
|
||||
// Calculate TVL (approximate by getting first token balance and doubling it)
|
||||
let tvlStr: string | undefined;
|
||||
try {
|
||||
if (tokens && tokens.length > 0) {
|
||||
const firstTokenAddress = tokens[0];
|
||||
@@ -519,7 +521,9 @@ export function useGetAllPools(offset: number = 0, limit: number = 100) {
|
||||
console.error(`Error fetching TVL for ${poolAddress}:`, err);
|
||||
tvlStr = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// Add all pools (both working and killed)
|
||||
details.push({
|
||||
address: poolAddress,
|
||||
name: name as string,
|
||||
@@ -527,8 +531,8 @@ export function useGetAllPools(offset: number = 0, limit: number = 100) {
|
||||
tokens: tokens as readonly `0x${string}`[],
|
||||
price: priceStr,
|
||||
tvl: tvlStr,
|
||||
isKilled: !isWorking,
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error fetching pool details for', poolAddress, err);
|
||||
// Skip pools that fail to load
|
||||
|
||||
Reference in New Issue
Block a user