From 328e3121117dd62e77344872f0a1e8265e0697ed Mon Sep 17 00:00:00 2001 From: Abdulganiyu Adesina <156628164+Holarconcept@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:43:47 +0100 Subject: [PATCH 1/2] fix: Add key retirement status page and voluntary exit flow for h (#1148) --- src/components/common/KeyBuybackModal.tsx | 5 +- .../common/KeyDeprecationBanner.tsx | 3 +- .../common/KeyFreezeStatusBanner.tsx | 10 + src/components/common/LockupCountdown.tsx | 2 +- .../common/SecondaryMarketSellPanel.tsx | 233 ++++++++++++++++++ src/components/common/SellFeeBreakdown.tsx | 4 + 6 files changed, 254 insertions(+), 3 deletions(-) diff --git a/src/components/common/KeyBuybackModal.tsx b/src/components/common/KeyBuybackModal.tsx index b41318ec..72d4832a 100644 --- a/src/components/common/KeyBuybackModal.tsx +++ b/src/components/common/KeyBuybackModal.tsx @@ -186,7 +186,10 @@ export default function KeyBuybackModal({
Total XLM Payout - + {formatNumber( receipt.totalPayoutStroops / STROOPS_PER_XLM, { diff --git a/src/components/common/KeyDeprecationBanner.tsx b/src/components/common/KeyDeprecationBanner.tsx index 2d912fc5..06a8e845 100644 --- a/src/components/common/KeyDeprecationBanner.tsx +++ b/src/components/common/KeyDeprecationBanner.tsx @@ -58,6 +58,7 @@ export default function KeyDeprecationBanner({ : 'Guaranteed open window'; const hasHoldings = holdingsCount > 0; + const showBuybackConfirmed = Boolean(recentSettlement); const estimatedValueXlm = (holdingsCount * buybackPriceStroops) / STROOPS_PER_XLM; @@ -75,7 +76,7 @@ export default function KeyDeprecationBanner({
Guaranteed Contract Buyback Active diff --git a/src/components/common/KeyFreezeStatusBanner.tsx b/src/components/common/KeyFreezeStatusBanner.tsx index a3b2dfaa..20370de7 100644 --- a/src/components/common/KeyFreezeStatusBanner.tsx +++ b/src/components/common/KeyFreezeStatusBanner.tsx @@ -32,6 +32,16 @@ function formatExpiry(iso: string, expiresAtMs: number | null): string { }); } +/** + * Retirement banner text summary helper. + */ +export function formatRetirementCountdown(endsAtMs: number, nowMs: number): string { + const remaining = Math.max(0, endsAtMs - nowMs); + const days = Math.floor(remaining / 86_400_000); + const hours = Math.floor((remaining % 86_400_000) / 3_600_000); + return `${days}d ${hours}h remaining`; +} + export default function KeyFreezeStatusBanner({ freeze, className, diff --git a/src/components/common/LockupCountdown.tsx b/src/components/common/LockupCountdown.tsx index 33269aec..7c94f1bb 100644 --- a/src/components/common/LockupCountdown.tsx +++ b/src/components/common/LockupCountdown.tsx @@ -58,7 +58,7 @@ export const LockupCountdown: React.FC = ({ data-testid="lockup-countdown" aria-label={`Lockup remaining: ${formattedTime}`} > - +