@pyefi/widget 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pye-widget.es.js","sources":["../src/stores/widget-store.ts","../src/components/design-system.ts","../src/assets/icons/phantom.png","../src/assets/icons/backoack.png","../src/assets/icons/metamasj.png","../src/components/Icons.tsx","../src/components/shared/Layout.tsx","../src/components/screens/WelcomeScreen.tsx","../src/components/screens/ConnectWallet.tsx","../src/components/screens/YieldForwardIntro.tsx","../src/components/screens/SelectPosition.tsx","../src/components/screens/ChooseAmount.tsx","../src/components/shared/Odometer.tsx","../src/components/screens/ChooseDuration.tsx","../src/components/screens/ReviewQuote.tsx","../src/components/screens/RedeemList.tsx","../src/components/screens/StepComplete.tsx","../src/components/screens/RedeemComplete.tsx","../src/components/WidgetShell.tsx","../src/components/WalletChangeWatcher.tsx","../src/PyeWidget.tsx"],"sourcesContent":["import { createStore } from \"zustand/vanilla\";\nimport { immer } from \"zustand/middleware/immer\";\nimport { createContext, useContext } from \"react\";\nimport { useStore } from \"zustand\";\nimport type { MaturityId } from \"@pyefi/sdk\";\n\nexport type WidgetScreen =\n | \"yield-forward-intro\"\n | \"connect-wallet\"\n | \"welcome\"\n | \"redeem-list\"\n | \"select-position\"\n | \"choose-amount\"\n | \"choose-duration\"\n | \"review-quote\"\n | \"complete\"\n | \"redeem-complete\";\n\nexport interface WidgetState {\n screen: WidgetScreen;\n screenHistory: WidgetScreen[];\n\n selectedStakeAccountPubkey: string | null;\n selectedStakeAccountBalance: number;\n selectedValidatorName: string | null;\n selectedValidatorIcon: string | null;\n selectedValidatorVoteAccount: string | null;\n selectedValidatorAltPubkey: string | null;\n depositAmount: string;\n selectedMaturityId: MaturityId | null;\n\n advancedOpen: boolean;\n slippageBps: number;\n\n txStatus: \"idle\" | \"loading\" | \"success\" | \"error\";\n txStep: \"idle\" | \"depositing\" | \"selling\" | \"complete\";\n depositTxSignature: string | null;\n sellTxSignature: string | null;\n txSignature: string | null;\n txError: string | null;\n /** Actual SOL received from RT sell, set after transaction completes */\n sellAmountSol: number | null;\n\n /** Which PT mint is currently being redeemed */\n redeemingMint: string | null;\n /** Error surfaced by the redeem flow */\n redeemError: string | null;\n /** SOL amount received from redeem, set after transaction completes */\n redeemAmountSol: number | null;\n /** Redeem transaction signature */\n redeemTxSignature: string | null;\n}\n\nexport interface WidgetActions {\n navigate(screen: WidgetScreen): void;\n goBack(): void;\n selectStakeAccount(pubkey: string, balance: number, validatorName?: string, validatorIcon?: string, validatorVoteAccount?: string, validatorAltPubkey?: string | null): void;\n setDepositAmount(amount: string): void;\n setSelectedMaturity(id: MaturityId): void;\n setAdvancedOpen(open: boolean): void;\n setSlippageBps(bps: number): void;\n setSellAmountSol(amount: number): void;\n setRedeemingMint(mint: string | null): void;\n setRedeemError(error: string | null): void;\n setRedeemAmountSol(amount: number): void;\n setRedeemTxSignature(sig: string): void;\n setTxStep(step: WidgetState[\"txStep\"]): void;\n setTxStatus(\n status: WidgetState[\"txStatus\"],\n signature?: string | null,\n error?: string | null,\n ): void;\n reset(): void;\n resetForWalletChange(): void;\n}\n\nexport type WidgetStoreType = WidgetState & WidgetActions;\n\nconst initialState: WidgetState = {\n screen: \"yield-forward-intro\",\n screenHistory: [],\n\n selectedStakeAccountPubkey: null,\n selectedStakeAccountBalance: 0,\n selectedValidatorName: null,\n selectedValidatorIcon: null,\n selectedValidatorVoteAccount: null,\n selectedValidatorAltPubkey: null,\n depositAmount: \"\",\n selectedMaturityId: null,\n\n advancedOpen: false,\n slippageBps: 100,\n\n txStatus: \"idle\",\n txStep: \"idle\",\n depositTxSignature: null,\n sellTxSignature: null,\n txSignature: null,\n txError: null,\n sellAmountSol: null,\n\n redeemingMint: null,\n redeemError: null,\n redeemAmountSol: null,\n redeemTxSignature: null,\n};\n\nexport function createWidgetStore() {\n return createStore<WidgetStoreType>()(\n immer((set) => ({\n ...initialState,\n\n navigate(screen) {\n set((s) => {\n s.screenHistory.push(s.screen);\n s.screen = screen;\n });\n },\n\n goBack() {\n set((s) => {\n const prev = s.screenHistory.pop();\n if (prev) s.screen = prev;\n if (s.txStatus === \"error\") {\n s.txStatus = \"idle\";\n s.txStep = \"idle\";\n s.txError = null;\n }\n s.redeemError = null;\n });\n },\n\n selectStakeAccount(pubkey, balance, validatorName, validatorIcon, validatorVoteAccount, validatorAltPubkey) {\n set((s) => {\n s.selectedStakeAccountPubkey = pubkey;\n s.selectedStakeAccountBalance = balance;\n s.selectedValidatorName = validatorName ?? null;\n s.selectedValidatorIcon = validatorIcon ?? null;\n s.selectedValidatorVoteAccount = validatorVoteAccount ?? null;\n s.selectedValidatorAltPubkey = validatorAltPubkey ?? null;\n });\n },\n\n setDepositAmount(amount) {\n set((s) => {\n s.depositAmount = amount;\n });\n },\n\n setSelectedMaturity(id) {\n set((s) => {\n s.selectedMaturityId = id;\n });\n },\n\n setAdvancedOpen(open) {\n set((s) => {\n s.advancedOpen = open;\n });\n },\n\n setSlippageBps(bps) {\n set((s) => {\n s.slippageBps = bps;\n });\n },\n\n setSellAmountSol(amount) {\n set((s) => {\n s.sellAmountSol = amount;\n });\n },\n\n setRedeemingMint(mint) {\n set((s) => {\n s.redeemingMint = mint;\n });\n },\n\n setRedeemError(error) {\n set((s) => {\n s.redeemError = error;\n });\n },\n\n setRedeemAmountSol(amount) {\n set((s) => {\n s.redeemAmountSol = amount;\n });\n },\n\n setRedeemTxSignature(sig) {\n set((s) => {\n s.redeemTxSignature = sig;\n });\n },\n\n setTxStep(step) {\n set((s) => {\n s.txStep = step;\n });\n },\n\n setTxStatus(status, signature, error) {\n set((s) => {\n s.txStatus = status;\n s.txSignature = signature ?? null;\n s.txError = error ?? null;\n if (status === \"idle\") {\n s.txStep = \"idle\";\n s.depositTxSignature = null;\n s.sellTxSignature = null;\n }\n });\n },\n\n reset() {\n set(() => ({ ...initialState }));\n },\n\n resetForWalletChange() {\n set((s) => {\n s.selectedStakeAccountPubkey = null;\n s.selectedStakeAccountBalance = 0;\n s.selectedValidatorName = null;\n s.selectedValidatorIcon = null;\n s.selectedValidatorVoteAccount = null;\n s.selectedValidatorAltPubkey = null;\n s.depositAmount = \"\";\n s.selectedMaturityId = null;\n s.txStatus = \"idle\";\n s.txStep = \"idle\";\n s.depositTxSignature = null;\n s.sellTxSignature = null;\n s.txSignature = null;\n s.txError = null;\n s.sellAmountSol = null;\n s.redeemingMint = null;\n s.redeemError = null;\n s.redeemAmountSol = null;\n s.redeemTxSignature = null;\n if (\n s.screen === \"choose-amount\" ||\n s.screen === \"choose-duration\" ||\n s.screen === \"review-quote\" ||\n s.screen === \"complete\" ||\n s.screen === \"redeem-complete\" ||\n s.screen === \"redeem-list\"\n ) {\n s.screen = \"welcome\";\n s.screenHistory = [];\n }\n });\n },\n })),\n );\n}\n\n// Context\ntype WidgetStoreApi = ReturnType<typeof createWidgetStore>;\nexport const WidgetStoreContext = createContext<WidgetStoreApi | null>(null);\n\nexport function useWidgetStore<T>(selector: (state: WidgetStoreType) => T): T {\n const store = useContext(WidgetStoreContext);\n if (!store) {\n throw new Error(\"useWidgetStore must be used within WidgetStoreProvider\");\n }\n return useStore(store, selector);\n}\n","import type React from \"react\";\n\n// ─── Design Tokens ─────────────────────────────────────────────────────────────\nexport const c = {\n bg: \"var(--c-bg)\",\n surface: \"var(--c-surface)\",\n raised: \"var(--c-raised)\",\n lowered: \"var(--c-lowered)\",\n shadow: \"var(--c-shadow)\",\n highlight: \"var(--c-highlight)\",\n primary: \"var(--c-primary)\",\n secondary: \"var(--c-secondary)\",\n muted: \"var(--c-muted)\",\n green: \"#0d9c5e\",\n purple: \"var(--c-brand)\",\n red: \"#D93B3B\",\n};\n\nexport const THEME_CSS = `\n [data-theme] *, [data-theme] *::before, [data-theme] *::after { box-sizing: border-box; }\n :root, [data-theme=\"pye-light\"] {\n --c-bg: #e6e3e0;\n --c-surface: #f1efed;\n --c-raised: #f8f7f6;\n --c-lowered: #eceae8;\n --c-shadow: #e0ddd9;\n --c-highlight: #ffffff;\n --c-primary: #24201c;\n --c-secondary: #5b554c;\n --c-muted: #a09b96;\n --c-brand: #9a4dff;\n --c-brand-hi: #b78eff;\n --c-brand-sh: #6c24c2;\n --c-brand-text: #ffffff;\n }\n [data-theme=\"pye-dark\"] {\n --c-bg: #110F14;\n --c-surface: #1F1C26;\n --c-raised: #2B2735;\n --c-lowered: #110F14;\n --c-shadow: #0A090C;\n --c-highlight: #3C364A;\n --c-primary: #FFFFFF;\n --c-secondary: #D7D4DD;\n --c-muted: rgba(255,255,255,0.4);\n --c-brand: #9a4dff;\n --c-brand-hi: #b78eff;\n --c-brand-sh: #6c24c2;\n --c-brand-text: #ffffff;\n --fill-0: #ffffff;\n }\n [data-theme=\"graphite\"] {\n --c-bg: #1c1c1e;\n --c-surface: #2c2c2e;\n --c-raised: #3a3a3c;\n --c-lowered: #111113;\n --c-shadow: #000000;\n --c-highlight: #48484a;\n --c-primary: #ffffff;\n --c-secondary: #aeaeb2;\n --c-muted: #8e8e93;\n --c-brand: #ffffff;\n --c-brand-hi: rgba(255,255,255,0.2);\n --c-brand-sh: rgba(0,0,0,0.2);\n --c-brand-text: #000000;\n --fill-0: #ffffff;\n }\n /* WalletConnect / Reown AppKit modal stacks at --w3m-z-index (default 999),\n but host pages typically wrap the widget in a scrim around z-index 9999,\n which would cover the QR modal. Bump it above any realistic scrim. */\n w3m-modal, wcm-modal { --w3m-z-index: 2147483647; }\n\n /* ─── Hover rules (replaces JS useState hover state) ─────────────── */\n .pye-hoverable {\n transition: background 160ms cubic-bezier(0.2,0.9,0.2,1),\n transform 160ms cubic-bezier(0.2,0.9,0.2,1),\n box-shadow 160ms cubic-bezier(0.2,0.9,0.2,1) !important;\n }\n .pye-hoverable:hover {\n background: var(--c-highlight) !important;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0,0,0,0.08), inset 0 -1px 0 var(--c-shadow) !important;\n }\n .pye-pill:not(.pye-pill--selected):hover { background: var(--c-highlight) !important; }\n .pye-cta-purple:hover:not(:disabled) { filter: brightness(1.15); }\n .pye-cta-default:hover:not(:disabled) { background: var(--c-highlight) !important; }\n .pye-redeem-btn:hover:not(:disabled) { filter: brightness(1.15); }\n\n /* ─── Press feedback (scale 0.98 on active) ──────────────────────── */\n .pye-cta-purple, .pye-cta-default, .pye-redeem-btn, .pye-pill {\n transition: background 120ms cubic-bezier(0.2,0.9,0.2,1),\n filter 120ms cubic-bezier(0.2,0.9,0.2,1),\n transform 120ms cubic-bezier(0.2,0.9,0.2,1) !important;\n }\n .pye-cta-purple:active:not(:disabled),\n .pye-cta-default:active:not(:disabled),\n .pye-redeem-btn:active:not(:disabled),\n .pye-pill:active {\n transform: scale(0.98);\n }\n @media (prefers-reduced-motion: reduce) {\n .pye-hoverable, .pye-hoverable:hover,\n .pye-cta-purple, .pye-cta-default, .pye-redeem-btn, .pye-pill,\n .pye-cta-purple:active, .pye-cta-default:active, .pye-redeem-btn:active, .pye-pill:active {\n transform: none !important;\n transition: background 120ms, filter 120ms !important;\n }\n }\n\n /* ─── Skeleton shimmer ───────────────────────────────────────── */\n @keyframes pye-skeleton-pulse {\n 0%, 100% { opacity: 0.55; }\n 50% { opacity: 0.85; }\n }\n .pye-skeleton {\n animation: pye-skeleton-pulse 1.4s ease-in-out infinite;\n background: linear-gradient(\n 90deg,\n var(--c-lowered) 0%,\n var(--c-shadow) 50%,\n var(--c-lowered) 100%\n );\n background-size: 200% 100%;\n border-radius: 4px;\n }\n @media (prefers-reduced-motion: reduce) {\n .pye-skeleton { animation: none; opacity: 0.7; }\n }\n\n /* ─── Step transition: subtle translate + fade on mount ──────── */\n @keyframes pye-step-in {\n 0% { transform: translateY(8px); opacity: 0; }\n 100% { transform: translateY(0); opacity: 1; }\n }\n .pye-step-in {\n animation: pye-step-in 280ms cubic-bezier(0.2, 0.9, 0.2, 1) both;\n will-change: transform, opacity;\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-height: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n .pye-step-in { animation: none; }\n }\n`;\n\nexport const DISPLAY_FONT = \"'Inter', sans-serif\";\n\nexport const font = (size: number, color = c.primary, weight = 400): React.CSSProperties => ({\n fontFamily: \"'Inter', sans-serif\",\n fontSize: size,\n fontWeight: weight,\n color,\n lineHeight: 1.5,\n margin: 0,\n fontFeatureSettings: \"'zero' 1\",\n});\n\nexport const displayFont = (size: number, color = c.primary, weight = 400): React.CSSProperties => ({\n fontFamily: DISPLAY_FONT,\n fontSize: size,\n fontWeight: weight,\n color,\n lineHeight: 1.2,\n fontFeatureSettings: \"'zero' 1\",\n margin: 0,\n});\n\nexport function brandTextColor(hex: string): string {\n if (!/^#[0-9a-f]{6}$/i.test(hex)) return \"#ffffff\";\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const lin = (v: number) => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n const lum = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n return lum > 0.179 ? \"#000000\" : \"#ffffff\";\n}\n\nexport const MARKET_RATE = 0.85;\n\n/** Format a SOL amount showing at least 2 significant digits, never scientific notation. */\nexport function formatSolAmount(value: number, minDecimals = 4): string {\n if (value === 0) return \"0\";\n // Find how many decimals needed to show 2 significant digits\n const digits = value < 1 ? Math.max(minDecimals, -Math.floor(Math.log10(Math.abs(value))) + 1) : minDecimals;\n return value.toFixed(digits);\n}\nexport const yieldMap: Record<string, number> = { Q2: 0.43, Q3: 0.85, Q4: 1.28, Q1: 1.70 };\nexport const pointsMap: Record<string, string> = { Q3: \"2x points multiplier\", Q4: \"3x points multiplier\", Q1: \"4x points multiplier\" };\n\n// Feature flags\nexport const POINTS_ENABLED = false;\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { c, font } from \"./design-system\";\nimport solLogo from \"../assets/Sol.png\";\nimport kilnLogo from \"../assets/figment.png\";\nimport phantomLogo from \"../assets/icons/phantom.png\";\nimport backpackLogo from \"../assets/icons/backoack.png\";\nimport metamaskLogo from \"../assets/icons/metamasj.png\";\n\nexport function PyeWordmark() {\n return (\n <svg width=\"33\" height=\"16\" viewBox=\"0 0 33.0001 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ display: \"block\", flexShrink: 0 }}>\n <path d=\"M32.9338 2.19869V4.83327H24.0205V6.46108H32.4867V8.92786H24.0205V10.7068H33.0001V13.3918H20.707V2.19869H32.9338Z\" fill=\"var(--fill-0, #24201C)\"/>\n <path d=\"M23.9528 1.65254C21.8438 0.595304 19.4691 0 16.9568 0C14.4445 0 12.1791 0.567895 10.1067 1.58001C9.97635 1.64385 9.89253 1.77655 9.89253 1.92329V16L24.0043 1.70335C23.9924 1.68196 23.9749 1.66424 23.9528 1.65254Z\" fill=\"url(#pye-radial)\"/>\n <path d=\"M24.0043 1.70338L9.89253 16H14.27C14.4832 16 14.6878 15.9141 14.8386 15.7614L24.0218 6.45812L24.0211 1.76589C24.0211 1.74349 24.0149 1.7221 24.0043 1.70338Z\" fill=\"url(#pye-linear)\"/>\n <path d=\"M0.000119395 2.25921H8.83059C9.15069 2.25921 9.41601 2.26489 9.62589 2.27592C9.83544 2.28728 10.007 2.29832 10.1394 2.30935C10.272 2.32071 10.4152 2.33742 10.57 2.35982C11.0891 2.43837 11.5227 2.56104 11.8705 2.72883C12.2184 2.89663 12.4946 3.13729 12.6988 3.45048C12.9031 3.76368 13.0467 4.16378 13.1295 4.65045C13.2123 5.13712 13.2536 5.73844 13.2536 6.45441C13.2536 7.08114 13.2232 7.61527 13.1625 8.05682C13.1018 8.49903 13.0021 8.87373 12.8642 9.18124C12.7259 9.48909 12.5437 9.73777 12.3174 9.92796C12.091 10.1182 11.8121 10.2749 11.4808 10.3979C11.2927 10.4651 11.0967 10.5183 10.8928 10.5574C10.6882 10.5968 10.4426 10.6272 10.1555 10.6496C9.86811 10.672 9.52029 10.6891 9.11175 10.7001C8.70288 10.7115 8.20062 10.7168 7.60398 10.7168H3.36315V13.452H0.000119395V2.25921ZM7.57164 7.91443C7.95807 7.91443 8.26167 7.91175 8.48277 7.90607C8.70354 7.90072 8.87745 7.89203 9.0045 7.881C9.13122 7.86997 9.22527 7.85326 9.28599 7.83053C9.34671 7.80813 9.4104 7.77471 9.4764 7.72992C9.63084 7.62931 9.73875 7.48959 9.79947 7.31043C9.86019 7.13161 9.89055 6.84616 9.89055 6.45475C9.89055 6.06334 9.84897 5.75582 9.76614 5.5653C9.68331 5.37511 9.53151 5.24107 9.31041 5.16253C9.25497 5.14013 9.20283 5.12342 9.153 5.11205C9.10317 5.10102 9.02298 5.09267 8.91276 5.08698C8.80221 5.0813 8.64216 5.07595 8.43228 5.07027C8.2224 5.06492 7.9353 5.06192 7.57065 5.06192H3.36315V7.91476H7.57131L7.57164 7.91443Z\" fill=\"var(--fill-0, #24201C)\"/>\n <defs>\n <radialGradient id=\"pye-radial\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"translate(16.9047 16.0398) scale(15.743 15.9459)\">\n <stop stopColor=\"#D59EFF\"/>\n <stop offset=\"0.14\" stopColor=\"#C881FF\"/>\n <stop offset=\"0.44\" stopColor=\"#AF48FF\"/>\n <stop offset=\"0.66\" stopColor=\"#9F24FF\"/>\n <stop offset=\"0.78\" stopColor=\"#9A17FF\"/>\n <stop offset=\"1\" stopColor=\"#662D91\"/>\n </radialGradient>\n <linearGradient id=\"pye-linear\" x1=\"16.9572\" y1=\"16\" x2=\"16.9572\" y2=\"1.73781\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#331647\"/>\n <stop offset=\"0.33\" stopColor=\"#6B2F98\"/>\n <stop offset=\"0.54\" stopColor=\"#8A3CC4\"/>\n <stop offset=\"0.89\" stopColor=\"#AE4CF8\"/>\n <stop offset=\"1\" stopColor=\"#B34FFF\"/>\n </linearGradient>\n </defs>\n </svg>\n );\n}\n\nexport function IconYieldForward() {\n return (\n <svg width=\"17\" height=\"19\" viewBox=\"0 0 17 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ color: \"var(--c-brand)\" }}>\n <path d=\"M16.5 0.5H0.5M16.5 18.5H0.5M15.4879 0.5C15.4879 0.5 15.7278 3.24264 14.089 5C12.4503 6.75736 8.49414 9.5 8.49414 9.5C8.49414 9.5 12.4503 12.2426 14.089 14C15.7278 15.7574 15.4879 18.5 15.4879 18.5M1.50623 0.5C1.50623 0.5 1.26635 3.24264 2.9051 5C4.54385 6.75736 8.5 9.5 8.5 9.5C8.5 9.5 4.54385 12.2426 2.9051 14C1.26635 15.7574 1.50623 18.5 1.50623 18.5M11.5 15.5H5.5M10.5 3.5H6.5\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n );\n}\n\nexport function IconYieldSwap() {\n return (\n <svg width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ color: \"var(--c-brand)\" }}>\n <path d=\"M0.5 13.5H4.5C7.26142 13.5 9.5 12.5 9.5 8.5C9.5 4.5 11.7386 3.5 14.5 3.5H18.5M18.5 3.5L15.5 0.5M18.5 3.5L15.5 6.5M0.5 3.5H4.5C5.2111 3.5 5.88754 3.56631 6.5 3.73309M18.5 13.5H14.5C13.7889 13.5 13.1125 13.4337 12.5 13.2669M18.5 13.5L15.5 16.5M18.5 13.5L15.5 10.5\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n );\n}\n\nexport function IconFixedYield() {\n return (\n <svg width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={{ color: \"var(--c-brand)\" }}>\n <path d=\"M17 12.5039V11.5C17 10.3954 16.1046 9.5 15 9.5C13.8954 9.5 13 10.3954 13 11.5V12.5039M13.1 16.5H16.9C17.4601 16.5 17.7401 16.5 17.954 16.391C18.1422 16.2951 18.2951 16.1422 18.391 15.954C18.5 15.7401 18.5 15.4601 18.5 14.9V14.1C18.5 13.5399 18.5 13.2599 18.391 13.046C18.2951 12.8578 18.1422 12.7049 17.954 12.609C17.7401 12.5 17.4601 12.5 16.9 12.5H13.1C12.5399 12.5 12.2599 12.5 12.046 12.609C11.8578 12.7049 11.7049 12.8578 11.609 13.046C11.5 13.2599 11.5 13.5399 11.5 14.1V14.9C11.5 15.4601 11.5 15.7401 11.609 15.954C11.7049 16.1422 11.8578 16.2951 12.046 16.391C12.2599 16.5 12.5399 16.5 13.1 16.5Z\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M18.5 8.5V6.5V3.7C18.5 3.56676 18.5 3.44144 18.4996 3.32333M3.32333 0.500367C3.7383 0.86683 4 1.40285 4 2C4 3.10457 3.10457 4 2 4C1.40285 4 0.86683 3.7383 0.500367 3.32333M3.32333 0.500367C3.44144 0.5 3.56676 0.5 3.7 0.5H15.3C15.4332 0.5 15.5586 0.5 15.6767 0.500367M3.32333 0.500367C2.44852 0.503085 1.96895 0.525931 1.59202 0.717987C1.21569 0.909734 0.909734 1.21569 0.717987 1.59202C0.525931 1.96895 0.503085 2.44852 0.500367 3.32333M0.500367 3.32333C0.5 3.44144 0.5 3.56676 0.5 3.7V9.3C0.5 9.43324 0.5 9.55856 0.500367 9.67667M0.500367 9.67667C0.86683 9.2617 1.40285 9 2 9C3.10457 9 4 9.89543 4 11C4 11.5971 3.7383 12.1332 3.32333 12.4996M0.500367 9.67667C0.503085 10.5515 0.525931 11.031 0.717987 11.408C0.909734 11.7843 1.21569 12.0903 1.59202 12.282C1.96895 12.4741 2.44852 12.4969 3.32333 12.4996M3.32333 12.4996C3.44144 12.5 3.56676 12.5 3.7 12.5H9M18.4996 3.32333C18.1332 3.7383 17.5971 4 17 4C15.8954 4 15 3.10457 15 2C15 1.40285 15.2617 0.86683 15.6767 0.500367M18.4996 3.32333C18.4969 2.44852 18.4741 1.96895 18.282 1.59202C18.0903 1.21569 17.7843 0.909734 17.408 0.717987C17.0311 0.525931 16.5515 0.503085 15.6767 0.500367M11.5 6.5C11.5 7.60457 10.6046 8.5 9.5 8.5C8.39543 8.5 7.5 7.60457 7.5 6.5C7.5 5.39543 8.39543 4.5 9.5 4.5C10.6046 4.5 11.5 5.39543 11.5 6.5Z\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n );\n}\n\nexport function ProductIcon({ children }: { children: React.ReactNode }) {\n return (\n <div style={{\n flexShrink: 0, width: 36, height: 36, borderRadius: 8,\n background: \"color-mix(in srgb, var(--c-brand) 20%, transparent)\",\n borderTop: \"1px solid rgba(255,255,255,0.2)\",\n boxShadow: \"0 4px 8px rgba(0,0,0,0.07), inset 0 -1px 0 rgba(0,0,0,0.2)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n {children}\n </div>\n );\n}\n\nexport function SolIcon({ size = 36 }: { size?: number }) {\n return (\n <img src={solLogo} alt=\"SOL\" style={{\n width: size, height: size, borderRadius: \"50%\", flexShrink: 0,\n objectFit: \"cover\",\n boxShadow: \"0px 4px 8px 0px rgba(0,0,0,0.07)\",\n }} />\n );\n}\n\nexport function StakeIcon({ size = 36 }: { size?: number }) {\n return (\n <img src={kilnLogo} alt=\"Validator\" style={{\n width: size, height: size, borderRadius: \"50%\", flexShrink: 0,\n objectFit: \"cover\",\n boxShadow: \"0px 4px 8px 0px rgba(0,0,0,0.07)\",\n }} />\n );\n}\n\nexport function WalletDot({ name, size = 32 }: { name: string; size?: number }) {\n const logos: Record<string, string> = { Phantom: phantomLogo, Backpack: backpackLogo, Metamask: metamaskLogo };\n const bg: Record<string, string> = { Phantom: \"#AB9FF2\", Backpack: \"#E33B3B\", Metamask: \"#F5841F\" };\n const logo = logos[name];\n if (logo) {\n return (\n <img src={logo} alt={name} style={{\n width: size, height: size, borderRadius: 8, flexShrink: 0,\n objectFit: \"cover\",\n boxShadow: \"0px 4px 8px 0px rgba(0,0,0,0.07)\",\n }} />\n );\n }\n return (\n <div style={{\n width: size, height: size, borderRadius: 8, flexShrink: 0,\n background: bg[name] || \"#ccc\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n <span style={font(11, \"#fff\", 700)}>{name[0]}</span>\n </div>\n );\n}\n","import { type ReactNode, type CSSProperties, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { c, font } from \"../design-system\";\nimport { PyeWordmark } from \"../Icons\";\n\nexport function Widget({ children }: { children: ReactNode }) {\n return (\n <div style={{\n width: \"min(420px, calc(100vw - 32px))\", height: 600,\n borderRadius: 10,\n boxShadow: \"0px 4px 8px rgba(0,0,0,0.07)\",\n display: \"flex\", flexDirection: \"column\",\n background: c.surface,\n }}>\n {children}\n </div>\n );\n}\n\nexport function Body({ children, padding = 24, style }: { children: ReactNode; padding?: number; style?: CSSProperties }) {\n return (\n <div style={{\n flex: 1, display: \"flex\", flexDirection: \"column\", minHeight: 0,\n background: c.surface,\n borderTop: `1px solid ${c.highlight}`,\n ...style,\n }}>\n <div style={{\n flex: 1, display: \"flex\", flexDirection: \"column\", padding, gap: 16,\n minHeight: 0, overflowY: \"auto\",\n }}>\n {children}\n </div>\n <div style={{ height: 0, borderTop: `1px solid ${c.shadow}`, flexShrink: 0 }} />\n </div>\n );\n}\n\nexport function Spacer() { return <div style={{ flex: 1 }} />; }\n\nexport function StepHeader({ step, total, onBack, hideStep, label, tooltipText }: {\n step?: number;\n total?: number;\n onBack?: () => void;\n hideStep?: boolean;\n label?: string;\n tooltipText?: string;\n}) {\n const hasProgress = !hideStep && step != null && total != null && total > 0;\n const pct = hasProgress ? Math.round((step! / total!) * 100) : 0;\n\n const backButton = (\n <button onClick={onBack} style={{\n background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0,\n display: \"flex\", alignItems: \"center\",\n visibility: onBack ? \"visible\" : \"hidden\",\n color: c.secondary, flexShrink: 0,\n }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ display: \"block\" }}>\n <path d=\"M13 8H3M3 8L7 4M3 8L7 12\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n );\n\n return (\n <div style={{\n display: \"flex\", alignItems: \"center\", gap: 14,\n padding: \"20px 24px\",\n flexShrink: 0,\n background: c.surface,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: \"10px 10px 0 0\",\n }}>\n {backButton}\n {!hasProgress && label && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span style={{ ...font(15, c.primary, 500) }}>{label}</span>\n {tooltipText && <Tooltip position=\"below\" text={tooltipText} />}\n </div>\n )}\n {hasProgress && (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <div style={{\n flex: 1, height: 3, background: c.shadow, borderRadius: 2, overflow: \"hidden\",\n }}>\n <div style={{\n height: \"100%\", width: `${pct}%`, background: c.purple, borderRadius: 2,\n transition: \"width 0.25s ease\",\n }} />\n </div>\n <span style={{\n ...font(13, c.secondary), lineHeight: 1, whiteSpace: \"nowrap\",\n fontVariantNumeric: \"tabular-nums\",\n }}>\n {step}/{total}\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport function StepTitle({ title, subtitle }: { title: string; subtitle?: string }) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <p style={font(18, c.primary, 500)}>{title}</p>\n {subtitle && <p style={font(14, c.secondary)}>{subtitle}</p>}\n </div>\n );\n}\n\n// Dan's Tooltip — self-contained \"?\" circle trigger with portalled popup to escape overflow clipping\nexport function Tooltip({ text, bg, position = \"above\" }: { text: string; bg?: string; position?: \"above\" | \"below\" }) {\n const fill = bg ?? c.raised;\n const isBelow = position === \"below\";\n const triggerRef = useRef<HTMLDivElement>(null);\n const [coords, setCoords] = useState<{ top: number; left: number } | null>(null);\n\n const handleEnter = () => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setCoords({\n top: isBelow ? rect.bottom + 8 : rect.top - 8,\n left: rect.left + rect.width / 2,\n });\n };\n\n const popup = coords ? createPortal(\n <div style={{\n position: \"fixed\",\n top: isBelow ? coords.top : undefined,\n bottom: isBelow ? undefined : `calc(100vh - ${coords.top}px)`,\n left: coords.left,\n transform: \"translateX(-50%)\",\n width: 210,\n background: fill,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `0 4px 16px rgba(0,0,0,0.15), inset 0 -1px 0 ${c.shadow}`,\n borderRadius: 8,\n padding: \"8px 10px\",\n zIndex: 10000,\n pointerEvents: \"none\",\n }}>\n <p style={{ ...font(11, c.secondary), lineHeight: 1.5 }}>{text}</p>\n <div style={{\n position: \"absolute\",\n ...(isBelow\n ? { top: -4 }\n : { bottom: -4 }),\n left: \"50%\",\n transform: \"translateX(-50%) rotate(45deg)\",\n width: 8, height: 8,\n background: fill,\n boxShadow: isBelow ? `-1px -1px 0 ${c.shadow}` : `1px 1px 0 ${c.shadow}`,\n }} />\n </div>,\n document.body,\n ) : null;\n\n return (\n <div\n ref={triggerRef}\n onMouseEnter={handleEnter}\n onMouseLeave={() => setCoords(null)}\n style={{ position: \"relative\", display: \"inline-flex\", flexShrink: 0 }}\n >\n <div\n style={{\n width: 16, height: 16, borderRadius: \"50%\",\n background: fill,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n cursor: \"default\", flexShrink: 0,\n }}\n >\n <span style={{ ...font(9, c.muted), lineHeight: 1, userSelect: \"none\", fontWeight: 500 }}>?</span>\n </div>\n {popup}\n </div>\n );\n}\n\n// Dan's RowGroup — column with 8px gap between items\nexport function RowGroup({ children }: { children: ReactNode }) {\n return <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>{children}</div>;\n}\n\n// Dan's SelectableRow — with inset shadow elevation, inverted on selected\nexport function SelectableRow({ icon, label, sub, amount, selected, onClick }: {\n icon: ReactNode;\n label: string;\n sub: string;\n amount?: string;\n selected?: boolean;\n onClick?: () => void;\n}) {\n const bg = selected ? c.bg : c.raised;\n const shadow = selected\n ? `inset 0 1px 0 ${c.shadow}, inset 0 -1px 0 ${c.highlight}`\n : `inset 0 1px 0 ${c.highlight}, inset 0 -1px 0 ${c.shadow}`;\n return (\n <div\n className={selected ? undefined : \"pye-hoverable\"}\n onClick={onClick}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: 12, borderRadius: 8,\n background: bg, boxShadow: shadow,\n cursor: \"pointer\", transition: \"background 0.1s\",\n }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {icon}\n <div>\n <p style={font(15, c.primary)}>{label}</p>\n <p style={font(14, c.secondary)}>{sub}</p>\n </div>\n </div>\n {amount && (\n <div style={{ textAlign: \"right\" }}>\n <p style={font(15, c.primary)}>{amount}</p>\n <p style={font(14, c.secondary)}>SOL</p>\n </div>\n )}\n </div>\n );\n}\n\n// Dan's RecapRow — non-interactive, raised surface\nexport function RecapRow({ icon, label, sub, amount }: {\n icon: ReactNode;\n label: string;\n sub: string;\n amount?: string;\n}) {\n return (\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: 12, borderRadius: 8, minHeight: 62,\n background: c.raised,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {icon}\n <div>\n <p style={font(15, c.primary)}>{label}</p>\n <p style={font(14, c.secondary)}>{sub}</p>\n </div>\n </div>\n {amount && (\n <div style={{ textAlign: \"right\" }}>\n <p style={font(15, c.primary)}>{amount}</p>\n <p style={font(14, c.secondary)}>SOL</p>\n </div>\n )}\n </div>\n );\n}\n\n// Matches ChoiceRow dimensions (min-height 76, same padding/radius) so layout doesn't jump when real rows load.\nexport function SkeletonRow() {\n return (\n <div style={{\n display: \"flex\", alignItems: \"center\", gap: 12,\n padding: 16, borderRadius: 10, minHeight: 76,\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n }}>\n <div className=\"pye-skeleton\" style={{ width: 44, height: 44, borderRadius: 10, flexShrink: 0 }} />\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <div className=\"pye-skeleton\" style={{ width: \"55%\", height: 14 }} />\n <div className=\"pye-skeleton\" style={{ width: \"75%\", height: 12 }} />\n </div>\n </div>\n );\n}\n\n// Dan's CTA — two variants: purple (brand) and default\nexport function CTA({ label, onClick, disabled, purple }: {\n label: string;\n onClick?: () => void;\n disabled?: boolean;\n purple?: boolean;\n}) {\n if (purple) {\n return (\n <button\n className=\"pye-cta-purple\"\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n style={{\n width: \"100%\", height: 40, borderRadius: 6,\n border: \"none\",\n borderTop: `1px solid var(--c-brand-hi)`,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n background: c.purple,\n ...font(15, \"var(--c-brand-text)\"),\n boxShadow: `inset 0 -1px 0 var(--c-brand-sh)`,\n opacity: disabled ? 0.5 : 1,\n transition: \"filter 0.1s, opacity 0.1s\", flexShrink: 0,\n }}\n >\n {label}\n </button>\n );\n }\n return (\n <button\n className=\"pye-cta-default\"\n onClick={onClick}\n disabled={disabled}\n style={{\n width: \"100%\", height: 40, borderRadius: 6,\n border: \"none\",\n borderTop: `1px solid ${c.highlight}`,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n background: c.raised,\n ...font(15, c.primary),\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n opacity: disabled ? 0.5 : 1,\n transition: \"background 0.1s, opacity 0.1s\", flexShrink: 0,\n }}\n >\n {label}\n </button>\n );\n}\n\nexport function SuccessHeader({ label, onClose }: { label: string; onClose: () => void }) {\n return (\n <div style={{\n height: 48, display: \"flex\", alignItems: \"center\",\n padding: \"0 24px\",\n flexShrink: 0, gap: 8,\n background: c.surface,\n borderRadius: \"10px 10px 0 0\",\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n }}>\n <div style={{\n width: 20, height: 20, borderRadius: \"50%\", flexShrink: 0,\n background: \"rgba(13, 156, 94, 0.15)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M3 8.5L6.5 12L13 5\" stroke=\"#0d9c5e\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n <p style={{ ...font(15, c.primary), flex: 1 }}>{label}</p>\n <button onClick={onClose} style={{\n background: \"none\", border: \"none\", cursor: \"pointer\",\n padding: 0, width: 28, height: 28, marginRight: -7,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n borderRadius: 8, flexShrink: 0,\n }}>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M1 1L13 13M13 1L1 13\" stroke={c.secondary} strokeWidth=\"1\" strokeLinecap=\"round\"/>\n </svg>\n </button>\n </div>\n );\n}\n\nexport function Footer() {\n return (\n <div style={{\n height: 44, display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n gap: 8, flexShrink: 0,\n background: c.surface,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: \"0 0 10px 10px\",\n }}>\n <a href=\"https://pye.fi/\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: \"flex\", alignItems: \"center\", gap: 8, textDecoration: \"none\" }}>\n <span style={font(15, c.secondary)}>Powered by</span>\n <PyeWordmark />\n </a>\n </div>\n );\n}\n\n// Dan's Alert — single style, raised with inset shadow\nexport function Alert({ children }: { children: ReactNode }) {\n return (\n <div style={{\n background: c.raised, borderRadius: 8, padding: 12,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n }}>\n <p style={font(14, c.secondary)}>{children}</p>\n </div>\n );\n}\n\nexport function InlineError({ message }: { message?: string | null }) {\n return message\n ? <p style={{ ...font(14, c.red), marginTop: 4 }}>{message}</p>\n : null;\n}\n\nexport function Divider() {\n return <div style={{ height: 1, background: c.shadow }} />;\n}\n","import { useMemo } from \"react\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport { useBalanceStore, useWalletStore } from \"@pyefi/sdk/react\";\nimport { buildPtLookup, maturities } from \"@pyefi/sdk\";\nimport { Body, Spacer, SkeletonRow } from \"../shared/Layout\";\nimport { c, font, displayFont, formatSolAmount } from \"../design-system\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\nfunction ChoiceRow({\n icon,\n label,\n sub,\n subColor,\n onClick,\n disabled,\n}: {\n icon: React.ReactNode;\n label: string;\n sub: string;\n subColor?: string;\n onClick?: () => void;\n disabled?: boolean;\n}) {\n return (\n <div\n className={disabled ? undefined : \"pye-hoverable\"}\n onClick={disabled ? undefined : onClick}\n style={{\n display: \"flex\", alignItems: \"center\", gap: 12,\n padding: 16, borderRadius: 10, minHeight: 76,\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n transition: \"background 0.1s\",\n }}\n >\n {icon}\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 2, minWidth: 0 }}>\n <p style={font(15, c.primary, 600)}>{label}</p>\n <p style={font(14, subColor ?? c.secondary)}>{sub}</p>\n </div>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n <path d=\"M6 4L10 8L6 12\" stroke={c.muted} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n );\n}\n\nfunction WalletSwitcher({ address, onSwitch }: { address: string; onSwitch: () => void }) {\n const truncated = `${address.slice(0, 4)}...${address.slice(-4)}`;\n return (\n <button\n className=\"pye-hoverable\"\n onClick={onSwitch}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: 20, borderRadius: 10, width: \"100%\",\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n border: \"none\", cursor: \"pointer\", transition: \"background 0.1s\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div style={{\n width: 4, height: 4, borderRadius: 9,\n background: c.green,\n }} />\n <span style={{ ...font(15, c.primary), fontVariantNumeric: \"tabular-nums\" }}>\n {truncated}\n </span>\n </div>\n <span style={font(15, c.secondary)}>Switch</span>\n </button>\n );\n}\n\nfunction IconRedeem() {\n return (\n <div style={{\n flexShrink: 0, width: 44, height: 44, borderRadius: 10,\n background: \"color-mix(in srgb, var(--c-brand) 20%, transparent)\",\n borderTop: \"1px solid rgba(255,255,255,0.2)\",\n boxShadow: \"0 4px 8px rgba(0,0,0,0.07), inset 0 -1px 0 rgba(0,0,0,0.2)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" style={{ color: \"var(--c-brand)\" }}>\n <circle cx=\"8\" cy=\"8\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\" />\n </svg>\n </div>\n );\n}\n\nfunction IconDocs() {\n return (\n <div style={{\n flexShrink: 0, width: 44, height: 44, borderRadius: 10,\n background: `color-mix(in srgb, ${c.secondary} 15%, transparent)`,\n borderTop: \"1px solid rgba(255,255,255,0.2)\",\n boxShadow: \"0 4px 8px rgba(0,0,0,0.07), inset 0 -1px 0 rgba(0,0,0,0.2)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" style={{ color: c.secondary }}>\n <path d=\"M4 3h8a2 2 0 0 1 2 2v12H6a2 2 0 0 1-2-2V3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\"/>\n <path d=\"M4 15a2 2 0 0 1 2-2h8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M7 7h4M7 10h3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </div>\n );\n}\n\nfunction IconSell() {\n return (\n <div style={{\n flexShrink: 0, width: 44, height: 44, borderRadius: 10,\n background: \"color-mix(in srgb, #0d9c5e 20%, transparent)\",\n borderTop: \"1px solid rgba(255,255,255,0.2)\",\n boxShadow: \"0 4px 8px rgba(0,0,0,0.07), inset 0 -1px 0 rgba(0,0,0,0.2)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" style={{ color: \"#0d9c5e\" }}>\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M3 9H17\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"13\" cy=\"12.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n );\n}\n\ninterface WelcomeScreenProps {\n validatorName?: string;\n}\n\nexport default function WelcomeScreen({ validatorName }: WelcomeScreenProps) {\n const navigate = useWidgetStore((s) => s.navigate);\n const walletBalances = useBalanceStore((s) => s.walletBalances);\n const userStakeAccounts = useBalanceStore((s) => s.userStakeAccounts);\n const userStakeAccountsLoading = useBalanceStore((s) => s.userStakeAccountsLoading);\n const walletPublicKey = useWalletStore((s) => s.publicKey);\n const { disconnect } = useWallet();\n\n const ptLookup = buildPtLookup();\n\n // Sum of all ptSOL positions (matured + unmatured) and matured-only subtotal\n const { totalPtSol, maturedPtSol } = useMemo(() => {\n const now = Date.now() / 1000;\n let total = 0;\n let matured = 0;\n for (const [mint, amount] of Object.entries(walletBalances)) {\n if (amount <= 0) continue;\n const entry = ptLookup.get(mint);\n if (!entry) continue;\n const sol = amount / LAMPORTS_PER_SOL;\n total += sol;\n const matTs = Number(maturities[entry.maturityId].maturity_timestamp);\n if (now >= matTs) matured += sol;\n }\n return { totalPtSol: total, maturedPtSol: matured };\n }, [walletBalances, ptLookup]);\n\n // Sum SOL across active stake accounts\n const activeStakeSol = useMemo(() => {\n let lamports = 0;\n for (const acc of userStakeAccounts) {\n if (acc.state === \"active\") lamports += acc.lamports;\n }\n return lamports / LAMPORTS_PER_SOL;\n }, [userStakeAccounts]);\n\n const canRedeem = totalPtSol > 0;\n const canSell = activeStakeSol > 0;\n\n // Show skeletons only on the very first fetch when we have nothing to display.\n // Once stake accounts or balances are known (even if zero), render real rows.\n const hasAnyBalance = Object.values(walletBalances).some((v) => v > 0);\n const isInitialLoading =\n userStakeAccountsLoading && userStakeAccounts.length === 0 && !hasAnyBalance;\n\n const redeemSub = !canRedeem\n ? \"No PT positions\"\n : maturedPtSol > 0\n ? `${formatSolAmount(maturedPtSol)} PT ready to redeem`\n : `${formatSolAmount(totalPtSol)} PT locked`;\n\n const sellSub = canSell\n ? `${formatSolAmount(activeStakeSol, 2)} SOL across active stake`\n : \"No active stake\";\n\n return (\n <Body style={{ borderRadius: \"10px 10px 0 0\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <p style={{ ...displayFont(32, c.primary), letterSpacing: \"-0.02em\", lineHeight: 1.5 }}>\n Welcome back\n </p>\n <p style={font(15, c.secondary)}>\n {isInitialLoading\n ? \"Loading your positions…\"\n : canRedeem && canSell\n ? \"We found active staked SOL positions and PTs ready to redeem. What would you like to do?\"\n : canRedeem\n ? \"We found PTs ready to redeem. What would you like to do?\"\n : canSell\n ? \"We found active staked SOL positions. Sell your future rewards upfront.\"\n : `Stake SOL with ${validatorName ?? \"your validator\"} to get started.`}\n </p>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10, marginTop: 8 }}>\n {isInitialLoading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : (\n <>\n <ChoiceRow\n icon={<IconSell />}\n label=\"Sell future rewards\"\n sub={sellSub}\n disabled={!canSell}\n onClick={() => navigate(\"select-position\")}\n />\n <ChoiceRow\n icon={<IconRedeem />}\n label=\"Redeem PTs\"\n sub={redeemSub}\n subColor={maturedPtSol > 0 ? c.green : undefined}\n disabled={!canRedeem}\n onClick={() => navigate(\"redeem-list\")}\n />\n <ChoiceRow\n icon={<IconDocs />}\n label=\"Learn more\"\n sub=\"Read the docs\"\n onClick={() => window.open(\"https://docs.pye.fi/\", \"_blank\", \"noopener,noreferrer\")}\n />\n </>\n )}\n </div>\n\n <Spacer />\n\n {walletPublicKey && (\n <WalletSwitcher\n address={walletPublicKey}\n onSwitch={() => { disconnect().catch(() => {}); }}\n />\n )}\n </Body>\n );\n}\n","import { useEffect } from \"react\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport { useWalletStore } from \"@pyefi/sdk/react\";\nimport { c, font } from \"../design-system\";\nimport { StepTitle, RowGroup, Spacer } from \"../shared/Layout\";\nimport { WalletDot } from \"../Icons\";\n\ninterface WalletRowProps {\n name: string;\n iconUrl?: string;\n connecting: string | null;\n onConnect: (name: string) => void;\n}\n\nfunction WalletRow({ name, iconUrl, connecting, onConnect }: WalletRowProps) {\n const isConnecting = connecting === name;\n const isDimmed = connecting != null && !isConnecting;\n\n return (\n <div\n className={!connecting ? \"pye-hoverable\" : undefined}\n onClick={() => !connecting && onConnect(name)}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n padding: 12, borderRadius: 8,\n background: c.raised,\n boxShadow: `inset 0 1px 0 ${c.highlight}, inset 0 -1px 0 ${c.shadow}`,\n cursor: connecting ? \"default\" : \"pointer\",\n opacity: isDimmed ? 0.4 : 1,\n transition: \"background 0.1s, opacity 0.2s\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {iconUrl ? (\n <img src={iconUrl} alt=\"\" style={{ width: 32, height: 32, borderRadius: 8, objectFit: \"cover\" }} />\n ) : (\n <WalletDot name={name} size={32} />\n )}\n <p style={font(15, c.primary)}>{name}</p>\n </div>\n <p style={font(14, isConnecting ? c.purple : c.secondary)}>\n {isConnecting ? \"Connecting…\" : \"Detected\"}\n </p>\n </div>\n );\n}\n\nexport default function ConnectWallet() {\n const { wallets, wallet, select, connecting } = useWallet();\n const navigate = useWidgetStore((s) => s.navigate);\n const walletStatus = useWalletStore((s) => s.status);\n\n useEffect(() => {\n if (walletStatus === \"connected\") navigate(\"welcome\");\n }, [walletStatus, navigate]);\n\n const connectingName = connecting ? wallet?.adapter.name ?? null : null;\n\n // Dedupe: wallet-adapter-react merges explicit adapters with Wallet Standard\n // auto-discovery, so some wallets (e.g. MetaMask's Solana snap) show up\n // twice and trip a React duplicate-key warning.\n const uniqueWallets = Array.from(\n new Map(wallets.map((w) => [w.adapter.name, w])).values(),\n );\n const sortedWallets = [...uniqueWallets].sort((a, b) => {\n const aDetected = a.readyState === \"Installed\" ? 0 : 1;\n const bDetected = b.readyState === \"Installed\" ? 0 : 1;\n return aDetected - bDetected;\n });\n\n const handleConnect = (name: string) => {\n const w = wallets.find((w) => w.adapter.name === name);\n if (w) select(w.adapter.name);\n };\n\n return (\n <>\n <StepTitle\n title=\"Connect your wallet\"\n subtitle=\"Connect to see your existing stake and SOL balance.\"\n />\n <RowGroup>\n {sortedWallets.map((w) => (\n <WalletRow\n key={w.adapter.name}\n name={w.adapter.name}\n iconUrl={w.adapter.icon}\n connecting={connectingName}\n onConnect={handleConnect}\n />\n ))}\n </RowGroup>\n <Spacer />\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport { useWalletStore, useMarketStore, useApyStore } from \"@pyefi/sdk/react\";\nimport { maturities, getPyeConfig } from \"@pyefi/sdk\";\nimport { c, font, displayFont, formatSolAmount } from \"../design-system\";\nimport { Spacer, CTA } from \"../shared/Layout\";\n\nconst FALLBACK_APY = 0.07;\nconst EXAMPLE_SOL = 100;\n\nexport default function YieldForwardIntro() {\n const navigate = useWidgetStore((s) => s.navigate);\n const walletStatus = useWalletStore((s) => s.status);\n const isConnected = walletStatus === \"connected\";\n const markets = useMarketStore((s) => s.markets);\n const apyByVoteAccount = useApyStore((s) => s.apyByVoteAccount);\n\n // Use configured vote account APY, or average all fetched APYs, or fallback\n const apy = useMemo(() => {\n const config = getPyeConfig();\n if (config.voteAccount && apyByVoteAccount[config.voteAccount] != null) {\n return apyByVoteAccount[config.voteAccount];\n }\n const values = Object.values(apyByVoteAccount);\n if (values.length > 0) {\n return values.reduce((a, b) => a + b, 0) / values.length;\n }\n return FALLBACK_APY;\n }, [apyByVoteAccount]);\n\n // Find the ~6 month maturity (Q3) RT best bid for the example\n const { sellToday, holdToUnlock, maturityLabel } = useMemo(() => {\n // Look for any Q3 RT market — try all keys since validatorId varies\n let bestBid: number | null = null;\n for (const [key, market] of Object.entries(markets)) {\n if (key.endsWith(\"-q32026-RT\") && market.bestBidPrice != null) {\n bestBid = market.bestBidPrice;\n break;\n }\n }\n\n // \"Hold to unlock\" = estimated staking yield for the period using real APY\n const matTs = Number(maturities.q32026.maturity_timestamp);\n const nowS = Date.now() / 1000;\n const yearsToMaturity = Math.max(0, (matTs - nowS) / (365 * 24 * 60 * 60));\n const hold = apy * yearsToMaturity * EXAMPLE_SOL;\n\n // \"Sell today\" = RT price × example deposit\n // Fallback: assume ~96% of hold value (4% discount) if no market data\n const sell = bestBid != null\n ? bestBid * EXAMPLE_SOL\n : hold * 0.96;\n\n return {\n sellToday: sell,\n holdToUnlock: hold,\n maturityLabel: maturities.q32026.human_readable,\n };\n }, [markets, apy]);\n\n const diff = holdToUnlock > 0 ? holdToUnlock - sellToday : null;\n\n return (\n <>\n <p style={{ ...displayFont(45, c.primary), letterSpacing: \"-0.02em\" }}>\n Get your future staking rewards today.\n </p>\n\n <Spacer />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <p style={font(12, c.primary)}>Example: Stake {EXAMPLE_SOL} SOL for 6 months</p>\n\n {/* Comparison cards */}\n <div style={{ display: \"flex\", gap: 8 }}>\n {/* Left -- sell today */}\n <div style={{\n flex: 1, borderRadius: 6, padding: 12,\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `0 4px 8px rgba(0,0,0,0.07), inset 0 -1px 0 ${c.shadow}`,\n }}>\n <p style={font(12, c.secondary)}>Sell rewards today</p>\n <p style={{ ...displayFont(24, c.green), fontVariantNumeric: \"lining-nums tabular-nums\", lineHeight: 1.2, margin: \"4px 0 2px\" }}>\n +{formatSolAmount(sellToday)} SOL\n </p>\n <p style={font(12, c.secondary)}>Yours now</p>\n </div>\n {/* Right -- hold to unlock */}\n <div style={{\n flex: 1, borderRadius: 6, padding: 12,\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n }}>\n <p style={font(12, c.secondary)}>Hold to unlock</p>\n <p style={{ ...displayFont(24, c.primary), fontVariantNumeric: \"lining-nums tabular-nums\", lineHeight: 1.2, margin: \"4px 0 2px\" }}>\n +{formatSolAmount(holdToUnlock)}\n </p>\n <p style={font(12, c.secondary)}>Available {maturityLabel}</p>\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 12 }}>\n <CTA\n label={isConnected ? \"Continue\" : \"Connect Wallet\"}\n onClick={() => navigate(isConnected ? \"select-position\" : \"connect-wallet\")}\n purple\n />\n <a href=\"https://docs.pye.fi/\" target=\"_blank\" rel=\"noopener noreferrer\"\n style={{ ...font(12, c.secondary), textDecoration: \"none\" }}>\n Learn more — read the docs\n </a>\n </div>\n </div>\n </>\n );\n}\n","import { useWidgetStore } from \"../../stores/widget-store\";\nimport { useBalanceStore } from \"@pyefi/sdk/react\";\n// TODO(SIMD-185): restore getPyeConfig, SolIcon, useWalletStore imports when re-enabling liquid SOL deposit\nimport { StepTitle, RowGroup, Spacer, SelectableRow } from \"../shared/Layout\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport default function SelectPosition() {\n const navigate = useWidgetStore((s) => s.navigate);\n const selectStakeAccount = useWidgetStore((s) => s.selectStakeAccount);\n\n const userStakeAccounts = useBalanceStore((s) => s.userStakeAccounts);\n\n const activeAccounts = userStakeAccounts.filter((a) => a.state === \"active\");\n\n const handleSelectStake = (pubkey: string, lamports: number, validatorName?: string, validatorIcon?: string, validatorVoteAccount?: string, validatorAltPubkey?: string | null) => {\n selectStakeAccount(pubkey, lamports / LAMPORTS_PER_SOL, validatorName, validatorIcon, validatorVoteAccount, validatorAltPubkey);\n navigate(\"choose-amount\");\n };\n\n return (\n <>\n <StepTitle\n title=\"Select a position\"\n subtitle=\"We'll sell the future rewards from this position upfront.\"\n />\n <div style={{ flex: 1, overflowY: \"auto\", minHeight: 0 }}>\n <RowGroup>\n {activeAccounts.map((account) => (\n <SelectableRow\n key={account.pubkey}\n icon={\n <img\n src={account.validatorLogo ?? account.validatorIcon}\n alt={account.validatorName}\n onError={(e) => {\n const img = e.currentTarget;\n if (img.src !== account.validatorIcon) {\n img.src = account.validatorIcon;\n }\n }}\n style={{\n width: 36, height: 36, borderRadius: \"50%\", flexShrink: 0,\n objectFit: \"cover\",\n boxShadow: \"0px 4px 8px 0px rgba(0,0,0,0.07)\",\n }}\n />\n }\n label=\"Staked SOL\"\n sub={account.validatorName || `${account.pubkey.slice(0, 8)}...`}\n amount={(account.lamports / LAMPORTS_PER_SOL).toFixed(4)}\n onClick={() => handleSelectStake(account.pubkey, account.lamports, account.validatorName, account.validatorIcon, account.validatorVoteAccount, account.validatorAltPubkey)}\n />\n ))}\n {/* TODO(SIMD-185): Re-enable liquid SOL deposit once transient account flow is fixed.\n {hasLiquidSol && (\n <SelectableRow\n icon={<SolIcon />}\n label=\"SOL\"\n sub=\"Unstaked\"\n amount={(balanceLamports / LAMPORTS_PER_SOL).toFixed(4)}\n onClick={handleSelectLiquidSol}\n />\n )} */}\n </RowGroup>\n </div>\n </>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport { c, font, formatSolAmount } from \"../design-system\";\nimport { StepTitle, CTA, InlineError, Spacer } from \"../shared/Layout\";\n\nconst SLIDER_CSS = `\n .pye-amount-slider {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 4px;\n border-radius: 999px;\n background: transparent;\n outline: none;\n cursor: pointer;\n }\n .pye-amount-slider::-webkit-slider-runnable-track {\n height: 4px;\n border-radius: 999px;\n background: linear-gradient(to right, var(--c-brand) var(--pye-slider-pct, 0%), var(--c-shadow) var(--pye-slider-pct, 0%));\n }\n .pye-amount-slider::-moz-range-track {\n height: 4px;\n border-radius: 999px;\n background: var(--c-shadow);\n }\n .pye-amount-slider::-moz-range-progress {\n height: 4px;\n border-radius: 999px;\n background: var(--c-brand);\n }\n .pye-amount-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--c-surface);\n border: 2px solid var(--c-brand);\n margin-top: -7px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.15);\n cursor: pointer;\n }\n .pye-amount-slider::-moz-range-thumb {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--c-surface);\n border: 2px solid var(--c-brand);\n box-shadow: 0 2px 4px rgba(0,0,0,0.15);\n cursor: pointer;\n }\n`;\n\nexport default function ChooseAmount() {\n const navigate = useWidgetStore((s) => s.navigate);\n const depositAmount = useWidgetStore((s) => s.depositAmount);\n const setDepositAmount = useWidgetStore((s) => s.setDepositAmount);\n const selectedBalance = useWidgetStore((s) => s.selectedStakeAccountBalance);\n const selectedPubkey = useWidgetStore((s) => s.selectedStakeAccountPubkey);\n const validatorName = useWidgetStore((s) => s.selectedValidatorName);\n\n const available = selectedBalance;\n const parsed = parseFloat(depositAmount) || 0;\n const pcts = [0.25, 0.5, 0.75, 1];\n\n // Smoothly ramp the deposit amount from current → target (pill clicks only).\n const rafRef = useRef<number | null>(null);\n useEffect(() => () => { if (rafRef.current != null) cancelAnimationFrame(rafRef.current); }, []);\n\n const truncate4 = (v: number) => (Math.floor(v * 10000) / 10000).toFixed(4);\n\n const rampToAmount = (target: number) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current);\n const start = parsed;\n if (Math.abs(target - start) < 1e-9) return;\n const reduced = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n if (reduced) { setDepositAmount(truncate4(target)); return; }\n\n const duration = 500;\n const startTime = performance.now();\n const ease = (t: number) => 1 - Math.pow(1 - t, 3); // easeOutCubic\n let lastWritten = \"\";\n const tick = (now: number) => {\n const t = Math.min(1, (now - startTime) / duration);\n const v = start + (target - start) * ease(t);\n const s = truncate4(v);\n if (s !== lastWritten) {\n lastWritten = s;\n setDepositAmount(s);\n }\n if (t < 1) rafRef.current = requestAnimationFrame(tick);\n else rafRef.current = null;\n };\n rafRef.current = requestAnimationFrame(tick);\n };\n\n const isLiquidSol = selectedPubkey === \"liquid-sol\";\n const GAS_RESERVE = 0.01;\n\n let error: string | null = null;\n let warning: string | null = null;\n if (depositAmount && parsed <= 0) error = \"Amount must be greater than 0\";\n if (depositAmount && parsed > available) error = `Maximum available is ${available} SOL`;\n if (!error && isLiquidSol && parsed > 0 && parsed >= available - GAS_RESERVE)\n warning = \"This leaves very little SOL for transaction fees\";\n\n const isValid = !!depositAmount && !error && parsed > 0;\n\n const sliderMax = available > 0 ? available : 1;\n const sliderValue = Math.min(parsed, sliderMax);\n const sliderPct = available > 0 ? Math.min(100, (sliderValue / available) * 100) : 0;\n\n const stepSize = Math.max(0.0001, available / 1000);\n\n const availableLabel = formatSolAmount(available);\n const subtitle = validatorName\n ? `${validatorName} balance detected: ${availableLabel} SOL.`\n : `Balance detected: ${availableLabel} SOL.`;\n\n return (\n <>\n <style>{SLIDER_CSS}</style>\n <StepTitle title=\"How much of your stake do you want to sell rewards for?\" subtitle={subtitle} />\n\n <div style={{\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: 8,\n padding: 16,\n marginTop: 8,\n display: \"flex\", flexDirection: \"column\", gap: 16,\n }}>\n {/* Input */}\n <div style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n background: c.bg, borderRadius: 8, padding: \"8px 16px\",\n borderTop: `1px solid ${error ? c.red : c.shadow}`,\n boxShadow: error\n ? `inset 0 -1px 0 ${c.highlight}, 0 0 0 1px ${c.red}`\n : `inset 0 -1px 0 ${c.highlight}`,\n }}>\n <input\n type=\"number\"\n value={depositAmount}\n onChange={(e) => setDepositAmount(e.target.value)}\n min={0.0001}\n max={available}\n placeholder=\"0\"\n style={{\n background: \"none\", border: \"none\", outline: \"none\",\n ...font(24, c.green, 500),\n width: \"100%\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n />\n <span style={font(15, c.secondary)}>SOL</span>\n </div>\n\n {/* Slider */}\n <input\n type=\"range\"\n className=\"pye-amount-slider\"\n min={0}\n max={sliderMax}\n step={stepSize}\n value={sliderValue}\n onChange={(e) => {\n const s = truncate4(parseFloat(e.target.value));\n if (s !== depositAmount) setDepositAmount(s);\n }}\n style={{ \"--pye-slider-pct\": `${sliderPct}%` } as React.CSSProperties}\n />\n\n {/* % pills */}\n <div style={{ display: \"flex\", gap: 8 }}>\n {pcts.map((p) => (\n <button\n key={p}\n type=\"button\"\n className=\"pye-pill\"\n onClick={() => {\n const target = p === 1\n ? (isLiquidSol ? Math.max(0, available - GAS_RESERVE) : available)\n : available * p;\n rampToAmount(target);\n }}\n style={{\n flex: 1, borderRadius: 8,\n border: \"none\",\n borderTop: `1px solid ${c.highlight}`,\n cursor: \"pointer\",\n background: c.surface,\n ...font(14, c.secondary),\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n padding: \"8px 4px\",\n transition: \"background 0.1s\",\n }}\n >\n {p * 100}%\n </button>\n ))}\n </div>\n </div>\n\n <InlineError message={error ?? \"\"} />\n {!error && warning && <p style={{ ...font(14, c.red), marginTop: 4 }}>{warning}</p>}\n\n <Spacer />\n <CTA\n label=\"Continue\"\n onClick={() => navigate(\"choose-duration\")}\n disabled={!isValid}\n purple\n />\n </>\n );\n}\n","import { useEffect, useRef, useState, type CSSProperties } from \"react\";\n\nconst DIGITS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] as const;\n\ntype OdometerProps = {\n /** Fully-formatted string. Digits roll; all other characters (+, ., space, letters) pass through. */\n value: string;\n /** Typography + color applied to the root span. */\n style?: CSSProperties;\n /** Total roll duration per digit column, ms. */\n duration?: number;\n /** Stagger between adjacent digit columns, ms. */\n stagger?: number;\n};\n\n/** Per-digit rolling counter. Pure CSS transforms, zero deps. */\nexport function Odometer({ value, style, duration = 1200, stagger = 80 }: OdometerProps) {\n const reducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n\n const chars = [...value];\n let digitIdx = 0;\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"baseline\",\n fontVariantNumeric: \"lining-nums tabular-nums\",\n whiteSpace: \"pre\",\n ...style,\n }}\n >\n {chars.map((ch, i) => {\n if (!/\\d/.test(ch)) {\n return <span key={i}>{ch}</span>;\n }\n const delay = reducedMotion ? 0 : digitIdx * stagger;\n digitIdx++;\n return (\n <DigitColumn\n key={i}\n digit={Number(ch)}\n delay={delay}\n duration={reducedMotion ? 0 : duration}\n />\n );\n })}\n </span>\n );\n}\n\nfunction DigitColumn({ digit, delay, duration }: { digit: number; delay: number; duration: number }) {\n const [target, setTarget] = useState(0);\n const raf = useRef<number | null>(null);\n\n useEffect(() => {\n raf.current = requestAnimationFrame(() => setTarget(digit));\n return () => {\n if (raf.current != null) cancelAnimationFrame(raf.current);\n };\n }, [digit]);\n\n return (\n <span\n aria-hidden\n style={{\n display: \"inline-block\",\n height: \"1em\",\n lineHeight: 1,\n overflow: \"hidden\",\n verticalAlign: \"baseline\",\n }}\n >\n <span\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n transform: `translateY(-${target}em)`,\n transition:\n duration === 0\n ? \"none\"\n : `transform ${duration}ms cubic-bezier(0.2, 0.9, 0.2, 1) ${delay}ms`,\n willChange: \"transform\",\n }}\n >\n {DIGITS.map((n) => (\n <span key={n} style={{ height: \"1em\", lineHeight: 1 }}>\n {n}\n </span>\n ))}\n </span>\n </span>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useConnection } from \"@solana/wallet-adapter-react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport {\n maturities,\n type MaturityId,\n lookupBondByVoteAccount,\n PYE_TRADING_FEE_BPS,\n applyTradingFee,\n estimateRtFromStake,\n fetchEpochSyncedNowTs,\n} from \"@pyefi/sdk\";\nimport { useMarketStore } from \"@pyefi/sdk/react\";\nimport { c, font, displayFont, MARKET_RATE, formatSolAmount, POINTS_ENABLED } from \"../design-system\";\nimport { CTA, Tooltip, Spacer } from \"../shared/Layout\";\nimport { Odometer } from \"../shared/Odometer\";\n\n/** Map SDK maturity IDs to Dan's display format */\nconst QUARTER_INFO: Record<MaturityId, { label: string; pts: string | null }> =\n {\n q22026: { label: \"30 Jun 2026\", pts: null },\n q32026: { label: \"30 Sep 2026\", pts: \"2x points\" },\n q42026: { label: \"31 Dec 2026\", pts: \"3x points\" },\n q12026: { label: \"31 Mar 2026\", pts: null },\n };\n\n/** All maturity IDs in chronological order */\nconst ALL_MATURITIES: MaturityId[] = [\"q12026\", \"q22026\", \"q32026\", \"q42026\"];\n\nconst TWO_DAYS_S = 2 * 24 * 60 * 60;\n\n/** Filter out maturities within 2 days of maturity date */\nfunction getAvailableMaturities(): MaturityId[] {\n const nowS = Date.now() / 1000;\n return ALL_MATURITIES.filter((id) => {\n const ts = Number(maturities[id].maturity_timestamp);\n return ts - nowS > TWO_DAYS_S;\n });\n}\n\nexport default function ChooseDuration() {\n const { connection } = useConnection();\n const navigate = useWidgetStore((s) => s.navigate);\n const selectedMaturityId = useWidgetStore((s) => s.selectedMaturityId);\n const setSelectedMaturity = useWidgetStore((s) => s.setSelectedMaturity);\n const depositAmount = useWidgetStore((s) => s.depositAmount);\n const selectedValidatorVoteAccount = useWidgetStore((s) => s.selectedValidatorVoteAccount);\n const markets = useMarketStore((s) => s.markets);\n\n // Epoch-synced wall-clock seconds — matches the on-chain \"now\" used by the\n // Bonds program when computing RT issuance, so our preview number stays in\n // sync with the real swap amount.\n const [nowTs, setNowTs] = useState<number | null>(null);\n useEffect(() => {\n fetchEpochSyncedNowTs(connection).then(setNowTs).catch(() => {\n setNowTs(Date.now() / 1000);\n });\n }, [connection]);\n\n const availableMaturities = useMemo(() => getAvailableMaturities(), []);\n\n // Resolve the validator ID for validator-specific market lookup\n const stakeValidatorId = useMemo(() => {\n if (!selectedValidatorVoteAccount) return null;\n for (const matId of availableMaturities) {\n const lookup = lookupBondByVoteAccount(selectedValidatorVoteAccount, matId);\n if (lookup) return lookup.validatorId;\n }\n return null;\n }, [selectedValidatorVoteAccount, availableMaturities]);\n\n // Default to first available duration if none selected\n useEffect(() => {\n if (!selectedMaturityId && availableMaturities.length > 0) {\n setSelectedMaturity(availableMaturities[0]);\n }\n }, [selectedMaturityId, setSelectedMaturity, availableMaturities]);\n\n const parsedAmount = parseFloat(depositAmount) || 0;\n // Use epoch-synced now when available; fall back to wall-clock for the\n // first render before the RPC call resolves.\n const effectiveNowTs = nowTs ?? Date.now() / 1000;\n\n // Build display quarters from available maturities\n const quarters = availableMaturities.map((matId) => {\n const info = QUARTER_INFO[matId] ?? {\n label: maturities[matId]?.human_readable ?? matId,\n pts: null,\n };\n\n // Look up RT market data — bids represent what buyers will pay per RT\n // Use validator-specific key when available; fall back to generic lookup\n const rtMarketKey = stakeValidatorId\n ? `${stakeValidatorId}-${matId}-RT`\n : Object.keys(markets).find((k) => k.endsWith(`-${matId}-RT`));\n const rtMarket = rtMarketKey ? markets[rtMarketKey] ?? null : null;\n const bestBid = rtMarket?.bestBidPrice ?? null;\n\n // Bonds program mints RT proportional to remaining issuance window, so\n // we scale the deposit by time remaining to get the RT the user will\n // actually receive. Using `parsedAmount` here would overstate the quote.\n const maturity = maturities[matId];\n const estimatedRt = estimateRtFromStake({\n amountSol: parsedAmount,\n maturity,\n nowTs: effectiveNowTs,\n });\n\n // Gross yield: estimated RT × best bid price (SOL per RT)\n // Fallback: MARKET_RATE is annual (0.85%), scaled by time remaining so Q2–Q4 differ\n const maturityTs = Number(maturity.maturity_timestamp);\n const yearsRemaining = Math.max(0, (maturityTs - effectiveNowTs) / (365.25 * 86400));\n const grossYield =\n bestBid != null\n ? bestBid * estimatedRt\n : parsedAmount * (MARKET_RATE / 100) * yearsRemaining;\n // User-facing yield is net of Pye's taker fee\n const netYield = applyTradingFee(grossYield);\n\n return { matId, ...info, bestBid, grossYield, netYield };\n });\n\n const feePct = (PYE_TRADING_FEE_BPS / 100).toFixed(2);\n\n const sel = quarters.find((q) => q.matId === selectedMaturityId);\n\n return (\n <>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <p style={font(18, c.primary, 500)}>Choose a staking duration</p>\n <Tooltip position=\"below\" text=\"Lock your stake until the chosen date. All staking rewards for the period are sold to you upfront today. Your full SOL stake is returned at maturity.\" />\n </div>\n <p style={font(14, c.secondary)}>\n All rewards for the period are paid to you today. Your stake is\n returned in full at the end.\n </p>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {/* Duration rows — full width, one per row */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n {quarters.map((q) => {\n const isSelected = selectedMaturityId === q.matId;\n return (\n <div\n key={q.matId}\n className={isSelected ? \"pye-pill pye-pill--selected\" : \"pye-pill\"}\n onClick={() => setSelectedMaturity(q.matId as MaturityId)}\n style={{\n width: \"100%\",\n minHeight: 48,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 16px\",\n borderRadius: 8,\n cursor: \"pointer\",\n background: isSelected ? c.bg : c.raised,\n borderTop: `1px solid ${isSelected ? c.shadow : c.highlight}`,\n boxShadow: isSelected\n ? `inset 0 -1px 0 ${c.highlight}`\n : `inset 0 -1px 0 ${c.shadow}`,\n transition: \"background 0.1s\",\n }}\n >\n <span style={font(15, isSelected ? c.primary : c.secondary, isSelected ? 500 : 400)}>\n {q.label}\n </span>\n {POINTS_ENABLED && q.pts && (\n <span style={font(13, c.purple)}>{q.pts}</span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Yield card */}\n {sel && (\n <div\n style={{\n background: c.lowered,\n borderRadius: 8,\n padding: 12,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <p style={font(14, c.secondary)}>You receive today</p>\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8 }}>\n {sel.netYield < 0.0001 ? (\n <p\n style={{\n ...displayFont(32, c.green),\n lineHeight: 1.2,\n fontVariantNumeric: \"lining-nums tabular-nums\",\n }}\n >\n &lt; 0.0001 SOL\n </p>\n ) : (\n <Odometer\n value={`+${formatSolAmount(sel.netYield, 3)} SOL`}\n style={{ ...displayFont(32, c.green), lineHeight: 1.2 }}\n />\n )}\n </div>\n <p style={font(12, c.muted)}>\n Quote includes a {feePct}% Pye protocol fee.\n </p>\n </div>\n )}\n\n </div>\n\n <Spacer />\n <CTA\n label=\"Review\"\n onClick={() => navigate(\"review-quote\")}\n disabled={!selectedMaturityId}\n purple\n />\n </>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport {\n maturities,\n validators,\n type MaturityId,\n type ValidatorId,\n executeStakeDeposit,\n executeRtSell,\n executeDepositAndSell,\n checkSellLiquidity,\n allowedLockups,\n lookupBondByVoteAccount,\n fetchBalances,\n fetchUserStakeAccounts,\n PYE_TRADING_FEE_BPS,\n applyTradingFee,\n estimateRtFromStake,\n fetchEpochSyncedNowTs,\n} from \"@pyefi/sdk\";\nimport { useMarketStore, useBalanceStore, useWalletStore } from \"@pyefi/sdk/react\";\nimport { c, font, MARKET_RATE, pointsMap, formatSolAmount, POINTS_ENABLED } from \"../design-system\";\nimport { StepTitle, CTA, Tooltip, Spacer } from \"../shared/Layout\";\nimport { Odometer } from \"../shared/Odometer\";\n\n/* ═══════════════════════════════════════════════════════════════════════════\n DiscountSlider — Dan's exact pointer-capture slider\n ═══════════════════════════════════════════════════════════════════════════ */\n\nfunction DiscountSlider({\n value,\n onChange,\n}: {\n value: number; // 0-5 float\n onChange: (v: number) => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const MIN = 0, MAX = 5;\n const pct = ((value - MIN) / (MAX - MIN)) * 100;\n\n const computeValue = (clientX: number): number => {\n const rect = trackRef.current!.getBoundingClientRect();\n const x = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const raw = MIN + (x / rect.width) * (MAX - MIN);\n return Math.round(raw * 100) / 100;\n };\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault();\n trackRef.current!.setPointerCapture(e.pointerId);\n onChange(computeValue(e.clientX));\n };\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (e.buttons === 0) return;\n onChange(computeValue(e.clientX));\n };\n\n const filledColor = value > 3 ? \"#D93B3B\" : \"#0d9c5e\";\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div\n ref={trackRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n style={{ position: \"relative\", height: 12, display: \"flex\", alignItems: \"center\", cursor: \"pointer\", userSelect: \"none\" }}\n >\n <div style={{\n position: \"absolute\", left: 0, width: `${pct}%`, height: 8,\n background: filledColor,\n borderRadius: pct > 98 ? \"999px\" : \"999px 0 0 999px\",\n borderTop: \"1px solid rgba(255,255,255,0.3)\",\n boxShadow: \"inset 0 -1px 0 rgba(0,0,0,0.2)\",\n minWidth: pct > 0 ? 4 : 0,\n }} />\n <div style={{\n position: \"absolute\", left: `${pct}%`, right: 0, height: 8,\n background: c.bg,\n borderRadius: pct < 2 ? \"999px\" : \"0 999px 999px 0\",\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n }} />\n <div style={{\n position: \"absolute\", left: `calc(${pct}% - 8px)`,\n width: 16, height: 16, borderRadius: \"50%\",\n background: \"#fdfcfc\",\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n zIndex: 1, flexShrink: 0,\n }} />\n </div>\n <div style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n {[\"0%\", \"1%\", \"2%\", \"3%\", \"4%\", \"5%\"].map((l) => (\n <span key={l} style={{\n ...font(14, c.secondary),\n textTransform: \"uppercase\" as const, letterSpacing: \"0.04em\",\n width: 24, textAlign: l === \"0%\" ? \"left\" : l === \"5%\" ? \"right\" : \"center\",\n }}>{l}</span>\n ))}\n </div>\n </div>\n );\n}\n\n/* ═══════════════════════════════════════════════════════════════════════════\n Helper: resolve bond data from lockups for a given market\n ═══════════════════════════════════════════════════════════════════════════ */\n\nfunction resolveBondParams(marketKey: string) {\n // marketKey format: \"validatorId-maturityId-PT\" or \"validatorId-maturityId-RT\"\n const parts = marketKey.split(\"-\");\n if (parts.length < 3) return null;\n const tokenType = parts.pop(); // \"PT\" or \"RT\"\n const maturityId = parts.pop() as MaturityId;\n const validatorId = parts.join(\"-\"); // rejoin in case validator has hyphens\n\n const lockups = allowedLockups();\n const bond = (lockups as Record<string, Record<string, { pubkey: string; pt_address: string; rt_address: string }>>)[validatorId]?.[maturityId];\n if (!bond) return null;\n\n const validator = validators[validatorId as ValidatorId];\n return {\n validatorId,\n maturityId,\n bondPubkey: bond.pubkey,\n principalTokenMint: bond.pt_address,\n yieldTokenMint: bond.rt_address,\n voteAccount: validator?.vote_account ?? \"\",\n };\n}\n\nexport default function ReviewQuote() {\n const { connection } = useConnection();\n const wallet = useWallet();\n\n // Epoch-synced wall-clock — matches the on-chain clock the Bonds program\n // uses when computing RT issuance, so the swap we build matches what the\n // user will actually hold after deposit.\n const [nowTs, setNowTs] = useState<number | null>(null);\n useEffect(() => {\n fetchEpochSyncedNowTs(connection).then(setNowTs).catch(() => {\n setNowTs(Date.now() / 1000);\n });\n }, [connection]);\n\n const navigate = useWidgetStore((s) => s.navigate);\n const txStatus = useWidgetStore((s) => s.txStatus);\n const txStep = useWidgetStore((s) => s.txStep);\n const txError = useWidgetStore((s) => s.txError);\n const setTxStatus = useWidgetStore((s) => s.setTxStatus);\n const setTxStep = useWidgetStore((s) => s.setTxStep);\n const setSellAmountSol = useWidgetStore((s) => s.setSellAmountSol);\n const advancedOpen = useWidgetStore((s) => s.advancedOpen);\n const setAdvancedOpen = useWidgetStore((s) => s.setAdvancedOpen);\n const slippageBps = useWidgetStore((s) => s.slippageBps);\n const setSlippageBps = useWidgetStore((s) => s.setSlippageBps);\n\n const depositAmount = useWidgetStore((s) => s.depositAmount);\n const selectedMaturityId = useWidgetStore((s) => s.selectedMaturityId);\n const selectedStakeAccountPubkey = useWidgetStore((s) => s.selectedStakeAccountPubkey);\n const selectedStakeAccountBalance = useWidgetStore((s) => s.selectedStakeAccountBalance);\n const selectedValidatorAltPubkey = useWidgetStore((s) => s.selectedValidatorAltPubkey);\n\n const markets = useMarketStore((s) => s.markets);\n const userStakeAccounts = useBalanceStore((s) => s.userStakeAccounts);\n const setWalletBalances = useBalanceStore((s) => s.setWalletBalances);\n const setUserStakeAccounts = useBalanceStore((s) => s.setUserStakeAccounts);\n const setBalanceLamports = useWalletStore((s) => s.setBalanceLamports);\n\n const parsedAmount = parseFloat(depositAmount) || 0;\n const maturity = selectedMaturityId ? maturities[selectedMaturityId] : null;\n const matures = maturity?.human_readable ?? \"Sep 30, 2026\";\n\n // Find points label from maturity month\n const monthToQuarter: Record<string, string> = { JUN: \"Q3\", SEP: \"Q4\", DEC: \"Q1\", MAR: \"Q2\" };\n const quarterId = maturity ? (monthToQuarter[maturity.month] ?? null) : null;\n const points = POINTS_ENABLED && quarterId ? (pointsMap[quarterId] ?? null) : null;\n\n // Find the validator vote account from stake accounts\n const selectedStakeAccount = selectedStakeAccountPubkey !== \"liquid-sol\"\n ? userStakeAccounts.find((a) => a.pubkey === selectedStakeAccountPubkey)\n : null;\n\n // Resolve the validator ID for market lookup\n const stakeVoteAccount = selectedStakeAccount?.validatorVoteAccount;\n const stakeBondLookup = stakeVoteAccount && selectedMaturityId\n ? lookupBondByVoteAccount(stakeVoteAccount, selectedMaturityId)\n : null;\n const stakeValidatorId = stakeBondLookup?.validatorId;\n\n // RT market data — must match the stake account's validator (each validator has its own RT token)\n const rtMarketKey = selectedMaturityId\n ? (stakeValidatorId\n ? `${stakeValidatorId}-${selectedMaturityId}-RT`\n : Object.keys(markets).find((k) => k.endsWith(`-${selectedMaturityId}-RT`)))\n : null;\n const rtMarket = rtMarketKey ? markets[rtMarketKey] ?? null : null;\n\n // Bonds program mints RT proportional to remaining issuance window, not\n // 1:1 with the deposit. Use the same formula the on-chain program does\n // so the swap we build matches the user's actual post-deposit RT balance.\n // PT, separately, *is* 1:1 with the stake — keep `parsedAmount` for PT rows.\n const effectiveNowTs = nowTs ?? Date.now() / 1000;\n const rtAmount = maturity\n ? estimateRtFromStake({\n amountSol: parsedAmount,\n maturity,\n nowTs: effectiveNowTs,\n })\n : 0;\n\n // Real liquidity check against RT order book bids\n const liquidityCheck = rtMarket?.bids?.length\n ? checkSellLiquidity(rtMarket.bids, rtAmount)\n : null;\n\n const hasLiquidity = liquidityCheck?.isSufficientLiquidity ?? false;\n const orderBookSlippageBps = liquidityCheck?.slippageBps ?? 0;\n\n // Quote: expected gross SOL from selling RT on Manifest\n const grossSellAmount = liquidityCheck?.expectedFillPrice != null\n ? liquidityCheck.expectedFillPrice * rtAmount\n : rtAmount * (MARKET_RATE / 100); // fallback\n\n // Net-of-fee SOL shown to the user and paid out after treasury transfer\n const sellAmount = applyTradingFee(grossSellAmount);\n const feeAmountSol = grossSellAmount - sellAmount;\n const feePct = (PYE_TRADING_FEE_BPS / 100).toFixed(2);\n\n // Slippage tolerance from slider (0-5 float)\n const slippage = slippageBps / 100;\n\n const isLoading = txStatus === \"loading\";\n const selectedStakeStillOwned =\n selectedStakeAccountPubkey === \"liquid-sol\" ||\n (selectedStakeAccountPubkey !== null &&\n userStakeAccounts.some((a) => a.pubkey === selectedStakeAccountPubkey));\n const canSign =\n !!selectedStakeAccountPubkey &&\n !!selectedMaturityId &&\n !isLoading &&\n hasLiquidity &&\n selectedStakeStillOwned;\n\n // Resolve bond from the stake account's actual validator (not from market key)\n // Fall back to market-key-based resolution for liquid SOL (no stake account)\n const anyMarketKey = !stakeBondLookup\n ? (rtMarketKey ?? (selectedMaturityId ? Object.keys(markets).find((k) => k.endsWith(`-${selectedMaturityId}-PT`)) : null))\n : null;\n const marketBondParams = anyMarketKey ? resolveBondParams(anyMarketKey) : null;\n\n const bondParams = stakeBondLookup\n ? {\n validatorId: stakeBondLookup.validatorId,\n maturityId: selectedMaturityId!,\n bondPubkey: stakeBondLookup.pubkey,\n principalTokenMint: stakeBondLookup.pt_address,\n yieldTokenMint: stakeBondLookup.rt_address,\n voteAccount: stakeVoteAccount!,\n }\n : marketBondParams;\n\n const handleSign = useCallback(async () => {\n if (!selectedStakeAccountPubkey || !selectedMaturityId) return;\n if (!bondParams) throw new Error(\"Could not resolve bond data for this market\");\n if (!rtMarket) throw new Error(\"No RT market found for this maturity\");\n if (!maturity) throw new Error(\"No maturity selected\");\n\n setTxStatus(\"loading\");\n setTxStep(\"depositing\");\n\n // Swap-level minReceive is measured against the gross swap output;\n // the fixed taker fee is transferred from that wSOL post-swap.\n const minReceive = Math.max(grossSellAmount * (1 - slippage / 100), 0);\n\n // Refresh the epoch-synced clock right before signing — the mount-time\n // value can be minutes stale by the time the user clicks, and the chain\n // clock keeps advancing. An out-of-date nowTs overshoots the actual\n // mint by ~1 atom per second of drift, which fails the Manifest swap.\n const freshNowTs = await fetchEpochSyncedNowTs(connection).catch(\n () => Date.now() / 1000,\n );\n const freshRtAmount = estimateRtFromStake({\n amountSol: parsedAmount,\n maturity,\n nowTs: freshNowTs,\n });\n\n try {\n if (selectedStakeAccountPubkey === \"liquid-sol\") {\n // Liquid SOL path — kept as two transactions (SIMD-185: disabled in UI)\n await executeStakeDeposit({\n connection,\n wallet,\n bondPubkey: bondParams.bondPubkey,\n principalTokenMint: bondParams.principalTokenMint,\n yieldTokenMint: bondParams.yieldTokenMint,\n validatorVoteAccount: bondParams.voteAccount,\n amountSol: parsedAmount,\n });\n setTxStep(\"selling\");\n const rtSellResult = await executeRtSell({\n connection,\n wallet,\n marketPubkey: rtMarket.marketPubkey,\n rtMint: bondParams.yieldTokenMint,\n orderSizeTokens: freshRtAmount,\n minReceiveTokens: minReceive,\n expectedSolOut: grossSellAmount,\n });\n setTxStep(\"complete\");\n setSellAmountSol(sellAmount);\n setTxStatus(\"success\", rtSellResult.signature);\n navigate(\"complete\");\n } else {\n // Stake account path — single bundled v0 transaction (requires ALT)\n if (!selectedValidatorAltPubkey) {\n throw new Error(\n \"Sell Yield is not yet enabled for this validator. An Address Lookup Table hasn't been deployed yet — please contact the Pye team.\",\n );\n }\n const result = await executeDepositAndSell({\n connection,\n wallet,\n bondPubkey: bondParams.bondPubkey,\n principalTokenMint: bondParams.principalTokenMint,\n yieldTokenMint: bondParams.yieldTokenMint,\n validatorVoteAccount: bondParams.voteAccount,\n stakeAccountPubkey: selectedStakeAccountPubkey,\n amountSol: parsedAmount,\n rtAmountToSell: freshRtAmount,\n stakeBalanceSol: selectedStakeAccountBalance,\n marketPubkey: rtMarket.marketPubkey,\n minReceiveTokens: minReceive,\n expectedSolOut: grossSellAmount,\n altPubkey: selectedValidatorAltPubkey,\n });\n setTxStep(\"complete\");\n setSellAmountSol(sellAmount);\n setTxStatus(\"success\", result.signature);\n navigate(\"complete\");\n }\n } catch (err) {\n setTxStatus(\n \"error\",\n null,\n err instanceof Error ? err.message : \"Transaction failed\",\n );\n } finally {\n const owner = wallet.publicKey!;\n connection.getBalance(owner, \"confirmed\").then(setBalanceLamports).catch(() => {});\n fetchBalances(connection, owner).then(setWalletBalances).catch(() => {});\n fetchUserStakeAccounts(connection, owner).then(setUserStakeAccounts).catch(() => {});\n }\n }, [\n rtMarket,\n bondParams,\n selectedStakeAccount,\n selectedStakeAccountPubkey,\n selectedMaturityId,\n selectedValidatorAltPubkey,\n connection,\n wallet,\n parsedAmount,\n maturity,\n selectedStakeAccountBalance,\n sellAmount,\n grossSellAmount,\n slippage,\n setTxStatus,\n setTxStep,\n setSellAmountSol,\n navigate,\n setBalanceLamports,\n setWalletBalances,\n setUserStakeAccounts,\n ]);\n\n return (\n <>\n <StepTitle title=\"Approve in your wallet\" />\n\n {/* Quote — stacked sections */}\n {(() => {\n const rows: Array<{ key: string; left: React.ReactNode; right: React.ReactNode }> = [\n {\n key: \"receive\",\n left: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, minWidth: 0 }}>\n <p style={font(14, c.secondary)}>You receive today</p>\n <Tooltip text=\"Estimated upfront payout based on current market rates, net of fees. The final amount is confirmed when your order fills on the Pye orderbook.\" />\n </div>\n ),\n right: (\n <Odometer\n value={`+${formatSolAmount(sellAmount)} SOL`}\n style={{ ...font(15, c.green, 500), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n {\n key: \"stake\",\n left: <p style={font(14, c.secondary)}>Stake amount</p>,\n right: (\n <Odometer\n value={`${parsedAmount} SOL`}\n style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n {\n key: \"pt\",\n left: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, minWidth: 0 }}>\n <p style={font(14, c.secondary)}>PTs you&apos;ll receive</p>\n <Tooltip text=\"Your PT is a token receipt for your staked SOL. At the redeem date, redeem it 1:1 for your full stake.\" />\n </div>\n ),\n right: (\n <Odometer\n value={`${parsedAmount} PT`}\n style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n {\n key: \"redeem\",\n left: <p style={font(14, c.secondary)}>Redeem date</p>,\n right: (\n <p style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0 }}>\n {matures}\n </p>\n ),\n },\n {\n key: \"fee\",\n left: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, minWidth: 0 }}>\n <p style={font(14, c.secondary)}>Pye protocol fee ({feePct}%)</p>\n <Tooltip text={`A ${feePct}% fee is taken from the SOL proceeds of your sale and routed to the Pye treasury.`} />\n </div>\n ),\n right: (\n <Odometer\n value={`−${formatSolAmount(feeAmountSol)} SOL`}\n style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n ...(points ? [{\n key: \"points\",\n left: <p style={font(14, c.secondary)}>Points multiplier</p>,\n right: (\n <p style={{ ...font(14, c.purple), whiteSpace: \"nowrap\", flexShrink: 0 }}>\n {points}\n </p>\n ),\n }] : []),\n ];\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n {rows.map((row, i) => {\n const isFirst = i === 0;\n const isLast = i === rows.length - 1;\n const radius = isFirst && isLast\n ? 8\n : isFirst\n ? \"8px 8px 0 0\"\n : isLast\n ? \"0 0 8px 8px\"\n : 0;\n return (\n <div\n key={row.key}\n style={{\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n borderRadius: radius,\n padding: \"12px 12px\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {row.left}\n {row.right}\n </div>\n );\n })}\n </div>\n );\n })()}\n\n {/* Advanced toggle */}\n <div\n onClick={() => setAdvancedOpen(!advancedOpen)}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n cursor: \"pointer\", padding: \"2px 0\", userSelect: \"none\",\n }}\n >\n <span style={font(14, c.secondary)}>Advanced</span>\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" style={{\n transform: advancedOpen ? \"rotate(180deg)\" : \"none\", transition: \"transform 0.2s\",\n }}>\n <path d=\"M1 1L5 5L9 1\" stroke={c.secondary} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n\n {/* Advanced panel — discount rate (grid-row height transition) */}\n <div style={{\n display: \"grid\",\n gridTemplateRows: advancedOpen ? \"1fr\" : \"0fr\",\n transition: \"grid-template-rows 280ms cubic-bezier(0.2,0.9,0.2,1)\",\n }}>\n <div style={{\n overflow: \"hidden\",\n opacity: advancedOpen ? 1 : 0,\n transition: \"opacity 200ms cubic-bezier(0.2,0.9,0.2,1)\",\n }}>\n <div style={{\n background: c.raised, borderRadius: 8, padding: 12,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n display: \"flex\", flexDirection: \"column\", gap: 16,\n }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <span style={font(14, c.secondary)}>Max slippage tolerance</span>\n <Tooltip bg={c.highlight} text=\"Slippage is the maximum difference between the quoted price and the price you actually receive. A higher tolerance means your order is more likely to fill, but you may receive slightly less SOL.\" />\n </span>\n {orderBookSlippageBps > 0 && (\n <span style={font(14, c.secondary)}>Est. slippage: {(orderBookSlippageBps / 100).toFixed(2)}%</span>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 4 }}>\n <span style={{ ...font(18, c.primary), transition: \"color 0.15s\" }}>\n {slippage.toFixed(2)}\n </span>\n <span style={font(14, c.secondary)}>% max slippage</span>\n </div>\n <DiscountSlider value={slippage} onChange={(v) => setSlippageBps(Math.round(v * 100))} />\n </div>\n </div>\n </div>\n </div>\n\n {/* Liquidity warning */}\n {!hasLiquidity && rtAmount > 0 && (\n <div style={{\n background: \"rgba(255,181,77,0.15)\",\n borderTop: \"1px solid rgba(255,255,255,0.2)\",\n boxShadow: \"inset 0 -1px 0 rgba(0,0,0,0.08)\",\n borderRadius: 6, padding: 12,\n display: \"flex\", flexDirection: \"column\", gap: 2,\n }}>\n <p style={{ ...font(14, c.primary), fontWeight: 500 }}>Insufficient liquidity</p>\n <p style={font(14, c.secondary)}>\n Only {liquidityCheck?.totalAvailableSize?.toFixed(2) ?? \"0\"} RT available on the order book.\n Your order may partially fill or not fill at all.\n </p>\n </div>\n )}\n\n {/* Error */}\n {txStatus === \"error\" && txError && (\n <div style={{\n ...font(14, c.red),\n background: `${c.red}12`,\n borderRadius: 6, padding: \"8px 12px\",\n }}>\n {txError}\n </div>\n )}\n\n <Spacer />\n <CTA\n label={\n isLoading\n ? txStep === \"selling\" ? \"Selling rewards...\"\n : \"Confirming...\"\n : `Sell Rewards — get ${formatSolAmount(sellAmount, 3)} SOL`\n }\n onClick={handleSign}\n disabled={!canSign}\n purple\n />\n </>\n );\n}\n","import { useMemo, useCallback } from \"react\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { useWidgetStore } from \"../../stores/widget-store\";\nimport {\n buildPtLookup,\n maturities,\n validators,\n executeRedeem,\n fetchBalances,\n fetchUserStakeAccounts,\n type ValidatorId,\n type MaturityId,\n type Bond,\n} from \"@pyefi/sdk\";\nimport { useBalanceStore, useWalletStore } from \"@pyefi/sdk/react\";\nimport { Body } from \"../shared/Layout\";\nimport { c, font, formatSolAmount } from \"../design-system\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\ninterface Position {\n ptMint: string;\n validatorId: ValidatorId;\n maturityId: MaturityId;\n bond: Bond;\n ptAmount: number;\n ptAmountLamports: number;\n maturityTimestamp: number;\n maturityLabel: string;\n isMatured: boolean;\n daysLeft: number;\n validatorName: string;\n validatorPtIcon: string;\n}\n\nfunction PositionRow({ position, onRedeem, isRedeeming }: {\n position: Position;\n onRedeem: (p: Position) => void;\n isRedeeming: boolean;\n}) {\n return (\n <div style={{\n display: \"flex\", alignItems: \"center\", gap: 8,\n padding: \"12px 16px\",\n background: c.surface,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n }}>\n <img\n src={position.validatorPtIcon}\n alt={`${position.validatorName} PT`}\n style={{ width: 32, height: 32, borderRadius: 8, flexShrink: 0, objectFit: \"cover\" }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <p style={font(15, c.primary)}>{formatSolAmount(position.ptAmount)} PT</p>\n <p style={font(14, c.secondary)}>{position.validatorName} · {position.maturityLabel}</p>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, flexShrink: 0 }}>\n <p style={{ ...font(14, position.isMatured ? c.green : c.secondary), whiteSpace: \"nowrap\" }}>\n {position.isMatured ? \"Unlocked\" : `${position.daysLeft}d left`}\n </p>\n <button\n className=\"pye-redeem-btn\"\n onClick={position.isMatured && !isRedeeming ? () => onRedeem(position) : undefined}\n disabled={!position.isMatured || isRedeeming}\n style={{\n height: 26, width: 72, borderRadius: 6, border: \"none\",\n padding: \"0 10px\",\n borderTop: `1px solid var(--c-brand-hi)`,\n cursor: !position.isMatured ? \"not-allowed\" : isRedeeming ? \"wait\" : \"pointer\",\n background: c.purple,\n ...font(14, \"var(--c-brand-text)\"),\n boxShadow: `inset 0 -1px 0 var(--c-brand-sh)`,\n transition: \"filter 0.1s\",\n opacity: !position.isMatured ? 0.5 : isRedeeming ? 0.7 : 1,\n whiteSpace: \"nowrap\",\n }}\n >\n {isRedeeming ? \"...\" : \"Redeem\"}\n </button>\n </div>\n </div>\n );\n}\n\nexport default function RedeemList() {\n const { connection } = useConnection();\n const wallet = useWallet();\n const walletBalances = useBalanceStore((s) => s.walletBalances);\n const navigate = useWidgetStore((s) => s.navigate);\n\n const redeemingMint = useWidgetStore((s) => s.redeemingMint);\n const setRedeemingMint = useWidgetStore((s) => s.setRedeemingMint);\n const redeemError = useWidgetStore((s) => s.redeemError);\n const setRedeemError = useWidgetStore((s) => s.setRedeemError);\n const setRedeemAmountSol = useWidgetStore((s) => s.setRedeemAmountSol);\n const setRedeemTxSignature = useWidgetStore((s) => s.setRedeemTxSignature);\n const setWalletBalances = useBalanceStore((s) => s.setWalletBalances);\n const setUserStakeAccounts = useBalanceStore((s) => s.setUserStakeAccounts);\n const setBalanceLamports = useWalletStore((s) => s.setBalanceLamports);\n\n const ptLookup = buildPtLookup();\n\n const positions: Position[] = useMemo(() => {\n const now = Date.now() / 1000;\n const result: Position[] = [];\n for (const [mint, amount] of Object.entries(walletBalances)) {\n if (amount <= 0) continue;\n const entry = ptLookup.get(mint);\n if (!entry) continue;\n const maturity = maturities[entry.maturityId];\n const matTs = Number(maturity.maturity_timestamp);\n const isMatured = now >= matTs;\n const daysLeft = isMatured ? 0 : Math.ceil((matTs * 1000 - Date.now()) / (1000 * 60 * 60 * 24));\n const validator = validators[entry.validatorId];\n result.push({\n ptMint: mint,\n validatorId: entry.validatorId,\n maturityId: entry.maturityId,\n bond: entry.bond,\n ptAmount: amount / LAMPORTS_PER_SOL,\n ptAmountLamports: amount,\n maturityTimestamp: matTs,\n maturityLabel: maturity.human_readable,\n isMatured,\n daysLeft,\n validatorName: validator?.name ?? entry.validatorId,\n validatorPtIcon: validator?.pt_sol ?? \"\",\n });\n }\n result.sort((a, b) => a.maturityTimestamp - b.maturityTimestamp);\n return result;\n }, [walletBalances, ptLookup]);\n\n const handleRedeem = useCallback(async (p: Position) => {\n setRedeemError(null);\n setRedeemingMint(p.ptMint);\n try {\n const { signature } = await executeRedeem({\n connection,\n wallet,\n bondPubkey: p.bond.pubkey,\n principalTokenMint: p.bond.pt_address,\n yieldTokenMint: p.bond.rt_address,\n ptAmountLamports: p.ptAmountLamports,\n rtAmountLamports: 0,\n });\n setRedeemAmountSol(p.ptAmountLamports / LAMPORTS_PER_SOL);\n setRedeemTxSignature(signature);\n navigate(\"redeem-complete\");\n } catch (err) {\n setRedeemError(err instanceof Error ? err.message : \"Redeem failed\");\n } finally {\n setRedeemingMint(null);\n const owner = wallet.publicKey!;\n connection.getBalance(owner, \"confirmed\")\n .then(setBalanceLamports)\n .catch(() => {});\n fetchBalances(connection, owner)\n .then(setWalletBalances)\n .catch(() => {});\n fetchUserStakeAccounts(connection, owner)\n .then(setUserStakeAccounts)\n .catch(() => {});\n }\n }, [connection, wallet, setRedeemError, setRedeemingMint, setRedeemAmountSol, setRedeemTxSignature, navigate, setBalanceLamports, setWalletBalances, setUserStakeAccounts]);\n\n return (\n <Body padding={0} style={{ borderTop: \"none\" }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {redeemError && (\n <div style={{\n padding: \"8px 16px\",\n background: `${c.red}12`,\n ...font(14, c.red),\n }}>\n {redeemError}\n </div>\n )}\n\n {positions.length > 0 ? (\n <div style={{ flex: 1, overflowY: \"auto\", minHeight: 0 }}>\n {positions.map(p => (\n <PositionRow\n key={p.ptMint}\n position={p}\n onRedeem={handleRedeem}\n isRedeeming={redeemingMint === p.ptMint}\n />\n ))}\n </div>\n ) : (\n <div style={{\n flex: 1, display: \"flex\", flexDirection: \"column\",\n alignItems: \"center\", justifyContent: \"center\",\n gap: 6, padding: 24, textAlign: \"center\",\n }}>\n <p style={font(15, c.primary)}>No active positions</p>\n <p style={font(14, c.secondary)}>Sell future rewards to create a position.</p>\n </div>\n )}\n </div>\n </Body>\n );\n}\n","import { useWidgetStore } from \"../../stores/widget-store\";\nimport { maturities } from \"@pyefi/sdk\";\nimport { c, font, formatSolAmount } from \"../design-system\";\nimport { Body, CTA, Tooltip, Spacer, SuccessHeader } from \"../shared/Layout\";\nimport { Odometer } from \"../shared/Odometer\";\n\nexport default function StepComplete() {\n const reset = useWidgetStore((s) => s.reset);\n const txSignature = useWidgetStore((s) => s.txSignature);\n const depositAmount = useWidgetStore((s) => s.depositAmount);\n const selectedMaturityId = useWidgetStore((s) => s.selectedMaturityId);\n const sellAmountSol = useWidgetStore((s) => s.sellAmountSol);\n\n const parsedAmount = parseFloat(depositAmount) || 0;\n const sellAmount = sellAmountSol ?? 0;\n\n // Resolve maturity from real SDK data\n const maturity = selectedMaturityId ? maturities[selectedMaturityId] : null;\n const matures = maturity?.human_readable ?? \"Sep 30, 2026\";\n\n const solscanUrl = txSignature\n ? `https://solscan.io/tx/${txSignature}`\n : \"https://solscan.io\";\n\n return (\n <>\n <SuccessHeader label=\"Transaction confirmed\" onClose={() => reset()} />\n\n <Body>\n <p style={font(14, c.secondary)}>Your future staking rewards have been sold upfront.</p>\n\n {/* Summary — stacked rows matching ReviewQuote layout */}\n {(() => {\n const rows: Array<{ key: string; left: React.ReactNode; right: React.ReactNode }> = [\n {\n key: \"received\",\n left: <p style={font(14, c.secondary)}>Rewards sold upfront</p>,\n right: (\n <Odometer\n value={`+${formatSolAmount(sellAmount)} SOL`}\n style={{ ...font(15, c.green, 500), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n {\n key: \"pt\",\n left: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, minWidth: 0 }}>\n <p style={font(14, c.secondary)}>PT received</p>\n <Tooltip text=\"A PT (Principal Token) is a 1:1 tokenised claim on your staked SOL. It accrues no rewards — those were sold upfront. Redeem it at maturity to get your full stake back.\" />\n </div>\n ),\n right: (\n <Odometer\n value={`+${parsedAmount} PT`}\n style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0, fontVariantNumeric: \"tabular-nums\" }}\n />\n ),\n },\n {\n key: \"stake\",\n left: <p style={font(14, c.secondary)}>Stake returned</p>,\n right: (\n <p style={{ ...font(14, c.primary), whiteSpace: \"nowrap\", flexShrink: 0 }}>\n {matures}\n </p>\n ),\n },\n {\n key: \"tx\",\n left: <p style={font(14, c.secondary)}>Transaction</p>,\n right: (\n <a\n href={solscanUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...font(14, c.purple), textDecoration: \"none\", display: \"flex\", alignItems: \"center\", gap: 4, flexShrink: 0 }}\n >\n Solscan\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7 1h4v4M11 1L5.5 6.5M5 2H2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </a>\n ),\n },\n ];\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n {rows.map((row, i) => {\n const isFirst = i === 0;\n const isLast = i === rows.length - 1;\n const radius = isFirst && isLast\n ? 8\n : isFirst\n ? \"8px 8px 0 0\"\n : isLast\n ? \"0 0 8px 8px\"\n : 0;\n return (\n <div\n key={row.key}\n style={{\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n borderRadius: radius,\n padding: \"12px 12px\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {row.left}\n {row.right}\n </div>\n );\n })}\n </div>\n );\n })()}\n\n {/* Wallet visibility notice */}\n <div style={{\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: 8, padding: 12,\n display: \"flex\", alignItems: \"flex-start\", gap: 10,\n }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0, marginTop: 2 }}>\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke={c.secondary} strokeWidth=\"1.2\"/>\n <path d=\"M8 7.5v3.5M8 5v.5\" stroke={c.secondary} strokeWidth=\"1.4\" strokeLinecap=\"round\"/>\n </svg>\n <p style={font(12, c.secondary)}>\n Your PT tokens may be hidden in your wallet — enable them via <span style={{ color: c.primary }}>Manage Tokens</span> to see your balance.\n </p>\n </div>\n\n <Spacer />\n\n {/* Stay updated */}\n <div style={{\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: 8, padding: 12,\n display: \"flex\", alignItems: \"center\", gap: 12,\n }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <p style={font(14, c.primary)}>Learn more about Pye</p>\n <a href=\"https://docs.pye.fi/how-pye-works\" target=\"_blank\" rel=\"noreferrer\"\n style={{ ...font(11, c.secondary), textDecoration: \"none\", display: \"flex\", alignItems: \"center\", gap: 4 }}>\n Read the docs\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7 1h4v4M11 1L5.5 6.5M5 2H2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </a>\n </div>\n <div style={{ display: \"flex\", gap: 8, flexShrink: 0, alignSelf: \"center\" }}>\n <a href=\"https://t.me/pyefi\" target=\"_blank\" rel=\"noreferrer\"\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", width: 28, height: 28, borderRadius: 8, background: c.highlight, borderTop: `1px solid ${c.highlight}`, boxShadow: `inset 0 -1px 0 ${c.shadow}`, textDecoration: \"none\" }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill={c.secondary}>\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"/>\n </svg>\n </a>\n <a href=\"https://x.com/pyefinance\" target=\"_blank\" rel=\"noreferrer\"\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", width: 28, height: 28, borderRadius: 8, background: c.highlight, borderTop: `1px solid ${c.highlight}`, boxShadow: `inset 0 -1px 0 ${c.shadow}`, textDecoration: \"none\" }}>\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill={c.secondary}>\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.73-8.835L1.254 2.25H8.08l4.253 5.622 5.912-5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/>\n </svg>\n </a>\n </div>\n </div>\n\n <CTA label=\"Sell more rewards\" onClick={() => reset()} />\n </Body>\n </>\n );\n}\n","import { useWidgetStore } from \"../../stores/widget-store\";\nimport { c, font, displayFont, formatSolAmount } from \"../design-system\";\nimport { Body, CTA, Spacer, SuccessHeader } from \"../shared/Layout\";\nimport { Odometer } from \"../shared/Odometer\";\n\nexport default function RedeemComplete() {\n const reset = useWidgetStore((s) => s.reset);\n const redeemAmountSol = useWidgetStore((s) => s.redeemAmountSol);\n const redeemTxSignature = useWidgetStore((s) => s.redeemTxSignature);\n\n const amount = redeemAmountSol ?? 12.5; // fallback for dev preview\n\n const solscanUrl = redeemTxSignature\n ? `https://solscan.io/tx/${redeemTxSignature}`\n : \"https://solscan.io\";\n\n return (\n <>\n <SuccessHeader label=\"Redeem confirmed\" onClose={() => reset()} />\n\n <Body>\n <p style={font(14, c.secondary)}>Your staked SOL has been returned to your wallet.</p>\n\n {/* Amount received */}\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <div style={{\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n borderRadius: \"8px 8px 0 0\",\n padding: 12,\n display: \"flex\", flexDirection: \"column\", gap: 12,\n }}>\n <p style={font(14, c.secondary)}>Staked SOL returned</p>\n <Odometer\n value={`${formatSolAmount(amount)} SOL`}\n style={{ ...displayFont(32, c.green), lineHeight: 1.2 }}\n />\n </div>\n {/* Solscan link row */}\n <div style={{\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n borderRadius: \"0 0 8px 8px\",\n padding: 12,\n display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\",\n }}>\n <p style={font(14, c.secondary)}>Received as a stake account</p>\n <a\n href={solscanUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...font(14, c.purple), textDecoration: \"none\", display: \"flex\", alignItems: \"center\", gap: 4 }}\n >\n Solscan\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7 1h4v4M11 1L5.5 6.5M5 2H2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </a>\n </div>\n </div>\n\n {/* Educational: what to do next */}\n <div style={{\n background: c.raised,\n borderTop: `1px solid ${c.highlight}`,\n boxShadow: `inset 0 -1px 0 ${c.shadow}`,\n borderRadius: 8, padding: 12,\n display: \"flex\", flexDirection: \"column\", gap: 12,\n }}>\n <p style={font(14, c.primary)}>\n <strong style={{ fontWeight: 600 }}>What to do next</strong>\n </p>\n <p style={font(14, c.secondary)}>\n Two more steps to make it liquid.\n </p>\n\n {/* Step 1 */}\n <div style={{ display: \"flex\", gap: 10 }}>\n <div style={{\n width: 20, height: 20, borderRadius: \"50%\", flexShrink: 0,\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n ...font(11, c.secondary),\n }}>\n 1\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <p style={font(14, c.primary)}>Deactivate the stake account</p>\n <p style={font(11, c.secondary)}>\n Deactivate in your wallet app. Takes ~1 epoch (~2 days).\n </p>\n </div>\n </div>\n\n {/* Step 2 */}\n <div style={{ display: \"flex\", gap: 10 }}>\n <div style={{\n width: 20, height: 20, borderRadius: \"50%\", flexShrink: 0,\n background: c.lowered,\n borderTop: `1px solid ${c.shadow}`,\n boxShadow: `inset 0 -1px 0 ${c.highlight}`,\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n ...font(11, c.secondary),\n }}>\n 2\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <p style={font(14, c.primary)}>Withdraw to liquid SOL</p>\n <p style={font(11, c.secondary)}>\n Once deactivated, withdraw to get liquid SOL.\n </p>\n </div>\n </div>\n </div>\n\n <Spacer />\n\n <CTA label=\"Done\" onClick={() => reset()} />\n </Body>\n </>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useWalletStore } from \"@pyefi/sdk/react\";\nimport { useWidgetStore, type WidgetScreen } from \"../stores/widget-store\";\nimport { Widget, Body, Footer, StepHeader } from \"./shared/Layout\";\nimport WelcomeScreen from \"./screens/WelcomeScreen\";\nimport ConnectWallet from \"./screens/ConnectWallet\";\nimport YieldForwardIntro from \"./screens/YieldForwardIntro\";\nimport SelectPosition from \"./screens/SelectPosition\";\nimport ChooseAmount from \"./screens/ChooseAmount\";\nimport ChooseDuration from \"./screens/ChooseDuration\";\nimport ReviewQuote from \"./screens/ReviewQuote\";\nimport RedeemList from \"./screens/RedeemList\";\nimport StepComplete from \"./screens/StepComplete\";\nimport RedeemComplete from \"./screens/RedeemComplete\";\n\ninterface WidgetShellProps {\n validatorName?: string;\n}\n\nconst STEP_CONFIG: Partial<Record<WidgetScreen, { step: number; total: number }>> = {\n \"select-position\": { step: 1, total: 4 },\n \"choose-amount\": { step: 2, total: 4 },\n \"choose-duration\": { step: 3, total: 4 },\n \"review-quote\": { step: 4, total: 4 },\n};\n\nconst REDEEM_TOOLTIP =\n \"Each PT (Principal Token) is a 1:1 tokenised claim on your staked SOL. It accrues no rewards — those were sold upfront. Redeem at maturity to receive your full SOL stake back.\";\n\nfunction HeaderlessShell({ screen, children }: { screen: WidgetScreen; children: React.ReactNode }) {\n return (\n <Widget>\n <Body style={{ borderRadius: \"10px 10px 0 0\", borderTop: \"none\" }}>\n <div key={screen} className=\"pye-step-in\">{children}</div>\n </Body>\n <Footer />\n </Widget>\n );\n}\n\nexport default function WidgetShell({ validatorName }: WidgetShellProps) {\n const screen = useWidgetStore((s) => s.screen);\n const goBack = useWidgetStore((s) => s.goBack);\n const reset = useWidgetStore((s) => s.reset);\n const navigate = useWidgetStore((s) => s.navigate);\n const walletPublicKey = useWalletStore((s) => s.publicKey);\n const walletStatus = useWalletStore((s) => s.status);\n const prevWalletRef = useRef<string | null>(null);\n\n useEffect(() => {\n const connected = walletStatus === \"connected\";\n const atIntro = screen === \"yield-forward-intro\" || screen === \"connect-wallet\";\n\n if (connected && atIntro) {\n navigate(\"welcome\");\n } else if (!connected && !atIntro) {\n reset();\n }\n }, [walletStatus, screen, navigate, reset]);\n\n // Reset mid-flow if the connected wallet changes\n useEffect(() => {\n if (!walletPublicKey) {\n prevWalletRef.current = null;\n return;\n }\n if (prevWalletRef.current && prevWalletRef.current !== walletPublicKey) {\n reset();\n navigate(\"welcome\");\n }\n prevWalletRef.current = walletPublicKey;\n }, [walletPublicKey, reset, navigate]);\n\n if (screen === \"complete\") {\n return <Widget><StepComplete /><Footer /></Widget>;\n }\n\n if (screen === \"redeem-complete\") {\n return <Widget><RedeemComplete /><Footer /></Widget>;\n }\n\n if (screen === \"welcome\") {\n return <Widget><WelcomeScreen validatorName={validatorName} /><Footer /></Widget>;\n }\n\n if (screen === \"yield-forward-intro\") {\n return <HeaderlessShell screen={screen}><YieldForwardIntro /></HeaderlessShell>;\n }\n\n if (screen === \"connect-wallet\") {\n return <HeaderlessShell screen={screen}><ConnectWallet /></HeaderlessShell>;\n }\n\n if (screen === \"redeem-list\") {\n return (\n <Widget>\n <StepHeader hideStep label=\"Your positions\" tooltipText={REDEEM_TOOLTIP} onBack={goBack} />\n <RedeemList />\n <Footer />\n </Widget>\n );\n }\n\n const config = STEP_CONFIG[screen];\n\n return (\n <Widget>\n <StepHeader\n step={config?.step}\n total={config?.total}\n hideStep={!config?.step}\n onBack={goBack}\n />\n <Body>\n <div key={screen} className=\"pye-step-in\">\n {screen === \"select-position\" && <SelectPosition />}\n {screen === \"choose-amount\" && <ChooseAmount />}\n {screen === \"choose-duration\" && <ChooseDuration />}\n {screen === \"review-quote\" && <ReviewQuote />}\n </div>\n </Body>\n <Footer />\n </Widget>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useWalletStore } from \"@pyefi/sdk/react\";\nimport { useWidgetStore } from \"../stores/widget-store\";\n\n/**\n * Watches the connected wallet's publicKey and resets widget-store selection\n * state whenever the user switches accounts in their wallet (e.g. Phantom).\n * Without this, selectedStakeAccountPubkey / depositAmount / validator data\n * from the previous wallet persist and block the Sell Future Rewards flow.\n */\nexport default function WalletChangeWatcher() {\n const publicKey = useWalletStore((s) => s.publicKey);\n const resetForWalletChange = useWidgetStore((s) => s.resetForWalletChange);\n const prev = useRef<string | null>(null);\n\n useEffect(() => {\n const current = publicKey ? String(publicKey) : null;\n if (prev.current !== null && prev.current !== current) {\n resetForWalletChange();\n }\n prev.current = current;\n }, [publicKey, resetForWalletChange]);\n\n return null;\n}\n","import { useRef, useMemo } from \"react\";\nimport {\n ConnectionProvider,\n WalletProvider,\n} from \"@solana/wallet-adapter-react\";\nimport {\n PhantomWalletAdapter,\n SolflareWalletAdapter,\n TorusWalletAdapter,\n LedgerWalletAdapter,\n WalletConnectWalletAdapter,\n} from \"@solana/wallet-adapter-wallets\";\nimport { WalletAdapterNetwork } from \"@solana/wallet-adapter-base\";\n\nconst WALLET_CONNECT_PROJECT_ID = \"7b89b9d2ef5d0298961c3eeb879793b0\";\nimport { configurePyeSDK, validators } from \"@pyefi/sdk\";\nimport {\n PyeSDKProvider,\n WalletSyncer,\n BalanceSyncer,\n MarketSyncer,\n ApySyncer,\n} from \"@pyefi/sdk/react\";\nimport {\n createWidgetStore,\n WidgetStoreContext,\n} from \"./stores/widget-store\";\nimport { THEME_CSS } from \"./components/design-system\";\nimport WidgetShell from \"./components/WidgetShell\";\nimport WalletChangeWatcher from \"./components/WalletChangeWatcher\";\nimport type { PyeWidgetProps } from \"./types\";\n\nfunction resolveValidatorName(voteAccount?: string): string | undefined {\n if (!voteAccount) return undefined;\n for (const v of Object.values(validators)) {\n if (v.vote_account === voteAccount) return v.name;\n }\n return undefined;\n}\n\nexport default function PyeWidget({\n rpcUrl,\n supabaseUrl,\n supabaseAnonKey,\n voteAccount,\n theme = \"pye-light\",\n onClose,\n}: PyeWidgetProps) {\n const configuredRef = useRef(false);\n if (!configuredRef.current) {\n configurePyeSDK({ rpcUrl, supabaseUrl, supabaseAnonKey, voteAccount });\n configuredRef.current = true;\n }\n\n const validatorName = useMemo(() => resolveValidatorName(voteAccount), [voteAccount]);\n\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new SolflareWalletAdapter(),\n new TorusWalletAdapter(),\n new LedgerWalletAdapter(),\n new WalletConnectWalletAdapter({\n network: WalletAdapterNetwork.Mainnet,\n options: {\n projectId: WALLET_CONNECT_PROJECT_ID,\n metadata: {\n name: \"Pye\",\n description: \"Earn staking rewards upfront\",\n url: \"https://pye.fi\",\n icons: [\"https://pye.fi/icon.png\"],\n },\n },\n }),\n ],\n [],\n );\n\n const widgetStoreRef = useRef<ReturnType<typeof createWidgetStore>>(undefined);\n if (!widgetStoreRef.current) {\n widgetStoreRef.current = createWidgetStore();\n }\n\n return (\n <div data-theme={theme}>\n <style>{THEME_CSS}</style>\n <ConnectionProvider endpoint={rpcUrl}>\n <WalletProvider wallets={wallets} autoConnect>\n <PyeSDKProvider>\n <WalletSyncer />\n <BalanceSyncer />\n <MarketSyncer />\n <ApySyncer />\n <WidgetStoreContext.Provider value={widgetStoreRef.current}>\n <WalletChangeWatcher />\n <WidgetShell validatorName={validatorName} />\n </WidgetStoreContext.Provider>\n </PyeSDKProvider>\n </WalletProvider>\n </ConnectionProvider>\n </div>\n );\n}\n"],"names":["initialState","createWidgetStore","createStore","immer","set","screen","s","prev","pubkey","balance","validatorName","validatorIcon","validatorVoteAccount","validatorAltPubkey","amount","id","open","bps","mint","error","sig","step","status","signature","WidgetStoreContext","createContext","useWidgetStore","selector","store","useContext","useStore","c","THEME_CSS","DISPLAY_FONT","font","size","color","weight","displayFont","MARKET_RATE","formatSolAmount","value","minDecimals","digits","POINTS_ENABLED","phantomLogo","backpackLogo","metamaskLogo","PyeWordmark","jsx","jsxs","WalletDot","name","logos","bg","logo","Widget","children","Body","padding","style","Spacer","StepHeader","total","onBack","hideStep","label","tooltipText","hasProgress","pct","backButton","Tooltip","StepTitle","title","subtitle","text","position","fill","isBelow","triggerRef","useRef","coords","setCoords","useState","handleEnter","el","rect","popup","createPortal","RowGroup","SelectableRow","icon","sub","selected","onClick","shadow","SkeletonRow","CTA","disabled","purple","SuccessHeader","onClose","Footer","InlineError","message","LAMPORTS_PER_SOL","ChoiceRow","subColor","WalletSwitcher","address","onSwitch","truncated","IconRedeem","IconDocs","IconSell","WelcomeScreen","navigate","walletBalances","useBalanceStore","userStakeAccounts","userStakeAccountsLoading","walletPublicKey","useWalletStore","disconnect","useWallet","ptLookup","buildPtLookup","totalPtSol","maturedPtSol","useMemo","now","matured","entry","sol","matTs","maturities","activeStakeSol","lamports","acc","canRedeem","canSell","hasAnyBalance","v","isInitialLoading","redeemSub","sellSub","Fragment","WalletRow","iconUrl","connecting","onConnect","isConnecting","isDimmed","ConnectWallet","wallets","wallet","select","walletStatus","useEffect","connectingName","sortedWallets","w","a","b","aDetected","bDetected","handleConnect","FALLBACK_APY","EXAMPLE_SOL","YieldForwardIntro","isConnected","markets","useMarketStore","apyByVoteAccount","useApyStore","apy","config","getPyeConfig","values","sellToday","holdToUnlock","maturityLabel","bestBid","key","market","nowS","yearsToMaturity","hold","SelectPosition","selectStakeAccount","activeAccounts","handleSelectStake","account","e","img","SLIDER_CSS","ChooseAmount","depositAmount","setDepositAmount","selectedBalance","selectedPubkey","available","parsed","pcts","rafRef","truncate4","rampToAmount","target","start","_a","duration","startTime","ease","t","lastWritten","tick","isLiquidSol","GAS_RESERVE","warning","isValid","sliderMax","sliderValue","sliderPct","stepSize","availableLabel","p","DIGITS","Odometer","stagger","reducedMotion","chars","digitIdx","ch","i","delay","DigitColumn","digit","setTarget","raf","n","QUARTER_INFO","ALL_MATURITIES","TWO_DAYS_S","getAvailableMaturities","ChooseDuration","connection","useConnection","selectedMaturityId","setSelectedMaturity","selectedValidatorVoteAccount","nowTs","setNowTs","fetchEpochSyncedNowTs","availableMaturities","stakeValidatorId","matId","lookup","lookupBondByVoteAccount","parsedAmount","effectiveNowTs","quarters","info","rtMarketKey","k","rtMarket","maturity","estimatedRt","estimateRtFromStake","maturityTs","yearsRemaining","grossYield","netYield","applyTradingFee","feePct","PYE_TRADING_FEE_BPS","sel","q","isSelected","DiscountSlider","onChange","trackRef","MIN","MAX","computeValue","clientX","x","raw","handlePointerDown","handlePointerMove","filledColor","l","resolveBondParams","marketKey","parts","maturityId","validatorId","bond","allowedLockups","validator","validators","ReviewQuote","txStatus","txStep","txError","setTxStatus","setTxStep","setSellAmountSol","advancedOpen","setAdvancedOpen","slippageBps","setSlippageBps","selectedStakeAccountPubkey","selectedStakeAccountBalance","selectedValidatorAltPubkey","setWalletBalances","setUserStakeAccounts","setBalanceLamports","matures","selectedStakeAccount","stakeVoteAccount","stakeBondLookup","rtAmount","liquidityCheck","checkSellLiquidity","hasLiquidity","orderBookSlippageBps","grossSellAmount","sellAmount","feeAmountSol","slippage","isLoading","selectedStakeStillOwned","canSign","anyMarketKey","marketBondParams","bondParams","handleSign","useCallback","minReceive","freshNowTs","freshRtAmount","executeStakeDeposit","rtSellResult","executeRtSell","result","executeDepositAndSell","err","owner","fetchBalances","fetchUserStakeAccounts","rows","row","isFirst","isLast","radius","_b","PositionRow","onRedeem","isRedeeming","RedeemList","redeemingMint","setRedeemingMint","redeemError","setRedeemError","setRedeemAmountSol","setRedeemTxSignature","positions","isMatured","daysLeft","handleRedeem","executeRedeem","StepComplete","reset","txSignature","sellAmountSol","solscanUrl","RedeemComplete","redeemAmountSol","redeemTxSignature","STEP_CONFIG","REDEEM_TOOLTIP","HeaderlessShell","WidgetShell","goBack","prevWalletRef","connected","atIntro","WalletChangeWatcher","publicKey","resetForWalletChange","current","WALLET_CONNECT_PROJECT_ID","resolveValidatorName","voteAccount","PyeWidget","rpcUrl","supabaseUrl","supabaseAnonKey","theme","configuredRef","configurePyeSDK","PhantomWalletAdapter","SolflareWalletAdapter","TorusWalletAdapter","LedgerWalletAdapter","WalletConnectWalletAdapter","WalletAdapterNetwork","widgetStoreRef","ConnectionProvider","WalletProvider","PyeSDKProvider","WalletSyncer","BalanceSyncer","MarketSyncer","ApySyncer"],"mappings":"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"}