diff --git a/staking-dashboard/src/components/ATPStakingCard/ATPStakingCard.tsx b/staking-dashboard/src/components/ATPStakingCard/ATPStakingCard.tsx index 669205d2f..f02b094ab 100644 --- a/staking-dashboard/src/components/ATPStakingCard/ATPStakingCard.tsx +++ b/staking-dashboard/src/components/ATPStakingCard/ATPStakingCard.tsx @@ -15,6 +15,8 @@ import { useRollupData } from "@/hooks/rollup/useRollupData"; import { useStakerBalance } from "@/hooks/staker/useStakerBalance"; import { useNCStakerStatus } from "@/hooks/staker/useNCStakerStatus"; import { useBlockTimestamp } from "@/hooks/useBlockTimestamp"; +import { usePendingWithdrawals } from "@/hooks/governance"; +import { ExternalGovernanceModal } from "@/components/ExternalGovernanceModal"; import { useTransactionCart } from "@/contexts/TransactionCartContext"; import { ATPStakingStepsWithTransaction, @@ -189,6 +191,18 @@ export const ATPStakingCard = ({ // Get cached block timestamp for withdrawal eligibility check (refreshes every 60s) const { blockTimestamp } = useBlockTimestamp(); + // Pending governance withdrawals for this vault. Tokens initiated for + // withdrawal from Governance stay with the Governance contract until + // finalize() is called — they are NOT in the vault, so a vault withdrawal + // (vault → wallet) cannot release them. Users often miss this step. + const { pendingWithdrawals: governancePendingWithdrawals } = + usePendingWithdrawals({ userAddress: data.atpAddress as Address }); + const pendingGovernanceAmount = governancePendingWithdrawals.reduce( + (sum, w) => sum + w.amount, + 0n + ); + const [isGovernanceModalOpen, setIsGovernanceModalOpen] = useState(false); + const globalLockTimeDisplay = getTimeToClaimForATP(data, blockTimestamp); const { activationThreshold } = useRollupData(); @@ -705,7 +719,7 @@ export const ATPStakingCard = ({ Available to Withdraw @@ -766,6 +780,25 @@ export const ATPStakingCard = ({ )} + {!isFullyWithdrawn && pendingGovernanceAmount > 0n && ( + +
+ +{formatTokenAmount(pendingGovernanceAmount, decimals, symbol)}{" "} + in governance{" — "} + +
+
+ )} {/* Withdrawn */} @@ -797,6 +830,11 @@ export const ATPStakingCard = ({ onRefetchAllowance={refetchAllowance} onUpgradeSuccess={refetchNCStatus} /> + + setIsGovernanceModalOpen(false)} + /> ); };