diff --git a/.cursor/rules/cursor-rules.mdc b/.cursor/rules/cursor-rules.mdc new file mode 100644 index 000000000..7dfae3de0 --- /dev/null +++ b/.cursor/rules/cursor-rules.mdc @@ -0,0 +1,53 @@ +--- +description: Guidelines for creating and maintaining Cursor rules to ensure consistency and effectiveness. +globs: .cursor/rules/*.mdc +alwaysApply: true +--- + +- **Required Rule Structure:** + ```markdown + --- + description: Clear, one-line description of what the rule enforces + globs: path/to/files/*.ext, other/path/**/* + alwaysApply: boolean + --- + + - **Main Points in Bold** + - Sub-points with details + - Examples and explanations + ``` + +- **File References:** + - Use `[filename](mdc:path/to/file)` ([filename](mdc:filename)) to reference files + - Example: [prisma.mdc](mdc:.cursor/rules/prisma.mdc) for rule references + - Example: [schema.prisma](mdc:prisma/schema.prisma) for code references + +- **Code Examples:** + - Use language-specific code blocks + ```typescript + // ✅ DO: Show good examples + const goodExample = true; + + // ❌ DON'T: Show anti-patterns + const badExample = false; + ``` + +- **Rule Content Guidelines:** + - Start with high-level overview + - Include specific, actionable requirements + - Show examples of correct implementation + - Reference existing code when possible + - Keep rules DRY by referencing other rules + +- **Rule Maintenance:** + - Update rules when new patterns emerge + - Add examples from actual codebase + - Remove outdated patterns + - Cross-reference related rules + +- **Best Practices:** + - Use bullet points for clarity + - Keep descriptions concise + - Include both DO and DON'T examples + - Reference actual code over theoretical examples + - Use consistent formatting across rules \ No newline at end of file diff --git a/.cursor/rules/frontend-app.mdc b/.cursor/rules/frontend-app.mdc new file mode 100644 index 000000000..fa04ca9f3 --- /dev/null +++ b/.cursor/rules/frontend-app.mdc @@ -0,0 +1,37 @@ +--- +description: Match existing React/TypeScript and formatting style used in frontend/app +globs: frontend/app/**/*.{ts,tsx,js,jsx} +alwaysApply: true +--- + +- **General TypeScript / imports** + - Use TypeScript with explicit types on public APIs and utility functions where it adds clarity; allow inference for simple component return types. + - Prefer `export function Name()` for components and utilities; use `export default function` for Next.js `page.tsx`/`layout.tsx`. + - Use **named imports** grouped and ordered: framework/libs (`react`, `next/*`), then aliased app imports (`@/src/...`, `@/styled-system/...`), then relative imports (`./Something`). + - Use **double quotes** for imports and strings in TS/TSX, and **semicolons** consistently. + - Prefer narrow types: literal template types for addresses (e.g. `` `0x${string}` ``) and specific maps (`Record`, `{ [symbol: string]: Vault }`). + +- **React components** + - For client components, start with `"use client";` on the first line when hooks or browser APIs are used. + - Declare props inline for small components: `export function Comp({ x }: { x: string }) { ... }`; use separate interfaces/types only when props are reused or complex. + - Place hooks at the top of the component in a logical order: data/config hooks, then price/balance hooks, then modal/router hooks. + - Keep JSX **return blocks compact and declarative**: minimal logic in JSX; derive values above and pass them down as props. + - Use descriptive, PascalCase component and screen names (`VaultPoolScreen`, `AppLayout`, `MobileScreen`). + +- **JSX & styling** + - Use `className={css({ ... })}` for styling with JS object syntax and camelCased CSS keys; keep style objects relatively flat and readable. + - When JSX props span multiple lines, format one prop per line and end the prop list with a trailing comma where allowed. + - Prefer semantic, readable JSX structure: outer layout wrapper(s), then main content, then panels/cards/sections; avoid deeply nested inline logic. + - For long JSX blocks (e.g. cards, panels), pass callbacks and configuration via props instead of inlining large chunks of logic inside the component. + +- **Utilities & data structures** + - Implement utilities as pure functions in `utils`-style modules with clear naming (`debounce`, `roundToDecimal`, `jsonStringifyWithBigInt`, `bigIntAbs`). + - Use small, focused helpers for domain operations (e.g. `getAllVaults` that returns `{ vaults, vaultAssets, vaultsArray }`) rather than mixing data derivation with rendering. + - Prefer `type` aliases for structured data (`Vault`, `Token`, `AppChainConfig`) and maps (`VaultMap`, `TokenMap`) and keep them grouped at the top of config files. + +- **Formatting & readability** + - Use 2-space indentation, trailing commas in multiline argument/prop lists and object literals, and break long expressions across lines for clarity. + - Keep comments minimal and purposeful (e.g. short behavioral notes like `// switch to mainnet if it's a bvUSD vault`), not redundant with the code. + - Keep files focused: screens/components in `screens` directories, layout in `AppLayout`, configuration in `config`/`env`, and services in `services`. + +I’ll follow this rule set for any future edits or new code under `frontend/app` so that my changes match the existing style and conventions. \ No newline at end of file diff --git a/.cursor/rules/self-improve.mdc b/.cursor/rules/self-improve.mdc new file mode 100644 index 000000000..701f3ec48 --- /dev/null +++ b/.cursor/rules/self-improve.mdc @@ -0,0 +1,72 @@ +--- +description: Guidelines for continuously improving Cursor rules based on emerging code patterns and best practices. +globs: **/* +alwaysApply: true +--- + +- **Rule Improvement Triggers:** + - New code patterns not covered by existing rules + - Repeated similar implementations across files + - Common error patterns that could be prevented + - New libraries or tools being used consistently + - Emerging best practices in the codebase + +- **Analysis Process:** + - Compare new code with existing rules + - Identify patterns that should be standardized + - Look for references to external documentation + - Check for consistent error handling patterns + - Monitor test patterns and coverage + +- **Rule Updates:** + - **Add New Rules When:** + - A new technology/pattern is used in 3+ files + - Common bugs could be prevented by a rule + - Code reviews repeatedly mention the same feedback + - New security or performance patterns emerge + + - **Modify Existing Rules When:** + - Better examples exist in the codebase + - Additional edge cases are discovered + - Related rules have been updated + - Implementation details have changed + +- **Example Pattern Recognition:** + ```typescript + // If you see repeated patterns like: + const data = await prisma.user.findMany({ + select: { id: true, email: true }, + where: { status: 'ACTIVE' } + }); + + // Consider adding to [prisma.mdc](mdc:.cursor/rules/prisma.mdc): + // - Standard select fields + // - Common where conditions + // - Performance optimization patterns + ``` + +- **Rule Quality Checks:** + - Rules should be actionable and specific + - Examples should come from actual code + - References should be up to date + - Patterns should be consistently enforced + +- **Continuous Improvement:** + - Monitor code review comments + - Track common development questions + - Update rules after major refactors + - Add links to relevant documentation + - Cross-reference related rules + +- **Rule Deprecation:** + - Mark outdated patterns as deprecated + - Remove rules that no longer apply + - Update references to deprecated rules + - Document migration paths for old patterns + +- **Documentation Updates:** + - Keep examples synchronized with code + - Update references to external docs + - Maintain links between related rules + - Document breaking changes +Follow [cursor_rules.mdc](mdc:.cursor/rules/cursor_rules.mdc) for proper rule formatting and structure. \ No newline at end of file diff --git a/frontend/app/package.json b/frontend/app/package.json index 47717dffe..fa84cdab5 100644 --- a/frontend/app/package.json +++ b/frontend/app/package.json @@ -38,6 +38,7 @@ "next": "^14.2.23", "react": "18.3.1", "react-dom": "18.3.1", + "react-markdown": "^10.1.0", "recharts": "^2.15.2", "sharp": "^0.33.5", "ts-pattern": "^5.6.0", diff --git a/frontend/app/src/bitvault-utils.ts b/frontend/app/src/bitvault-utils.ts index e5cccba23..55ed84a1e 100644 --- a/frontend/app/src/bitvault-utils.ts +++ b/frontend/app/src/bitvault-utils.ts @@ -57,8 +57,8 @@ export function useVault({ chainId, vaultAddress, vaultSymbol}: { chainId: numbe : dnZero return { - apr7d: vaultSymbol !== "sbvUSD" ? 0 : dnumOrNull(Number(stats.sbvUSD[0].apy7d) / 100, 4), - apr30d: vaultSymbol !== "sbvUSD" ? 0 : dnumOrNull(Number(stats.sbvUSD[0].apy30d) / 100, 4), + apr7d: vaultSymbol !== "sbvUSD" ? DNUM_0 : dnumOrNull(Number(stats.sbvUSD[0].apy7d) / 100, 4), + apr30d: vaultSymbol !== "sbvUSD" ? DNUM_0 : dnumOrNull(Number(stats.sbvUSD[0].apy30d) / 100, 4), collateral, totalDeposited: totalAssets, price: totalSupply > dnZero && totalAssets > dnZero ? dn.div(totalAssets, totalSupply, decimals) : dnOne, diff --git a/frontend/app/src/comps/AppLayout/AccountButton.tsx b/frontend/app/src/comps/AppLayout/AccountButton.tsx index 5d72f5f61..58e4aa261 100644 --- a/frontend/app/src/comps/AppLayout/AccountButton.tsx +++ b/frontend/app/src/comps/AppLayout/AccountButton.tsx @@ -10,7 +10,7 @@ import { match, P } from "ts-pattern"; import { MenuItem } from "./MenuItem"; import { supportedChainIcons } from "@/src/config/chains"; -export function AccountButton({ size = "small" }: { size?: "small" | "mini" }) { +export function AccountButton({ size = "mini" }: { size?: "small" | "mini" }) { return ( diff --git a/frontend/app/src/comps/AppLayout/AppLayout.tsx b/frontend/app/src/comps/AppLayout/AppLayout.tsx index f09795a28..786d57165 100644 --- a/frontend/app/src/comps/AppLayout/AppLayout.tsx +++ b/frontend/app/src/comps/AppLayout/AppLayout.tsx @@ -51,21 +51,21 @@ export function AppLayout({
{children} @@ -73,8 +73,6 @@ export function AppLayout({
- -
); } @@ -106,13 +104,11 @@ function MobileScreen() { gap: 16, width: "90%", height: "48px", - margin: "16px auto", + margin: "0px auto", padding: "0 16px", fontSize: 16, fontWeight: 500, - background: "fieldSurface", - border: "1px solid token(colors.fieldBorder)", - borderRadius: 16, + borderBottom: "1px solid token(colors.fieldBorder)", })} > }, + { label: "Telegram", href: "https://t.me/bitvaultann", icon: }, +]; export function BottomBar() { - const account = useAccount(); const liquityStats = useLiquityStats(); + const btcTvl = liquityStats.data?.btcTVL ? Number(liquityStats.data.btcTVL) : undefined; return ( -
- {/* */} +
+ + + Bitcoin TVL + + +
+
- - - bvUSD TVL{" "} - - {liquityStats.data && ( - - )} - - - - - Bitcoin TVL{" "} - - {liquityStats.data && ( - - )} - - - - {DISPLAYED_PRICES.map((symbol) => ( - - ))} - {account.address && ACCOUNT_SCREEN && ( - - - - - {shortenAddress(account.address, 3)} - - } +
+ +
+ {SOCIAL_LINKS.map((social) => ( + + ))} +
+
+ +
+ {FOOTER_LINKS.map((section) => ( +
+
- - )} - {/* - - - Redeem bvUSD - - } - className={css({ - color: "content", - borderRadius: 4, - _focusVisible: { - outline: "2px solid token(colors.focused)", - }, - _active: { - translate: "0 1px", - }, - })} - /> - */} - + > + {section.title} +
+
+ {section.links.map((link) => ( + + {link.label} + + ))} +
+
+ ))} +
+ + + Back to Top + + + } + onClick={() => window.scrollTo({ top: 0, behavior: "smooth" })} + className={css({ + color: "#71717a", + fontSize: 14, + padding: 0, + transition: "color 0.15s", + _hover: { color: "#f39c12" }, + _focusVisible: { outline: "2px solid token(colors.focused)" }, + })} + />
-
-
- ); -} -function Price({ symbol }: { symbol: TokenSymbol }) { - const price = usePrice(symbol); - return ( - - - - {symbol} - - - + + +
+
+

+ Important Notice: This product is + intended for sophisticated and professional investors only. This does not constitute + investment, financial, legal, or tax advice. Past performance is not indicative of + future results. Capital at risk — you may lose some or all of your investment. Your + investment is not protected by any government deposit insurance scheme. Not available to + U.S. persons or residents of restricted jurisdictions. BV Labs Ltd. is incorporated in + the British Virgin Islands. +

+

© 2026 BV Labs Ltd. All rights reserved.

+
+
+ ); } -function BuildInfo() { - const about = useAbout(); +function SocialLink({ href, label, icon }: { href: string; label: string; icon: ReactNode }) { return ( -
- { - about.openModal(); - }} - className={css({ - color: "dimmed", - })} - style={{ - fontSize: 12, - }} - /> -
+ {icon} + + ); +} + +function XIcon() { + return ( + + ); +} + +function TelegramIcon() { + return ( + + ); +} + +function ArrowUpIcon() { + return ( + ); } diff --git a/frontend/app/src/comps/AppLayout/Menu.tsx b/frontend/app/src/comps/AppLayout/Menu.tsx index 4d838a62d..734e80a0b 100644 --- a/frontend/app/src/comps/AppLayout/Menu.tsx +++ b/frontend/app/src/comps/AppLayout/Menu.tsx @@ -23,7 +23,7 @@ export function Menu({ position: "relative", zIndex: 2, display: "flex", - gap: 8, + gap: 16, height: "100%", })} > @@ -36,7 +36,6 @@ export function Menu({ className={css({ display: "flex", height: "100%", - padding: "0 8px", _active: { translate: "0 1px", }, diff --git a/frontend/app/src/comps/AppLayout/TopBar.tsx b/frontend/app/src/comps/AppLayout/TopBar.tsx index bc8699a5b..d694940bc 100644 --- a/frontend/app/src/comps/AppLayout/TopBar.tsx +++ b/frontend/app/src/comps/AppLayout/TopBar.tsx @@ -2,119 +2,107 @@ import type { ComponentProps } from "react"; -import { Logo } from "@/src/comps/Logo/Logo"; -import { Tag } from "@/src/comps/Tag/Tag"; import content from "@/src/content"; -import { DEPLOYMENT_FLAVOR } from "@/src/env"; import { css } from "@/styled-system/css"; -import { IconBorrow, IconDashboard, IconEarn } from "@liquity2/uikit"; +import { IconEarn } from "@liquity2/uikit"; import Link from "next/link"; import { AccountButton } from "./AccountButton"; import { Menu } from "./Menu"; import { TopBarLogo } from "@/src/comps/Logo/TopBarLogo"; const menuItems: ComponentProps["menuItems"] = [ - [content.menu.earn, "/earn", IconEarn], [content.menu.buy, "/buy", IconEarn], - [content.menu.points, "/points", IconEarn], - [content.menu.portfolio, "/account", IconDashboard], - [content.menu.vaults, "/vaults", IconEarn], - [content.menu.dashboard, "/dashboard", IconEarn], ]; export function TopBar() { return ( -
- -
- -
-
- {DEPLOYMENT_FLAVOR && ( +
+
+ +
+
- - {DEPLOYMENT_FLAVOR} -
- )} + +
+ +
+
+ +
- - +
- +
-
+ ); } diff --git a/frontend/app/src/comps/Field/Field.tsx b/frontend/app/src/comps/Field/Field.tsx index c169f3ae8..aad03fe46 100644 --- a/frontend/app/src/comps/Field/Field.tsx +++ b/frontend/app/src/comps/Field/Field.tsx @@ -43,12 +43,12 @@ export function Field({ className={css({ display: "flex", flexDirection: "column", - gap: 8, })} >
{label} diff --git a/frontend/app/src/comps/ProductCard/ProductCard.tsx b/frontend/app/src/comps/ProductCard/ProductCard.tsx index 073219fb9..3f61aa3cb 100644 --- a/frontend/app/src/comps/ProductCard/ProductCard.tsx +++ b/frontend/app/src/comps/ProductCard/ProductCard.tsx @@ -8,33 +8,41 @@ import { useState } from "react"; import { ProductCardGroup } from "./ProductCardGroup"; export function ProductCard({ + path, + onClick, + headerTitle, + headerChildren, + headerDirection = "row", children, hint, - icon, - path, - tag, - title, + borderOverride, + disableHover, }: { + path?: string; + onClick?: () => void; + headerTitle: ReactNode; + headerChildren?: ReactNode; + headerDirection?: "row" | "column"; children?: ReactNode; hint?: ReactNode; - icon: ReactNode; - path: string; - tag?: ReactNode; - title: ReactNode; + borderOverride?: "green"; + disableHover?: boolean; }) { const [hovered, setHovered] = useState(false); const [active, setActive] = useState(false); const hoverSpring = useSpring({ - progress: hovered ? 1 : 0, + progress: disableHover ? 0 : (hovered ? 1 : 0), transform: active ? "scale(1)" - : hovered - ? "scale(1.01)" - : "scale(1)", - boxShadow: hovered && !active - ? "0 2px 4px rgba(0, 0, 0, 0.1)" - : "0 2px 4px rgba(0, 0, 0, 0)", + : disableHover + ? "scale(1)" + : hovered + ? "scale(1.01)" + : "scale(1)", + boxShadow: disableHover || !hovered || active + ? "0 2px 4px rgba(0, 0, 0, 0)" + : "0 2px 4px rgba(0, 0, 0, 0.1)", immediate: active, config: { mass: 1, @@ -45,9 +53,9 @@ export function ProductCard({ return ( setHovered(true)} - onMouseLeave={() => setHovered(false)} + href={path ?? "#"} + onMouseEnter={() => !disableHover && setHovered(true)} + onMouseLeave={() => !disableHover && setHovered(false)} onMouseDown={() => setActive(true)} onMouseUp={() => setActive(false)} onBlur={() => setActive(false)} @@ -55,85 +63,56 @@ export function ProductCard({ "group", css({ outline: "none", - height: 150, + cursor: disableHover ? "default" : "pointer", }), )} + onClick={onClick ?? undefined} >
-

- {icon} -
- {title} -
-

- {tag && ( -
- {tag} -
- )} + {headerTitle} + {headerChildren} +
-
{children} @@ -168,7 +147,7 @@ export function ProductCard({ )} - + ); } @@ -213,5 +192,51 @@ export function ProductCardInfo({ ); } +export function ProductCardTitle({ title, subtitle, icon }: { title: ReactNode, subtitle: ReactNode, icon: ReactNode }) { + return ( +
+
+ {icon} +
+
+

+ {title} +

+

+ {subtitle} +

+
+
+ ) +} + ProductCard.Group = ProductCardGroup; ProductCard.Info = ProductCardInfo; +ProductCard.Title = ProductCardTitle diff --git a/frontend/app/src/comps/ProductCard/ProductCardGroup.tsx b/frontend/app/src/comps/ProductCard/ProductCardGroup.tsx index 774ae69ce..f0d7088fd 100644 --- a/frontend/app/src/comps/ProductCard/ProductCardGroup.tsx +++ b/frontend/app/src/comps/ProductCard/ProductCardGroup.tsx @@ -10,8 +10,8 @@ export function ProductCardGroup({ summary, }: { children: ReactNode; - description: ReactNode; - icon: ReactNode; + description?: ReactNode; + icon?: ReactNode; name: ReactNode; summary?: { label: ReactNode; @@ -23,7 +23,7 @@ export function ProductCardGroup({ className={css({ display: "flex", flexDirection: "column", - gap: 48, + gap: 24, })} >
- {icon} + {icon && icon} {name} -

- {description} -

+ {description && +

+ {description} +

+ }
{summary && (
diff --git a/frontend/app/src/comps/ProgressBar/ProgressBar.tsx b/frontend/app/src/comps/ProgressBar/ProgressBar.tsx new file mode 100644 index 000000000..d95d1195e --- /dev/null +++ b/frontend/app/src/comps/ProgressBar/ProgressBar.tsx @@ -0,0 +1,50 @@ +"use client"; + +import { css } from "@/styled-system/css"; +import { a, useSpring } from "@react-spring/web"; + +export function ProgressBar({ + value, + max = 100, + height = 8, +}: { + value: number; + max?: number; + height?: number; +}) { + const percentage = Math.min(Math.max((value / max) * 100, 0), 100); + + const progressSpring = useSpring({ + from: { width: 0 }, + to: { width: percentage }, + config: { + mass: 1, + tension: 200, + friction: 30, + }, + }); + + return ( +
+ `${w}%`), + }} + /> +
+ ); +} diff --git a/frontend/app/src/comps/Screen/Screen.tsx b/frontend/app/src/comps/Screen/Screen.tsx index e2ac8c09f..3ac3aefe2 100644 --- a/frontend/app/src/comps/Screen/Screen.tsx +++ b/frontend/app/src/comps/Screen/Screen.tsx @@ -10,11 +10,10 @@ export function Screen({ back, children, className, - gap = 48, + gap = 4, heading = null, paddingTop = 0, ready = true, - width = 534, }: { back?: { href: string; @@ -90,9 +89,9 @@ export function Screen({ }); const headingElt = typeof heading === "object" - && heading !== null - && "title" in heading - && !isValidElement(heading) + && heading !== null + && "title" in heading + && !isValidElement(heading) ? (
@@ -127,12 +126,7 @@ export function Screen({ )}
) - : ( -
- {/* @ts-ignore */} - {heading} -
- ); + : null return (
@@ -212,7 +199,7 @@ export function Screen({ })} style={{ gap, - width, + width: "100%", ...screenSpring, }} > @@ -234,21 +221,15 @@ export function BackButton({ - +
+ +
{label}
diff --git a/frontend/app/src/comps/Tag/Tag.tsx b/frontend/app/src/comps/Tag/Tag.tsx index b3e6041c5..537b23f18 100644 --- a/frontend/app/src/comps/Tag/Tag.tsx +++ b/frontend/app/src/comps/Tag/Tag.tsx @@ -19,10 +19,10 @@ export function Tag({ className={css({ display: "inline-flex", alignItems: "center", - color: "infoSurfaceContent", - background: "infoSurface", - border: "1px solid token(colors.infoSurfaceBorder)", - borderRadius: 8, + color: "contentAlt", + background: "controlSurface", + border: "1px solid token(colors.controlSurface)", + borderRadius: 4, userSelect: "none", }, cssProp)} style={getStyles(size)} @@ -50,7 +50,7 @@ function getStyles(size: Parameters[0]["size"]) { if (size === "medium") { return { height: 22, - padding: 6, + padding: 8, fontSize: 14, }; } diff --git a/frontend/app/src/comps/VaultPositionSummary/VaultPositionSummary.tsx b/frontend/app/src/comps/VaultPositionSummary/VaultPositionSummary.tsx index 6e54a8798..ab6186d36 100644 --- a/frontend/app/src/comps/VaultPositionSummary/VaultPositionSummary.tsx +++ b/frontend/app/src/comps/VaultPositionSummary/VaultPositionSummary.tsx @@ -2,27 +2,25 @@ import type { Address, PositionEarn, RequestBalance, - Token, TokenSymbol, } from "@/src/types"; import Image from "next/image"; - import { Amount } from "@/src/comps/Amount/Amount"; -import { TagPreview } from "@/src/comps/TagPreview/TagPreview"; -import { dnum8, DNUM_0, dnumOrNull } from "@/src/dnum-utils"; import { fmtnum } from "@/src/formatting"; -import { isEarnPositionActive, useLiquityStats } from "@/src/liquity-utils"; +import { isEarnPositionActive } from "@/src/liquity-utils"; import { css } from "@/styled-system/css"; import { IconArrowRight, IconPlus, - InfoTooltip, TokenIcon, } from "@liquity2/uikit"; import * as dn from "dnum"; import Link from "next/link"; import { useVault } from "@/src/bitvault-utils"; import { supportedChainIcons } from "@/src/config/chains"; +import { Field } from "@/src/comps/Field/Field"; +import { DNUM_0 } from "@/src/dnum-utils"; +import content from "@/src/content"; export function VaultPositionSummary({ prevEarnPosition, @@ -50,7 +48,6 @@ export function VaultPositionSummary({ txPreviewMode?: boolean; }) { const { data } = useVault({ chainId, vaultAddress, vaultSymbol }); - // leftover from old liquity component structure let share = dn.from(0, 18); let prevShare = dn.from(0, 18); @@ -102,158 +99,100 @@ export function VaultPositionSummary({ })`, }} > -
- -
+
+
- {chainName.toLowerCase()} - {vaultName} +
-
-
TVL
-
- + {vaultName} +

+ + {chainName.toLowerCase()} -
- - Total amount of {vaultAsset} deposited in this vault. - +

+ {content.vaultScreen.subtitle[vaultName] ?? content.vaultScreen.subtitle.default} +

+
+
- {txPreviewMode ? ( - - ) : ( - <> -
-
- 30d APY -
- { - dn.greaterThan(data?.apr7d, 0) ? - <> - - - - :

Coming Soon

- } -
-
-
- 7d APY + +
+
- { - dn.greaterThan(data?.apr7d, 0) ? - <> - - - - :

Coming Soon

- } -
- - )} +

20x

+ + } + /> + + + + + } /> + {data.apr30d === DNUM_0 ? "TBD" : `${data.apr30d}%`}

} /> + {fmtnum(dn.mul(data.totalDeposited, data.price))} {vaultName === "sbvUSD" ? "USD" : "BVBTC"}

} />
@@ -282,7 +221,7 @@ export function VaultPositionSummary({ })`, }} > - Deposit + Deposited
= { address: "0xdB06a9D79f5Ff660f611234c963c255E03Cb5554", inputDecimals: 8, }, + WBTC: { + name: "Bluechip Bitcoin Vault", + outputSymbol: "sWBTC", + asset: "0x0555E30da8f98308EdB960aa94C0Db47230d2B9c", + address: "0xdb435E82b853c85dfbEc81dc1120558E77632A2a", + inputDecimals: 8, + } }, TOKENS: { bgBTC: { diff --git a/frontend/app/src/content.tsx b/frontend/app/src/content.tsx index 2a9383148..2cd0326c2 100644 --- a/frontend/app/src/content.tsx +++ b/frontend/app/src/content.tsx @@ -2,6 +2,7 @@ /* eslint-disable import/no-anonymous-default-export */ import type { ReactNode as N } from "react"; +import css from "styled-jsx/css"; export default { // Used in the top bar and other places @@ -19,11 +20,11 @@ export default { menu: { points: "Points", portfolio: "Portfolio", - vaults: "Vaults", + vaults: "Exotic BTC", borrow: "Borrow", earn: "Earn", wrap: "Wrap", - buy: "Buy", + buy: "Mint bvUSD", dashboard: "Dashboard", }, @@ -333,7 +334,7 @@ export default { vaultsHome: { headline: (tokensIcons: N) => ( <> - Earn with BTC {tokensIcons} +

Earn with BTC

{tokensIcons} ), subheading: ( @@ -419,7 +420,7 @@ export default { // Buy screen buyScreen: { - headline: (tokensIcons: N,boldIcon: N) => ( + headline: (tokensIcons: N, boldIcon: N) => ( <> Buy {boldIcon} bvUSD with {tokensIcons} stablecoins @@ -449,12 +450,65 @@ export default { // Vault screen vaultScreen: { - headline: "Earn best-in-class yield on your stablecoins", - subheading: (icons: N) => ( - <> - Managed by {icons} - - ), + subtitle: { + default: "Vault Tier 2" + }, + faq: { + factsheet: { + content: { + default: `he BitVault BTC Yield Fund is an actively managed Bitcoin yield fund operated by BV Labs Ltd. The fund provides investors with access to institutional-grade yield strategies while maintaining full exposure to Bitcoin price performance. + +The fund tracks the performance of a diversified portfolio of both stablecoin-denominated and Bitcoin-denominated yield strategies. BV Labs Ltd. is responsible for portfolio construction, risk management, and capital allocation, with a focus on liquidity preservation, capital efficiency, and downside protection. + +The minimum investment is 1 BTC, positioning the fund for professional and institutional investors. The portfolio is exclusively composed of low-risk yield strategies, ensuring high credit quality, conservative risk exposure, and strong liquidity across market conditions.`, + }, + items: { + default: [ + { title: "Token Standard", content: "ERC-4626" }, + { title: "Network", content: "Ethereum" }, + { title: "Inception Date", content: "January 2025" }, + { title: "Minimum Investment", content: "None" }, + { title: "Redemption Period", content: "T+1 (24 hours)" }, + { title: "Target APY", content: "3%" } + ] + } + }, + strategyComposition: { + default: [ + { title: "Market-Neutral Arbitrage", subtitle: "Basis, Funding & Cross-Venue Arbitrage", content: "50%" }, + { title: "Liquidity Provision & Market Making", subtitle: "DEX LPs, Pendle LP, Passive Market Making", content: "50%" }, + ] + }, + feeStructure: { + mangementFee: { + default: "1%" + }, + performanceFee: { + default: "20%" + }, + depositFee: { + default: "0%" + }, + withdrawalFee: { + default: "0%" + }, + }, + riskDisclosure: { + default: [ + { title: "Smart Contract Risk", subtitle: "All strategies utilize battle-tested protocols. Contracts are audited by leading security firms." }, + { title: "Market Risk", subtitle: "BTC price volatility affects NAV. Yield strategies are market-neutral but underlying asset fluctuates." }, + { title: "Liquidity Risk", subtitle: "Large redemptions may require T+1 settlement. Emergency withdrawals may incur slippage." }, + { title: "Counterparty Risk", subtitle: "Exposure to wrapped BTC issuers (Bitget, Enzo, etc.). Fund diversifies across multiple wrappers." } + ] + }, + technicalDetails: { + default: [ + { title: "Vault Contract", content: "0x54C5515133Dd9Ced5c8F0bff834A2C004D9B7CCc" }, + { title: "Management Safe Address", content: "0x..." }, + { title: "Oracle Address", content: "0x..." }, + ] + } + }, }, // Stake screen diff --git a/frontend/app/src/screens/BuyScreen/BuyScreen.tsx b/frontend/app/src/screens/BuyScreen/BuyScreen.tsx index fd09d4d77..c0eb67481 100644 --- a/frontend/app/src/screens/BuyScreen/BuyScreen.tsx +++ b/frontend/app/src/screens/BuyScreen/BuyScreen.tsx @@ -6,6 +6,7 @@ import { PanelConvert, STABLE_SYMBOLS } from "./PanelConvert"; import content from "@/src/content"; import { HFlex, TextButton, TokenIcon } from "@liquity2/uikit"; import { useRouter } from "next/navigation"; +import { css } from "@/styled-system/css"; export function BuyScreen() { const account = useAccount(); @@ -35,13 +36,20 @@ export function BuyScreen() { { router.push("/"); }} />, - , + , )} ) }} > - +
+ +
); } diff --git a/frontend/app/src/screens/BuyScreen/PanelConvert.tsx b/frontend/app/src/screens/BuyScreen/PanelConvert.tsx index 178078a4f..4a79135de 100644 --- a/frontend/app/src/screens/BuyScreen/PanelConvert.tsx +++ b/frontend/app/src/screens/BuyScreen/PanelConvert.tsx @@ -94,13 +94,18 @@ export function PanelConvert() { return (
diff --git a/frontend/app/src/screens/EarnPoolsListScreen/EarnPoolsListScreen.tsx b/frontend/app/src/screens/EarnPoolsListScreen/EarnPoolsListScreen.tsx index f9705bf61..6b9877e46 100644 --- a/frontend/app/src/screens/EarnPoolsListScreen/EarnPoolsListScreen.tsx +++ b/frontend/app/src/screens/EarnPoolsListScreen/EarnPoolsListScreen.tsx @@ -6,7 +6,6 @@ import { TokenIcon, TokenSymbol, } from "@liquity2/uikit"; -import { useTransition } from "@react-spring/web"; import { VaultPositionSummary } from "@/src/comps/VaultPositionSummary/VaultPositionSummary"; import { DNUM_0 } from "@/src/dnum-utils"; import { css } from "@/styled-system/css"; @@ -18,8 +17,10 @@ export function EarnPoolsListScreen() { const account = useAccount(); const {vaults, vaultAssets, vaultsArray} = getAllVaults(); + let filteredVaultsArray = vaultsArray.filter(([symbol]) => symbol !== "WBTC-1"); + let vaultPositions = []; - let queries = vaultsArray.map(([, vault]) => + let queries = filteredVaultsArray.map(([, vault]) => useVaultPosition(account.address, vault.inputDecimals, vault.chainId, vault.address) ); @@ -29,7 +30,7 @@ export function EarnPoolsListScreen() { vaultPositions = queries.map(q => q.data) let vaultReqPositions = []; - queries = vaultsArray.map(([, vault]) => + queries = filteredVaultsArray.map(([, vault]) => useVaultRequestPosition(account.address, vault.inputDecimals, vault.chainId, vault.address) ); @@ -38,21 +39,6 @@ export function EarnPoolsListScreen() { if(allSuccess) vaultReqPositions = queries.map(q => q.data) - const poolsTransition = useTransition( - Object.entries(vaults).map(([symbol, vault]) => symbol), - { - from: { opacity: 0, transform: "scale(1.1) translateY(64px)" }, - enter: { opacity: 1, transform: "scale(1) translateY(0px)" }, - leave: { opacity: 0, transform: "scale(1) translateY(0px)" }, - trail: 80, - config: { - mass: 1, - tension: 1800, - friction: 140, - }, - } - ); - return ( {[...vaultAssets].map((symbol) => { - return () + return () })} @@ -80,7 +66,7 @@ export function EarnPoolsListScreen() { width={67 * 8} gap={16} > - {vaultsArray.map(([symbol, vault], index) => { + {filteredVaultsArray.map(([symbol, vault], index) => { return (
setAssets({ ...assets, btc: !assets.btc })} /> - setAssets({ ...assets, usdc: !assets.usdc })} /> - setAssets({ ...assets, usdt: !assets.usdt })} /> + {/* setAssets({ ...assets, usdc: !assets.usdc })} /> + setAssets({ ...assets, usdt: !assets.usdt })} /> */}
diff --git a/frontend/app/src/screens/HomeScreen/HomeScreen.tsx b/frontend/app/src/screens/HomeScreen/HomeScreen.tsx index d99b29860..7753bfb72 100644 --- a/frontend/app/src/screens/HomeScreen/HomeScreen.tsx +++ b/frontend/app/src/screens/HomeScreen/HomeScreen.tsx @@ -1,20 +1,448 @@ "use client"; +import { ProductCardGroup } from "@/src/comps/ProductCard/ProductCardGroup"; +import { ProductCard } from "@/src/comps/ProductCard/ProductCard"; +import { TokenIcon, TokenSymbol } from "@liquity2/uikit"; +import { Screen } from "@/src/comps/Screen/Screen"; +import content from "@/src/content"; import { css } from "@/styled-system/css"; -import CardsSection from "./CardsSection"; +import { getAllVaults, supportedChainIcons } from "@/src/config/chains"; +import { Field } from "@/src/comps/Field/Field"; +import { Tag } from "@/src/comps/Tag/Tag"; +import { ProgressBar } from "@/src/comps/ProgressBar/ProgressBar"; +import Image from "next/image"; +import { useModal } from "@/src/services/ModalService"; +import { BorrowModal } from "./BorrowModal"; export function HomeScreen() { + const { vaults, vaultAssets, vaultsArray } = getAllVaults(); + const { setVisible: setModalVisibility, setContent: setModalContent } = useModal() + + return ( -
+ {content.vaultsHome.headline( + + {["BVBTC", "WBTC", "enzoBTC", "bgBTC", "cbBTC", "LBTC"].map((symbol) => { + return () + + })} + + )} +
+ ), + subtitle: <>{content.vaultsHome.subheading} , + }} + gap={16} > - -
+
+ } + /> + } + headerChildren={ +
+ +
+ +
+

20x

+ + } + /> + } /> + 4%

} /> + $20M

} /> +
+ } + children={ +
+

Deposit

+ + {["BVBTC", "WBTC", "enzoBTC", "bgBTC", "cbBTC", "LBTC"].map((symbol) => )} + +

on

+ + {Object.keys(supportedChainIcons).map((symbol) => + {symbol}) + } + +
+ } + path="/" + disableHover + /> +
+ + {/* BTC Native */} + { + setModalContent(); + setModalVisibility(true); + }} + headerTitle={ + } + /> + } + headerChildren={ + + } + borderOverride="green" + children={ +
+
+
+

+ 30-Day Performance +

+

+ +4% +

+
+ +
+
+

+ Vault Capacity +

+

0 BTC / 5,000 BTC

+
+
+ +
+
+ +
+

Accepted Assets

+
+ +
+
+ +
+
+ + +
+

View Details

+
+
+
+ } + path="/" + /> + {/* BTC Bluechip */} + } + /> + } + children={ +
+
+
+

+ 30-Day Performance +

+

+ +4% +

+
+ +
+
+

+ Vault Capacity +

+

50 BTC / 5,000 BTC

+
+
+ +
+
+ +
+

Accepted Assets

+
+ + + + +
+
+ +
+
+ + +
+

View Details

+
+
+
+ } + path="/vaults/WBTC-1" + /> + {/* sbvUSD Vault */} + } + /> + } + children={ +
+
+
+

+ 30-Day Performance +

+

+ +4% +

+
+ +
+
+

+ Vault Capacity +

+

1100 bvUSD / 5,000 bvUSD

+
+
+ +
+
+ +
+

Accepted Assets

+
+ +
+
+ +
+
+ + +
+

View Details

+
+
+
+ } + path="/earn" + /> + + } + /> + ); } diff --git a/frontend/app/src/screens/VaultScreen/PanelVaultUpdate.tsx b/frontend/app/src/screens/VaultScreen/PanelVaultUpdate.tsx index fdee0b8e0..9ce9b7042 100644 --- a/frontend/app/src/screens/VaultScreen/PanelVaultUpdate.tsx +++ b/frontend/app/src/screens/VaultScreen/PanelVaultUpdate.tsx @@ -112,7 +112,7 @@ export function PanelVaultUpdate({ const { setVisible: setModalVisibility, setContent: setModalContent } = useModal(); const isWhitelisted = vaultOutput === "sbvUSD" ? useIsWhitelistedUser(CHAINS[chain]?.CONTRACT_CONVERTER || zeroAddress, "0xf45346dc", account.address) : true; - + useEffect(() => { // Initial call getNextWithdrawalDate().then(setWithdrawalDate); @@ -152,12 +152,12 @@ export function PanelVaultUpdate({ }); const outputAmount = - mode === "remove" + mode === "remove" ? dn.mul(parsedValue, vaultPrice) : - chain === 43111 - ? dn.mul(parsedValue, vaultPrice) - : parseInputFloatWithDecimals( + chain === 43111 + ? dn.mul(parsedValue, vaultPrice) + : parseInputFloatWithDecimals( valOut, // @ts-ignore decimals @@ -190,17 +190,20 @@ export function PanelVaultUpdate({ parsedValue && dn.gt(parsedValue, 0) && !insufficientBalance && - (chain === 43111 || mode === "remove" ||valOutStatus === "success"); + (chain === 43111 || mode === "remove" || valOutStatus === "success"); return (
), + end: mode === "add" + ? content.earnScreen.depositPanel.label + : content.earnScreen.withdrawPanel.label, }} - labelHeight={32} + labelHeight={80} onFocus={() => setFocused(true)} onChange={setValue} onBlur={() => setFocused(false)} @@ -308,8 +309,8 @@ export function PanelVaultUpdate({ label={ dn.gt(balances[inputSymbol].data, 0) ? `Max ${fmtnum( - balances[inputSymbol].data - )} ${inputSymbol}` + balances[inputSymbol].data + )} ${inputSymbol}` : `Max 0.00 ${inputSymbol}` } onClick={() => @@ -326,6 +327,7 @@ export function PanelVaultUpdate({ gap: 4, color: "contentAlt2", fontSize: "14px", + padding: "4px 0" })} >

Built with

@@ -338,87 +340,104 @@ export function PanelVaultUpdate({ />

Enso

+ + + + {mode === "remove" && + requestBalance && + dn.gt(requestBalance.claimableAssets, 0) && ( + + )} + +
+ {mode === "remove" && ( +

+ Withdrawals requests will be processed every 30 days. Next + withdrawals will be processed in {withdrawalDate.days} days,{" "} + {withdrawalDate.hours} hours, {withdrawalDate.minutes} minutes,{" "} + {withdrawalDate.seconds} seconds. +

+ )} + + {isWhitelisted ? ( +
} /> - - {mode === "remove" && - requestBalance && - dn.gt(requestBalance.claimableAssets, 0) && ( - - )} - -
- {mode === "remove" && ( -

- Withdrawals requests will be processed every 30 days. Next - withdrawals will be processed in {withdrawalDate.days} days,{" "} - {withdrawalDate.hours} hours, {withdrawalDate.minutes} minutes,{" "} - {withdrawalDate.seconds} seconds. -

- )} - - {isWhitelisted ? ( -
+ + + + +
*/}
); } diff --git a/frontend/app/src/screens/VaultScreen/VaultFAQPanel.tsx b/frontend/app/src/screens/VaultScreen/VaultFAQPanel.tsx index 7da6c2c6c..5902503a3 100644 --- a/frontend/app/src/screens/VaultScreen/VaultFAQPanel.tsx +++ b/frontend/app/src/screens/VaultScreen/VaultFAQPanel.tsx @@ -1,7 +1,9 @@ +import content from "@/src/content"; import { css } from "@/styled-system/css"; -import { Spoiler } from "@liquity2/uikit"; +import ReactMarkdown from "react-markdown"; +import { Address } from "viem"; -export function VaultFAQPanel() { +export function VaultFAQPanel({ vaultAddress }: { vaultAddress: Address }) { return (
- FAQ + Factsheet - -

+ + + + +

+
+ ); +} + +function FactSheetPanel({ title, content, items }: { title: string, content?: string, items?: FactSheetItem[] }) { + return ( +
+

+ {title} +

+ {content && ( +
- sbvUSD is the yield-bearing variant of bvUSD, BitVault’s institutional-grade stablecoin. When you stake your bvUSD into sbvUSD, you begin earning real yield generated by non-directional, institutional strategies managed by premier partners. + })} + > + +
+ )} +
+ {items?.map((item) => ( + + ))} +
+
+ ); +} + +type FactSheetItem = { + title: string; + subtitle?: string; + content?: string; +} + +function FactSheetItem({ title, subtitle, content }: FactSheetItem) { + return ( +
+
+

+ {title} +

+

+ {subtitle} +

+
+
+

+ {content} +

+
+
+ ); +} + +function MarkdownContent({ content }: { content: string }) { + return ( + ( +

+ {children}

- - -
( +
    -

    - Yield in sbvUSD is generated through capital-efficient arbitrage strategies like basis trading and cross-exchange arbitrage or private credit. These strategies are managed by whitelisted institutional curators, such as LM5 and M1, who deploy capital across permissioned vaults designed for low-risk, stable returns. -

    -
      -
    • - Strategies are non-directional (market-neutral) -
    • -
    • - Designed for sustainable, long-term yield (10% APY target) -
    • -
    • - Deployed via battle-tested infrastructure (VaultCraft V2 fork) -
    • -
    -
-
- -
+ ), + ol: ({ children }) => ( +
    -

    - Yes, sbvUSD is built with security-first design principles: -

    -
      -
    • - Backed 1:1 by bvUSD and stablecoins -
    • -
    • - Strategies are managed by whitelisted, audited institutions -
    • -
    • - Automated risk management using institutional curators -
    • -
    • - Real-time monitoring via Hypernative -
    • -
    • - Audits can be found here -
    • -
    -
-
- -

- Anyone who holds bvUSD or stablecoins, can stake it to mint sbvUSD and start earning yield. It’s a permissionless earn mechanism, meaning you don’t need to be an institution to participate in yield generation. Simply stake and earn. -

-
- -
+ ), + li: ({ children }) => ( +
  • -

    - Like all DeFi products, sbvUSD is not risk-free. Potential risks include: -

    -
      -
    • - Smart contract vulnerabilities (mitigated via audits & live monitoring) -
    • -
    • - Strategy underperformance (mitigated by institutional-grade partners) -
    • -
    -

    - However, sbvUSD minimizes risk through: -

    -
      -
    • - Institutional-grade custody using Fordefi -
    • -
    • - Permissioned curators -
    • -
    • - Reserve Fund -
    • -
    -
  • -
    - -

    - You can request to unstake sbvUSD at any time. However, redemptions are processed on a monthly basis during a fixed 3-day window at the end of each month (starting at 9AM CET on the 28th). This batching mechanism allows underlying capital to be unwound efficiently while preserving yield for remaining participants. Requests submitted before the window will be queued for the next redemption cycle. -

    -
    - -

    - sbvUSD targets a net APY of 10%, though this may vary depending on market conditions. Yield is auto-compounded, and updates are transparently displayed on the BitVault dashboard. -

    -
    - -

    - sbvUSD accrues value over time. As yield is generated from strategy profits, it is reflected as a gradual increase in sbvUSD's exchange rate back to bvUSD. There are no fixed payouts — your holdings grow in value directly within your wallet. -

    -
    - -

    - sbvUSD vaults are managed by whitelisted institutional partners, including M1 and LM5. - All curators are selected based on performance, transparency, and alignment with BitVault’s security and compliance standards. -

    -
    - -

    - sbvUSD is accessible anywhere except from Burma (Myanmar), Cuba, Iran, Sudan, Syria, the Western Balkans, Belarus, Côte d’Ivoire, Democratic Republic of the Congo, Iraq, Lebanon, Liberia, Libya, North Korea, Russia, certain sanctioned areas of Ukraine, Somalia, Venezuela, Yemen, Zimbabwe, or the United States of America (collectively, “Prohibited Jurisdictions”), or any other jurisdiction listed as a Specially Designated National by the United States Office of Foreign Asset Control (“OFAC”). -

    -
    - - - ) + {children} + + ), + h1: ({ children }) => ( +

    + {children} +

    + ), + h2: ({ children }) => ( +

    + {children} +

    + ), + h3: ({ children }) => ( +

    + {children} +

    + ), + strong: ({ children }) => ( + + {children} + + ), + em: ({ children }) => ( + + {children} + + ), + a: ({ href, children }) => ( + + {children} + + ), + code: ({ children }) => ( + + {children} + + ), + }} + > + {content} +
    + ); } \ No newline at end of file diff --git a/frontend/app/src/screens/VaultScreen/VaultPanel.tsx b/frontend/app/src/screens/VaultScreen/VaultPanel.tsx index cde809fb9..233c18381 100644 --- a/frontend/app/src/screens/VaultScreen/VaultPanel.tsx +++ b/frontend/app/src/screens/VaultScreen/VaultPanel.tsx @@ -14,6 +14,7 @@ import { useEffect } from "react"; import { Address, zeroAddress } from "viem"; import { useChainId, useReadContract, useSwitchChain } from "wagmi"; import { PanelVaultUpdate } from "./PanelVaultUpdate"; +import { Field } from "@/src/comps/Field/Field"; const EMPTY_REQUEST_BALANCE: RequestBalance = { pendingShares: DNUM_0, @@ -37,7 +38,7 @@ export function VaultPanel({ const walletChainId = useChainId(); useEffect(() => { - if(chainId !== walletChainId) { + if (chainId !== walletChainId) { (async () => { try { await switchChainAsync({ chainId }); @@ -50,10 +51,10 @@ export function VaultPanel({ const { chainConfig } = useChainConfig(); - const vaultAddress = vault?.address?? getProtocolContract(chainConfig, "Vault").address; - const vaultName = vault?.name?? "sbvUSD"; - const vaultSymbol = vault?.outputSymbol?? "sbvUSD"; - const vaultDecimals = vault?.inputDecimals?? 18; + const vaultAddress = vault?.address ?? getProtocolContract(chainConfig, "Vault").address; + const vaultName = vault?.name ?? "sbvUSD"; + const vaultSymbol = vault?.outputSymbol ?? "sbvUSD"; + const vaultDecimals = vault?.inputDecimals ?? 18; const account = useAccount(); const vaultPosition = useVaultPosition( @@ -134,26 +135,99 @@ export function VaultPanel({ - +
    + +
    +
    +
    +

    Historical Returns

    +
    + + +
    + + + + + + + 10% + 8% + 6% + 4% + 2% + + Oct + Nov + Nov + Dec + Dec + Jan + + + + + + + + + + + + + + + + + + + + + + + +
    +
    ), - )} - + ) + } + ); } diff --git a/frontend/app/src/screens/VaultScreen/VaultScreen.tsx b/frontend/app/src/screens/VaultScreen/VaultScreen.tsx index 575f5cd87..9384ac9ad 100644 --- a/frontend/app/src/screens/VaultScreen/VaultScreen.tsx +++ b/frontend/app/src/screens/VaultScreen/VaultScreen.tsx @@ -1,9 +1,6 @@ "use client"; import { Screen } from "@/src/comps/Screen/Screen"; -import content from "@/src/content"; -import { css } from "@/styled-system/css"; -import { HFlex } from "@liquity2/uikit"; import { VaultPanel } from "./VaultPanel"; import { VaultFAQPanel } from "./VaultFAQPanel"; import { getAllVaults } from "@/src/config/chains"; @@ -25,52 +22,15 @@ export function VaultPoolScreen({ asset }: { asset: string }) { : chainConfig.CHAIN_ID; const chainName = vault !== undefined ? vault.chainName : chainConfig.CHAIN_NAME; + const isHomeLink = ["sWBTC", undefined].includes(vault?.outputSymbol) + return ( - {vaultAsset === "bvUSD" - ? content.vaultScreen.subheading( - - Fasanara - LM5 - M1 - - ) - : "Deposit your BTC Wrapped Token"} - - ), - }} + back={{ href: isHomeLink ? "/" : "/vaults", label: isHomeLink ? "Back to Home" : "Back to Vaults" }} > - + ); } diff --git a/frontend/uikit/src/InputField/InputField.tsx b/frontend/uikit/src/InputField/InputField.tsx index a751baf70..06e744782 100644 --- a/frontend/uikit/src/InputField/InputField.tsx +++ b/frontend/uikit/src/InputField/InputField.tsx @@ -162,17 +162,12 @@ const InputField = forwardRef
    @@ -368,19 +367,6 @@ const InputField = forwardRef )} -
    @@ -412,14 +398,10 @@ function Drawer({ const modeSpring = useSpring({ to: drawer?.mode === "error" ? { - color: "#82301A", - background: "#FEF5F2", - border: "#FFE7E1", + color: "#F36740", } : { color: "#2C231E", - background: "#FAF9F7", - border: "#EFECE5", }, config: diffSpringConfig, }); @@ -430,25 +412,18 @@ function Drawer({ className={css({ position: "relative", zIndex: 1, - marginTop: -8, })} > + + + + + + + + + + + + + + diff --git a/frontend/uikit/src/token-icons/base.svg b/frontend/uikit/src/token-icons/base.svg new file mode 100644 index 000000000..9a76d0cfc --- /dev/null +++ b/frontend/uikit/src/token-icons/base.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/uikit/src/token-icons/bits.svg b/frontend/uikit/src/token-icons/bits.svg new file mode 100644 index 000000000..3667fe2ba --- /dev/null +++ b/frontend/uikit/src/token-icons/bits.svg @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/frontend/uikit/src/token-icons/cbBTC.svg b/frontend/uikit/src/token-icons/cbBTC.svg new file mode 100644 index 000000000..b6ccd3cfb --- /dev/null +++ b/frontend/uikit/src/token-icons/cbBTC.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/uikit/src/token-icons/lbtc.svg b/frontend/uikit/src/token-icons/lbtc.svg new file mode 100644 index 000000000..ac428baa9 --- /dev/null +++ b/frontend/uikit/src/token-icons/lbtc.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/uikit/src/token-icons/wbtc.svg b/frontend/uikit/src/token-icons/wbtc.svg new file mode 100644 index 000000000..bbd669df6 --- /dev/null +++ b/frontend/uikit/src/token-icons/wbtc.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/uikit/src/tokens.ts b/frontend/uikit/src/tokens.ts index 702f92171..371d5b338 100644 --- a/frontend/uikit/src/tokens.ts +++ b/frontend/uikit/src/tokens.ts @@ -9,6 +9,10 @@ import usdt from "./token-icons/usdt.svg"; import usdc from "./token-icons/usdc.svg"; import bgbtc from "./token-icons/bitgetbtc.svg"; import enzobtc from "./token-icons/enzoBTC.svg"; +import bits from "./token-icons/bits.svg"; +import cbbtc from "./token-icons/cbBTC.svg"; +import wbtc from "./token-icons/wbtc.svg"; +import lbtc from "./token-icons/lbtc.svg"; export type CollateralSymbol = "BVBTC"; @@ -59,7 +63,7 @@ export const BVBTC: CollateralToken = { } as const; export const WBTC: Token = { - icon: btcb, + icon: wbtc, name: "WBTC", symbol: "WBTC" as const, } as const; @@ -118,6 +122,30 @@ export const sEnzoBTC: Token = { symbol: "sEnzoBTC" as const, } as const; +export const sWBTC: Token = { + icon: wbtc, + name: "sWBTC", + symbol: "sWBTC" as const, +} as const; + +export const Bit: Token = { + icon: bits, + name: "Bit", + symbol: "Bit" as const, +} as const; + +export const cbBTC: Token = { + icon: cbbtc, + name: "cbBTC", + symbol: "cbBTC" as const, +} as const; + +export const LBTC: Token = { + icon: lbtc, + name: "LBTC", + symbol: "LBTC" as const, +} as const; + export const COLLATERALS: CollateralToken[] = [ BVBTC @@ -139,5 +167,9 @@ export const TOKENS_BY_SYMBOL = { snBTC, sWETH, enzoBTC, - sEnzoBTC + sEnzoBTC, + sWBTC, + Bit, + cbBTC, + LBTC } as const; diff --git a/frontend/uikit/src/types.ts b/frontend/uikit/src/types.ts index 894d8a03d..82033946d 100644 --- a/frontend/uikit/src/types.ts +++ b/frontend/uikit/src/types.ts @@ -19,6 +19,10 @@ export type TokenSymbol = | "sWETH" | "enzoBTC" | "sEnzoBTC" + | "sWBTC" + | "Bit" + | "cbBTC" + | "LBTC" export type Token = { icon: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b2cbf35a..72c8ae31f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,7 +127,7 @@ importers: version: 2.20.3(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(use-sync-external-store@1.4.0)(viem@2.37.5) abitype: specifier: ^1.0.8 - version: 1.1.0(typescript@5.9.2)(zod@3.22.4) + version: 1.1.0(typescript@5.9.2)(zod@3.25.76) axios: specifier: ^1.10.0 version: 1.11.0 @@ -152,6 +152,9 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@18.3.24)(react@18.3.1) recharts: specifier: ^2.15.2 version: 2.15.4(react-dom@18.3.1)(react@18.3.1) @@ -166,7 +169,7 @@ importers: version: 0.42.1(typescript@5.9.2) viem: specifier: ^2.23.2 - version: 2.37.5(typescript@5.9.2)(zod@3.22.4) + version: 2.37.5(typescript@5.9.2)(zod@3.25.76) wagmi: specifier: ^2.14.11 version: 2.16.9(@tanstack/react-query@5.87.1)(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(viem@2.37.5) @@ -446,11 +449,11 @@ packages: '@babel/helpers': 7.28.4 '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -495,7 +498,7 @@ packages: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -509,12 +512,21 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color dev: true + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + /@babel/helper-module-imports@7.27.1(supports-color@5.5.0): resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -523,6 +535,7 @@ packages: '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4): resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} @@ -531,9 +544,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -557,7 +570,7 @@ packages: '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: true @@ -566,7 +579,7 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -663,6 +676,20 @@ packages: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 + /@babel/traverse@7.28.4: + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + /@babel/traverse@7.28.4(supports-color@5.5.0): resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} @@ -676,6 +703,7 @@ packages: debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color + dev: false /@babel/types@7.28.4: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} @@ -693,7 +721,7 @@ packages: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.2) preact: 10.24.2 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.24)(react@18.3.1)(use-sync-external-store@1.4.0) transitivePeerDependencies: - '@types/react' @@ -750,7 +778,7 @@ packages: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.2) preact: 10.24.2 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.24)(react@18.3.1)(use-sync-external-store@1.4.0) transitivePeerDependencies: - '@types/react' @@ -1669,7 +1697,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -2141,7 +2169,7 @@ packages: dependencies: '@metamask/rpc-errors': 7.0.2 eventemitter3: 5.0.1 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - supports-color dev: false @@ -2657,7 +2685,7 @@ packages: '@babel/core': 7.28.4 '@babel/parser': 7.28.4 '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4(supports-color@5.5.0) + '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 @@ -2739,7 +2767,7 @@ packages: '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.10.10 chalk: 4.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) dotenv: 16.6.1 graphql: 16.11.0 graphql-request: 6.1.0(graphql@16.11.0) @@ -2857,7 +2885,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3278,7 +3306,7 @@ packages: bufferutil: 4.0.9 cross-fetch: 4.1.0 date-fns: 2.30.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eventemitter2: 6.4.9 readable-stream: 3.6.2 @@ -3306,7 +3334,7 @@ packages: '@paulmillr/qr': 0.2.1 bowser: 2.12.1 cross-fetch: 4.1.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eciesjs: 0.4.15 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -3339,7 +3367,7 @@ packages: '@scure/base': 1.2.6 '@types/debug': 4.1.12 '@types/lodash': 4.17.20 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) lodash: 4.17.21 pony-cause: 2.1.11 semver: 7.7.2 @@ -3354,7 +3382,7 @@ packages: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) semver: 7.7.2 superstruct: 1.0.4 transitivePeerDependencies: @@ -3370,7 +3398,7 @@ packages: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -3387,7 +3415,7 @@ packages: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 @@ -3909,7 +3937,7 @@ packages: '@ethersproject/address': 5.8.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 7.0.1 hardhat: 2.26.3(ts-node@10.9.2)(typescript@5.9.2) lodash: 4.17.21 @@ -4742,7 +4770,7 @@ packages: /@pm2/pm2-version-check@1.0.4: resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -4847,6 +4875,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@reown/appkit-common@1.7.8(typescript@5.9.2): + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + /@reown/appkit-common@1.7.8(typescript@5.9.2)(zod@3.22.4): resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} dependencies: @@ -4863,11 +4904,11 @@ packages: /@reown/appkit-controllers@1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2): resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-wallet': 1.7.8(typescript@5.9.2) '@walletconnect/universal-provider': 2.21.0(typescript@5.9.2) valtio: 1.13.2(@types/react@18.3.24)(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4900,7 +4941,7 @@ packages: /@reown/appkit-pay@1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2): resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-ui': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-utils': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(valtio@1.13.2) @@ -4944,7 +4985,7 @@ packages: /@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(valtio@1.13.2): resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-ui': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-utils': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(valtio@1.13.2) @@ -4983,7 +5024,7 @@ packages: /@reown/appkit-ui@1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2): resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-wallet': 1.7.8(typescript@5.9.2) lit: 3.3.0 @@ -5022,14 +5063,14 @@ packages: peerDependencies: valtio: 1.13.2 dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(typescript@5.9.2) '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(typescript@5.9.2) valtio: 1.13.2(@types/react@18.3.24)(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5075,7 +5116,7 @@ packages: /@reown/appkit@1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2): resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} dependencies: - '@reown/appkit-common': 1.7.8(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.7.8(typescript@5.9.2) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-pay': 1.7.8(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) '@reown/appkit-polyfills': 1.7.8 @@ -5087,7 +5128,7 @@ packages: '@walletconnect/universal-provider': 2.21.0(typescript@5.9.2) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.24)(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5383,7 +5424,7 @@ packages: resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -5974,7 +6015,7 @@ packages: graphql: ^16.0.0 dependencies: constant-case: 3.0.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) graphql: 16.11.0 json5: 2.2.3 lodash.sortby: 4.7.0 @@ -6012,7 +6053,7 @@ packages: big.js: 6.2.2 bn.js: 5.2.2 cbor: 5.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) lodash: 4.17.21 semver: 7.7.2 utf8: 3.0.0 @@ -6036,7 +6077,7 @@ packages: deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -6053,7 +6094,7 @@ packages: '@truffle/error': 0.2.2 '@truffle/interface-adapter': 0.5.37 bignumber.js: 7.2.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) ethers: 4.0.49 web3: 1.10.0 web3-core-helpers: 1.10.0 @@ -6076,7 +6117,7 @@ packages: '@trufflesuite/chromafi': 3.0.0 bn.js: 5.2.2 chalk: 2.4.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) highlightjs-solidity: 2.0.6 transitivePeerDependencies: - supports-color @@ -6332,9 +6373,14 @@ packages: '@types/ms': 2.1.0 dev: false + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + dependencies: + '@types/estree': 1.0.8 + dev: false + /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} @@ -6349,6 +6395,12 @@ packages: '@types/node': 22.18.1 dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} dev: true @@ -6381,6 +6433,12 @@ packages: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: true + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: true @@ -6475,6 +6533,14 @@ packages: resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} dev: false + /@types/unist@2.0.11: + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + dev: false + + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: false + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: @@ -6500,7 +6566,7 @@ packages: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 typescript: 5.9.2 transitivePeerDependencies: @@ -6531,7 +6597,7 @@ packages: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -6552,7 +6618,6 @@ packages: /@ungap/structured-clone@1.3.0: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - dev: true /@unrs/resolver-binding-android-arm-eabi@1.11.1: resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -6778,7 +6843,7 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -6976,7 +7041,7 @@ packages: '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2) cbw-sdk: /@coinbase/wallet-sdk@3.9.3 typescript: 5.9.2 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7023,7 +7088,7 @@ packages: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.2) typescript: 5.9.2 - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) zustand: 5.0.0(@types/react@18.3.24)(react@18.3.1)(use-sync-external-store@1.4.0) transitivePeerDependencies: - '@types/react' @@ -7749,7 +7814,6 @@ packages: dependencies: typescript: 5.9.2 zod: 3.25.76 - dev: true /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -7802,7 +7866,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -8314,6 +8378,10 @@ packages: - supports-color dev: false + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -8796,6 +8864,10 @@ packages: hasBin: true dev: true + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + /chai-as-promised@7.1.2(chai@4.5.0): resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: @@ -8919,6 +8991,22 @@ packages: tslib: 2.8.1 dev: true + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} dev: true @@ -9238,6 +9326,10 @@ packages: dependencies: delayed-stream: 1.0.0 + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} dev: true @@ -9331,7 +9423,7 @@ packages: react-use-measure: 2.1.7(react-dom@18.3.1)(react@18.3.1) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.28.4)(react-dom@18.3.1)(react-is@19.1.1)(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) wagmi: 2.16.9(@tanstack/react-query@5.87.1)(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(viem@2.37.5) transitivePeerDependencies: - '@babel/core' @@ -9862,6 +9954,7 @@ packages: dependencies: ms: 2.1.3 supports-color: 5.5.0 + dev: false /debug@4.4.1(supports-color@8.1.1): resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} @@ -9874,7 +9967,6 @@ packages: dependencies: ms: 2.1.3 supports-color: 8.1.1 - dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -9892,6 +9984,12 @@ packages: /decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + /decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + dependencies: + character-entities: 2.0.2 + dev: false + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -10022,7 +10120,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true /derive-valtio@0.1.0(valtio@1.13.2): resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} @@ -10065,6 +10162,12 @@ packages: engines: {node: '>=8'} dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -10095,7 +10198,7 @@ packages: /dns-over-http-resolver@1.2.3(node-fetch@3.3.2): resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) native-fetch: 3.0.0(node-fetch@3.3.2) receptacle: 1.3.2 transitivePeerDependencies: @@ -10791,7 +10894,7 @@ packages: optional: true dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) eslint: 8.57.1 eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) get-tsconfig: 4.10.1 @@ -10960,7 +11063,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -11045,6 +11148,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -11413,7 +11520,6 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true /extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} @@ -11461,7 +11567,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) wagmi: 2.16.9(@tanstack/react-query@5.87.1)(@types/react@18.3.24)(react@18.3.1)(typescript@5.9.2)(viem@2.37.5) dev: false @@ -11771,7 +11877,7 @@ packages: debug: optional: true dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) dev: true /for-each@0.3.5: @@ -12089,7 +12195,7 @@ packages: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -12556,7 +12662,7 @@ packages: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -12667,6 +12773,34 @@ packages: dependencies: function-bind: 1.1.2 + /hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: false + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -12732,6 +12866,10 @@ packages: /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + /html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + dev: false + /htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} dependencies: @@ -12775,7 +12913,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12844,7 +12982,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -12854,7 +12992,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12960,6 +13098,10 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + dev: false + /inquirer@8.2.7(@types/node@22.18.1): resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} @@ -13162,6 +13304,17 @@ packages: is-windows: 1.0.2 dev: true + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -13256,6 +13409,10 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -13323,6 +13480,10 @@ packages: engines: {node: '>=6.5.0', npm: '>=3'} dev: true + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -13392,6 +13553,11 @@ packages: engines: {node: '>=10'} dev: true + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -13603,7 +13769,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/trace-mapping': 0.3.30 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -14313,6 +14479,10 @@ packages: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} dev: true + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /look-it-up@2.1.0: resolution: {integrity: sha512-nMoGWW2HurtuJf6XAL56FWTDCWLOTSsanrgwOyaR5Y4e3zfG5N/0cU5xWZSEU3tBxhQugRbV1xL9jb+ug7yZww==} @@ -14458,6 +14628,111 @@ packages: is-buffer: 1.1.6 dev: true + /mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + dev: false + + /mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: false + + /mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.4 + dev: false + /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true @@ -14538,6 +14813,181 @@ packages: /microdiff@1.3.2: resolution: {integrity: sha512-pKy60S2febliZIbwdfEQKTtL5bLNxOyiRRmD400gueYl9XcHyNGxzHSlJWn9IMHwYXT0yohPYL08+bGozVk8cQ==} + /micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + dev: false + + /micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + dev: false + + /micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + dependencies: + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + + /micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + dev: false + + /micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + dev: false + + /micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1(supports-color@8.1.1) + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -15385,7 +15835,7 @@ packages: '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.1.0(typescript@5.9.2)(zod@3.22.4) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 typescript: 5.9.2 transitivePeerDependencies: @@ -15405,7 +15855,7 @@ packages: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@3.22.4) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 typescript: 5.9.2 transitivePeerDependencies: @@ -15452,7 +15902,6 @@ packages: typescript: 5.9.2 transitivePeerDependencies: - zod - dev: true /oxlint@0.10.3: resolution: {integrity: sha512-af5u5+s4adyszujeILPDRGwix0o5M1+qR1eqxNSmJhTKVRX7xdrT9s2rpNpMYxQmPyWRhC/+5Gqyb+f/PtbK9A==} @@ -15560,7 +16009,7 @@ packages: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -15622,6 +16071,18 @@ packages: resolution: {integrity: sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==} dev: true + /parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -15943,7 +16404,7 @@ packages: resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} engines: {node: '>=5'} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -15954,7 +16415,7 @@ packages: dependencies: amp: 0.3.1 amp-message: 0.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) escape-string-regexp: 4.0.0 transitivePeerDependencies: - supports-color @@ -15979,7 +16440,7 @@ packages: requiresBuild: true dependencies: async: 3.2.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) pidusage: 2.0.21 systeminformation: 5.27.8 tx2: 1.0.5 @@ -16005,7 +16466,7 @@ packages: commander: 2.15.1 croner: 4.1.97 dayjs: 1.11.18 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) enquirer: 2.3.6 eventemitter2: 5.0.1 fclone: 1.0.11 @@ -16321,6 +16782,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + dev: false + /protobufjs@6.11.4: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true @@ -16354,7 +16819,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -16612,6 +17077,29 @@ packages: resolution: {integrity: sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==} dev: false + /react-markdown@10.1.0(@types/react@18.3.24)(react@18.3.1): + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 18.3.24 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 18.3.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /react-native-fetch-api@3.0.0: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} dependencies: @@ -16846,6 +17334,27 @@ packages: - encoding dev: true + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + dev: false + /remedial@1.0.8: resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} dev: true @@ -16917,7 +17426,7 @@ packages: resolution: {integrity: sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==} engines: {node: '>=6'} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -17613,7 +18122,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -17713,6 +18222,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -17962,6 +18475,13 @@ packages: dependencies: safe-buffer: 5.2.1 + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -18036,6 +18556,18 @@ packages: engines: {node: '>=8'} dev: true + /style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + dependencies: + style-to-object: 1.0.14 + dev: false + + /style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + dependencies: + inline-style-parser: 0.2.7 + dev: false + /style-value-types@5.0.0: resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} dependencies: @@ -18474,6 +19006,14 @@ packages: dependencies: punycode: 2.3.1 + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + /ts-api-utils@1.4.3(typescript@5.9.2): resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -18711,7 +19251,7 @@ packages: typescript: '>=4.3.0' dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -18882,6 +19422,51 @@ packages: engines: {node: '>=20.18.1'} dev: true + /unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + dev: false + + /unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + dependencies: + '@types/unist': 3.0.3 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + + /unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -19200,6 +19785,20 @@ packages: extsprintf: 1.3.0 dev: true + /vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + dev: false + /victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} dependencies: @@ -19286,7 +19885,6 @@ packages: - bufferutil - utf-8-validate - zod - dev: true /vite-node@2.1.9(@types/node@22.18.1): resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} @@ -19294,7 +19892,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 1.1.2 vite: 5.4.20(@types/node@22.18.1) @@ -19324,7 +19922,7 @@ packages: '@volar/typescript': 2.4.23 '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 1.1.2 magic-string: 0.30.19 @@ -19344,7 +19942,7 @@ packages: vite: optional: true dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.2) vite: 5.4.20(@types/node@22.18.1) @@ -19426,7 +20024,7 @@ packages: '@vitest/spy': 2.1.9 '@vitest/utils': 2.1.9 chai: 5.3.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@8.1.1) expect-type: 1.2.2 jsdom: 25.0.1 magic-string: 0.30.19 @@ -19488,7 +20086,7 @@ packages: react: 18.3.1 typescript: 5.9.2 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.37.5(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.5(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -20648,7 +21246,6 @@ packages: /zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - dev: true /zustand@5.0.0(@types/react@18.3.24)(react@18.3.1)(use-sync-external-store@1.4.0): resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} @@ -20696,6 +21293,10 @@ packages: use-sync-external-store: 1.4.0(react@18.3.1) dev: false + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false + /zx@8.8.1: resolution: {integrity: sha512-qvsKBnvWHstHKCluKPlEgI/D3+mdiQyMoSSeFR8IX/aXzWIas5A297KxKgPJhuPXdrR6ma0Jzx43+GQ/8sqbrw==} engines: {node: '>= 12.17.0'}