From a94e4bcea875d6903279023f3e175b04d8d50ce8 Mon Sep 17 00:00:00 2001 From: Ghoost-404 Date: Sat, 17 Oct 2026 10:22:28 +0100 Subject: [PATCH] mock transaction --- app/copy-trade/page.tsx | 119 +- app/markets/quick-view/page.tsx | 134 +- app/premium/page.tsx | 127 +- app/transaction-failed/page.tsx | 186 +- app/transaction-status/page.tsx | 200 +- app/transaction-success/page.tsx | 160 +- app/tx/page.tsx | 346 ++ components/ui/tx-toast.tsx | 189 + docs/architecture.md | 16 +- docs/manual-test.md | 10 + lib/hooks/useStellar.ts | 463 +- lib/stellar/WalletProvider.tsx | 5 +- lib/stellar/__tests__/errors.test.ts | 84 +- lib/stellar/__tests__/fees.test.ts | 164 + .../__tests__/fixtures/account-entry.json | 3 + .../__tests__/fixtures/buy-simulation.json | 5 + lib/stellar/__tests__/tx-lifecycle.test.ts | 275 ++ lib/stellar/__tests__/tx-tracker.test.ts | 199 + lib/stellar/__tests__/units.test.ts | 15 +- lib/stellar/clients.ts | 13 +- lib/stellar/errors.ts | 121 +- lib/stellar/fees.ts | 171 + lib/stellar/tx-lifecycle.ts | 260 + lib/stellar/tx-tracker-core.ts | 174 + lib/stellar/tx-tracker.tsx | 238 + lib/stellar/units.ts | 35 +- package-lock.json | 4370 +---------------- package.json | 1 + 28 files changed, 3260 insertions(+), 4823 deletions(-) create mode 100644 app/tx/page.tsx create mode 100644 components/ui/tx-toast.tsx create mode 100644 lib/stellar/__tests__/fees.test.ts create mode 100644 lib/stellar/__tests__/fixtures/account-entry.json create mode 100644 lib/stellar/__tests__/fixtures/buy-simulation.json create mode 100644 lib/stellar/__tests__/tx-lifecycle.test.ts create mode 100644 lib/stellar/__tests__/tx-tracker.test.ts create mode 100644 lib/stellar/fees.ts create mode 100644 lib/stellar/tx-lifecycle.ts create mode 100644 lib/stellar/tx-tracker-core.ts create mode 100644 lib/stellar/tx-tracker.tsx diff --git a/app/copy-trade/page.tsx b/app/copy-trade/page.tsx index 3bd60a0..77e5454 100644 --- a/app/copy-trade/page.tsx +++ b/app/copy-trade/page.tsx @@ -7,13 +7,35 @@ import { getTrace, ReasoningTrace } from "@/lib/api/traces"; import { confirmCopyTrade, initiateCopyTrade } from "@/lib/api/trade"; import { ApiError } from "@/lib/api/client"; import { useMarket } from "@/lib/hooks/useMarkets"; -import { useBuy, useQuoteBuy, useUsdcBalance } from "@/lib/hooks/useStellar"; +import { useBuy, useQuoteBuy, useUsdcBalance, useAccountReserve, usePrepareBuy } from "@/lib/hooks/useStellar"; import { explorerTx } from "@/lib/stellar/config"; -import { formatUsdc, minOut, shareOf } from "@/lib/stellar/units"; +import { formatUsdc, formatXlm, minOut, shareOf } from "@/lib/stellar/units"; +import { TxPhase } from "@/lib/stellar/tx-lifecycle"; /** Wait this long after the slider stops before asking for a new quote. */ const QUOTE_DEBOUNCE_MS = 400; +function renderTxPhase(phase: TxPhase): string | null { + switch (phase.name) { + case "building": + return null; + case "simulating": + return "Simulating transaction…"; + case "awaiting-signature": + return "Waiting for your wallet…"; + case "submitting": + return "Sending to the network…"; + case "pending": + return "Waiting for a ledger…"; + case "confirmed": + return "Transaction confirmed."; + case "failed": + return phase.error.message; + case "expired": + return "Transaction expired without confirmation."; + } +} + function useDebounced(value: T, ms: number): T { const [debounced, setDebounced] = useState(value); useEffect(() => { @@ -37,6 +59,7 @@ function CopyTradeContent() { const onChainMarketId = market?.onChainMarketId ?? null; const balance = useUsdcBalance(address); + const reserve = useAccountReserve(address); const buy = useBuy(); // Allocation as a share of the wallet's USDC balance, in basis points. @@ -62,6 +85,24 @@ function CopyTradeContent() { const debouncedAmount = useDebounced(amountRaw, QUOTE_DEBOUNCE_MS); const quote = useQuoteBuy(onChainMarketId, side ?? "Yes", side ? debouncedAmount : null); const minShares = quote.data !== undefined ? minOut(quote.data, slippageBps) : null; + const prepareBuy = usePrepareBuy({ + marketId: onChainMarketId, + outcome: side ?? "Yes", + collateralIn: side ? debouncedAmount : null, + slippageBps, + holder: address, + }); + + const fees = prepareBuy.data?.fees; + const isUnfunded = Boolean(reserve.data && !reserve.data.funded); + const isInsufficientXlm = Boolean( + reserve.data?.funded && + fees && + reserve.data.spendable < fees.totalFee + ); + const xlmDeficit = (reserve.data?.funded && fees && fees.totalFee > reserve.data.spendable) + ? fees.totalFee - reserve.data.spendable + : null; const handleSliderInteraction = (clientX: number) => { if (!sliderRef.current) return; @@ -134,12 +175,13 @@ function CopyTradeContent() { amountRaw: amountRaw.toString(), }); - setStatusMessage("Getting a fresh quote, then asking your wallet to sign…"); + setStatusMessage(null); const result = await buy.mutateAsync({ marketId: onChainMarketId, outcome: side, collateralIn: amountRaw, slippageBps, + prepared: prepareBuy.data, }); if (result.txHash) await confirmCopyTrade(copyTradeId, result.txHash).catch(() => undefined); @@ -311,7 +353,26 @@ function CopyTradeContent() { {quote.data !== undefined && minShares !== null ? ( <> {formatUsdc(quote.data, { maxDecimals: 2 })} - at least {formatUsdc(minShares, { maxDecimals: 2 })} after slippage + + at least {formatUsdc(minShares, { maxDecimals: 2 })} after slippage + {fees && ( + + Network fee ≈ {formatXlm(fees.totalFee)} XLM ·{" "} + {reserve.isLoading + ? "checking XLM…" + : reserve.isError + ? "couldn't check XLM balance" + : reserve.data && !reserve.data.funded + ? "unfunded" + : reserve.data + ? `spendable ${formatXlm(reserve.data.spendable, { maxDecimals: 1 })} XLM` + : "spendable —"} + + )} + ) : quote.isFetching ? ( Quoting… @@ -325,11 +386,41 @@ function CopyTradeContent() {
- {statusMessage ? ( + {/* Blocking warnings */} + {isConnected && isUnfunded && ( +
+ Fund this account with XLM first. +
+ )} + {isConnected && isInsufficientXlm && xlmDeficit !== null && ( +
+ You need about {formatXlm(xlmDeficit)} more XLM to pay the network fee. +
+ )} + + {/* Tx phase tracking */} + {buy.isPending && ( +
+ {renderTxPhase(buy.phase) ?? statusMessage ?? "Processing copy trade…"} + {"hash" in buy.phase && buy.phase.hash && ( + + View: {buy.phase.hash.slice(0, 8)}… + + )} +
+ )} + + {/* Status message when not pending */} + {!buy.isPending && statusMessage && (
{statusMessage}
- ) : null} + )}

diff --git a/app/markets/quick-view/page.tsx b/app/markets/quick-view/page.tsx index 63c6a06..b930c14 100644 --- a/app/markets/quick-view/page.tsx +++ b/app/markets/quick-view/page.tsx @@ -8,10 +8,11 @@ import { useQuery } from "@tanstack/react-query"; import { useMarket } from "@/lib/hooks/useMarkets"; import { getMarketByOnChainId } from "@/lib/api/markets"; import { ApiError } from "@/lib/api/client"; -import { useBuy, useOnChainMarket, usePosition, useQuoteBuy, useUsdcBalance } from "@/lib/hooks/useStellar"; +import { useBuy, useOnChainMarket, usePosition, useQuoteBuy, useUsdcBalance, useAccountReserve, usePrepareBuy } from "@/lib/hooks/useStellar"; import { useWallet } from "@/lib/contexts/WalletContext"; import { explorerTx } from "@/lib/stellar/config"; -import { formatUsdc, minOut, tryParseUsdc } from "@/lib/stellar/units"; +import { formatUsdc, formatXlm, minOut, tryParseUsdc } from "@/lib/stellar/units"; +import { TxPhase } from "@/lib/stellar/tx-lifecycle"; const SLIPPAGE_BPS = 100; // 1% @@ -47,6 +48,27 @@ export default function MarketQuickViewPage() { ); } +function renderTxPhase(phase: TxPhase): string | null { + switch (phase.name) { + case "building": + return null; + case "simulating": + return "Simulating transaction…"; + case "awaiting-signature": + return "Waiting for your wallet…"; + case "submitting": + return "Sending to the network…"; + case "pending": + return "Waiting for a ledger…"; + case "confirmed": + return "Transaction confirmed."; + case "failed": + return phase.error.message; + case "expired": + return "Transaction expired without confirmation."; + } +} + function MarketQuickViewContent() { const searchParams = useSearchParams(); const marketId = searchParams.get("marketId"); @@ -68,6 +90,7 @@ function MarketQuickViewContent() { const { address, isConnected, openModal } = useWallet(); const position = usePosition(onChainMarketId, address); const balance = useUsdcBalance(address); + const reserve = useAccountReserve(address); const buy = useBuy(); const [showModal] = useState(true); @@ -77,6 +100,24 @@ function MarketQuickViewContent() { const amountRaw = tryParseUsdc(amountInput); const debouncedAmount = useDebounced(amountRaw, 400); const quote = useQuoteBuy(onChainMarketId, side, debouncedAmount); + const prepareBuy = usePrepareBuy({ + marketId: onChainMarketId, + outcome: side, + collateralIn: debouncedAmount, + slippageBps: SLIPPAGE_BPS, + holder: address, + }); + + const fees = prepareBuy.data?.fees; + const isUnfunded = Boolean(reserve.data && !reserve.data.funded); + const isInsufficientXlm = Boolean( + reserve.data?.funded && + fees && + reserve.data.spendable < fees.totalFee + ); + const xlmDeficit = (reserve.data?.funded && fees && fees.totalFee > reserve.data.spendable) + ? fees.totalFee - reserve.data.spendable + : null; // Illustrative only: there is no price history source yet. const sparklinePath = "M0 25 L10 22 L20 28 L30 18 L40 20 L50 15 L60 17 L70 10 L80 12 L90 5 L100 8"; @@ -103,9 +144,15 @@ function MarketQuickViewContent() { setBuyStatus("Enter an amount like 10 or 2.5."); return; } - setBuyStatus("Getting a fresh quote, then asking your wallet to sign…"); + setBuyStatus(null); try { - const result = await buy.mutateAsync({ marketId: onChainMarketId, outcome: side, collateralIn: amountRaw, slippageBps: SLIPPAGE_BPS }); + const result = await buy.mutateAsync({ + marketId: onChainMarketId, + outcome: side, + collateralIn: amountRaw, + slippageBps: SLIPPAGE_BPS, + prepared: prepareBuy.data, + }); setBuyStatus( `Bought ${formatUsdc(result.sharesOut, { maxDecimals: 2 })} ${side.toUpperCase()} shares.` + (result.txHash ? ` View: ${explorerTx(result.txHash)}` : ""), @@ -281,10 +328,23 @@ function MarketQuickViewContent() {

@@ -297,6 +357,45 @@ function MarketQuickViewContent() { {balance.data !== undefined && Balance {formatUsdc(balance.data, { maxDecimals: 2, grouping: true })}}
+ + {/* Network fee & reserve row */} + {isConnected && ( +
+ + Network fee {fees ? `≈ ${formatXlm(fees.totalFee)} XLM` : prepareBuy.isLoading ? "≈ calculating…" : "—"} ·{" "} + {reserve.isLoading + ? "checking XLM…" + : reserve.isError + ? "couldn't check XLM balance" + : reserve.data && !reserve.data.funded + ? "unfunded" + : reserve.data + ? `spendable ${formatXlm(reserve.data.spendable, { maxDecimals: 1 })} XLM` + : "spendable —"} + + {fees && ( + + (inclusion {formatXlm(fees.inclusionFee)} + resource {formatXlm(fees.resourceFee)}) + + )} +
+ )} + + {/* Blocking warnings */} + {isConnected && isUnfunded && ( +

+ Fund this account with XLM first. +

+ )} + {isConnected && isInsufficientXlm && xlmDeficit !== null && ( +

+ You need about {formatXlm(xlmDeficit)} more XLM to pay the network fee. +

+ )} + {!isOpen && view && (

This market is closed to trading.

)} @@ -306,7 +405,28 @@ function MarketQuickViewContent() {

)} - {buyStatus &&

{buyStatus}

} + + {/* Observable tx lifecycle phase */} + {buy.isPending && ( +
+ {renderTxPhase(buy.phase) ?? "Processing transaction…"} + {"hash" in buy.phase && buy.phase.hash && ( + + View: {buy.phase.hash.slice(0, 8)}… + + )} +
+ )} + + {/* Status message */} + {!buy.isPending && buyStatus && ( +

{buyStatus}

+ )} )} diff --git a/app/premium/page.tsx b/app/premium/page.tsx index 9e13776..131e9c3 100644 --- a/app/premium/page.tsx +++ b/app/premium/page.tsx @@ -4,10 +4,32 @@ import React, { useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { useWallet } from "@/lib/contexts/WalletContext"; -import { useUsdcTransfer } from "@/lib/hooks/useStellar"; +import { useUsdcTransfer, useAccountReserve, usePrepareUsdcTransfer } from "@/lib/hooks/useStellar"; import { useUnlockTrace } from "@/lib/hooks/useTraces"; import { PAYMENTS_RECIPIENT, explorerTx } from "@/lib/stellar/config"; -import { formatUsdc, parseUsdc } from "@/lib/stellar/units"; +import { formatUsdc, formatXlm, parseUsdc } from "@/lib/stellar/units"; +import { TxPhase } from "@/lib/stellar/tx-lifecycle"; + +function renderTxPhase(phase: TxPhase): string | null { + switch (phase.name) { + case "building": + return null; + case "simulating": + return "Simulating transaction…"; + case "awaiting-signature": + return "Waiting for your wallet…"; + case "submitting": + return "Sending to the network…"; + case "pending": + return "Waiting for a ledger…"; + case "confirmed": + return "Transaction confirmed."; + case "failed": + return phase.error.message; + case "expired": + return "Transaction expired without confirmation."; + } +} /** * Price of the backend's daily pass (its DAILY_PASS_PRICE_RAW). The backend @@ -85,15 +107,33 @@ const features = [ ]; export default function PremiumPage() { - const { isConnected, isWrongNetwork, openModal, ensureSession } = useWallet(); + const { address, isConnected, isWrongNetwork, openModal, ensureSession } = useWallet(); const transfer = useUsdcTransfer(); const unlock = useUnlockTrace(); + const reserve = useAccountReserve(address); const [selectedTier, setSelectedTier] = useState(null); const [paymentMethod, setPaymentMethod] = useState<"usdc" | "card">("usdc"); const [isSubmitting, setIsSubmitting] = useState(false); const [statusMessage, setStatusMessage] = useState(null); + const prepareTransfer = usePrepareUsdcTransfer({ + to: PAYMENTS_RECIPIENT, + amount: selectedTier?.priceRaw ?? null, + holder: address, + }); + + const fees = prepareTransfer.data?.fees; + const isUnfunded = Boolean(reserve.data && !reserve.data.funded); + const isInsufficientXlm = Boolean( + reserve.data?.funded && + fees && + reserve.data.spendable < fees.totalFee + ); + const xlmDeficit = (reserve.data?.funded && fees && fees.totalFee > reserve.data.spendable) + ? fees.totalFee - reserve.data.spendable + : null; + const openCheckout = (tier: Tier) => { if (!tier.priceRaw) return; if (!isConnected) { @@ -124,8 +164,17 @@ export default function PremiumPage() { return; } - setStatusMessage(`Confirm the ${formatUsdc(selectedTier.priceRaw)} USDC transfer in your wallet…`); - const { txHash } = await transfer.mutateAsync({ to: PAYMENTS_RECIPIENT, amount: selectedTier.priceRaw }); + setStatusMessage(null); + const { txHash } = await transfer.mutateAsync({ + to: PAYMENTS_RECIPIENT, + amount: selectedTier.priceRaw, + prepared: prepareTransfer.data, + followUp: { + type: "unlock-daily-pass", + traceId: DAILY_PASS_TRACE_PLACEHOLDER, + amountRaw: selectedTier.priceRaw.toString(), + }, + }); setStatusMessage("Payment sent. Waiting for OracleDesk to verify it on-chain…"); await unlock.mutateAsync({ @@ -366,16 +415,61 @@ export default function PremiumPage() {
-
+
Network fee - Paid in XLM by your wallet + + {fees ? `≈ ${formatXlm(fees.totalFee)} XLM` : prepareTransfer.isLoading ? "calculating…" : "Paid in XLM"} ·{" "} + {reserve.isLoading + ? "checking…" + : reserve.isError + ? "couldn't check XLM balance" + : reserve.data && !reserve.data.funded + ? "unfunded" + : reserve.data + ? `spendable ${formatXlm(reserve.data.spendable, { maxDecimals: 1 })} XLM` + : "spendable —"} +
+ + {/* Blocking warnings */} + {isConnected && isUnfunded && ( +

+ Fund this account with XLM first. +

+ )} + {isConnected && isInsufficientXlm && xlmDeficit !== null && ( +

+ You need about {formatXlm(xlmDeficit)} more XLM to pay the network fee. +

+ )} +
Total Due {selectedTier.priceStr}
- - {statusMessage && ( + + {/* Live Tx phase */} + {transfer.isPending && ( +
+ {renderTxPhase(transfer.phase) ?? statusMessage ?? "Processing payment…"} + {"hash" in transfer.phase && transfer.phase.hash && ( + + View: {transfer.phase.hash.slice(0, 8)}… + + )} +
+ )} + + {/* Final or error status */} + {!transfer.isPending && statusMessage && (
{statusMessage}
@@ -384,9 +478,20 @@ export default function PremiumPage() {

Verified on-chain by OracleDesk before access is granted diff --git a/app/transaction-failed/page.tsx b/app/transaction-failed/page.tsx index 155829b..10519b2 100644 --- a/app/transaction-failed/page.tsx +++ b/app/transaction-failed/page.tsx @@ -1,187 +1,5 @@ -"use client"; - -import React, { useState, useEffect } from "react"; -import { DemoBadge } from "@/components/ui/demo-badge"; -import Link from "next/link"; +import { redirect } from "next/navigation"; export default function TransactionFailedPage() { - const [isVisible, setIsVisible] = useState(true); - - const closeModal = () => { - setIsVisible(false); - }; - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === "Escape") closeModal(); - }; - window.addEventListener("keydown", handleKeyDown); - return () => window.removeEventListener("keydown", handleKeyDown); - }, []); - - return ( -

- {/* Main Content Canvas (Blurred Background behind modal) */} -
- - {/* Institutional Grid Layout Mockup */} -
-
-
-

Open Positions

-
- Live Feed -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
MarketPositionEntryProbabilityAction
BTC ETF Approval Q1YES$0.42 -
-
-
-
-
- 72% -
-
- -
Fed Rate Cut - MarchNO$0.18 -
-
-
-
-
- 88% -
-
- -
-
-
-
- - {/* AI Reasoning Sidebar Mockup */} -
-
-
- psychology -

Oracle Insights

-
-

- High-frequency volatility detected in the "Electoral Outcome" markets. Institutional liquidity flow suggests a 4.2% shift towards the 'No' outcome within the last 15 minutes. -

-
-
- Risk Warning -

Liquidity depth for 'March Fed' is below standard thresholds for large orders.

-
-
-
-
-
- - {/* Modal Overlay */} - {isVisible && ( -
- {/* Fixed Backdrop - Blurs everything including global Navbar */} -
- - {/* Transaction Failed Modal */} -
- {/* Modal Header */} -
-
- error -
-

Transaction Failed

-

Your trade could not be processed on the blockchain.

-
- - {/* Modal Content (Error Details) */} -
-
-
- warning -
- Error Code: GAS_INSUFFICIENT_OR_SLIPPAGE -

- Execution failed due to slippage exceeding 0.5% or too little XLM in your wallet to pay the network fee. -

-
-
-
-
-
- Network fee (XLM) - — -
-
- Network Status - - - Congested - -
-
-
- - {/* Modal Footer */} -
- - -
-
-
- )} - - {/* Global Footer (Simplified for fail state) */} -
-
- OracleDesk Institutional -
- System Status - Legal - Privacy Policy -
-

© 2026 OracleDesk Institutional. All rights reserved.

-
-
-
- ); + redirect("/tx"); } diff --git a/app/transaction-status/page.tsx b/app/transaction-status/page.tsx index 6ed467e..31578f3 100644 --- a/app/transaction-status/page.tsx +++ b/app/transaction-status/page.tsx @@ -1,201 +1,5 @@ -"use client"; - -import React, { useState, useEffect } from "react"; -import Link from "next/link"; +import { redirect } from "next/navigation"; export default function TransactionStatusPage() { - const [step, setStep] = useState(1); - const [isVisible, setIsVisible] = useState(true); - - const simulateNextStep = () => { - if (step === 1) { - setStep(2); - } else { - closeModal(); - } - }; - - const closeModal = () => { - setIsVisible(false); - }; - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === "Escape") closeModal(); - }; - window.addEventListener("keydown", handleKeyDown); - return () => window.removeEventListener("keydown", handleKeyDown); - }, []); - - return ( -
- - - {/* Main Content Canvas (Background behind modal) */} -
- -
-
-
-

Active Positions

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - {/* Modal Overlay */} - {isVisible && ( -
- {/* Fixed Backdrop - Blurs everything including the global Navbar (z-50) */} -
- -
- {/* Modal Header */} -
-

- {step === 1 ? "Confirm Transaction" : "Transaction Submitted"} -

- -
- - {/* Modal Content Body */} -
- {step === 1 ? ( - /* Step 1: Confirm in Wallet */ -
-
- - - -
- account_balance_wallet -
-
-

Confirm in Wallet

-

Please check your wallet extension to authorize this trade on the Oracle Network.

-
- ) : ( - /* Step 2: Transaction Submitted */ -
-
- check_circle -
-

Transaction Submitted

-

Your trade has been broadcast to the network. Processing times may vary.

- - {/* Info Card */} -
-
- Status -
- - Broadcasting -
-
-
- TX Hash -
- 0x72a...83d2 - content_copy -
-
-
- - View on Explorer - open_in_new - -
- )} -
- - {/* Modal Footer */} -
- {step === 1 && ( - - )} - -
-
-
- )} - - {/* Terminal Log (Fixed Bottom Right) */} -
-
-
- ORACLE_SYSTEM_LOGS - v2.4.1 -
-

[14:22:10] Connection established: RPC_NODE_04

-

[14:22:11] Market: "BTC_PROB_75K_EOY" price feed synced

-

[14:23:45] Pending Transaction Detected: User_ID:0x...a1

-

_

-
-
-
- ); + redirect("/tx"); } diff --git a/app/transaction-success/page.tsx b/app/transaction-success/page.tsx index 7dcc828..11cdbb9 100644 --- a/app/transaction-success/page.tsx +++ b/app/transaction-success/page.tsx @@ -1,161 +1,5 @@ -"use client"; - -import React, { useState, useEffect } from "react"; -import { DemoBadge } from "@/components/ui/demo-badge"; -import Link from "next/link"; +import { redirect } from "next/navigation"; export default function TransactionSuccessPage() { - const [isVisible, setIsVisible] = useState(true); - - const closeModal = () => { - setIsVisible(false); - }; - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === "Escape") closeModal(); - }; - window.addEventListener("keydown", handleKeyDown); - return () => window.removeEventListener("keydown", handleKeyDown); - }, []); - - return ( -
- - - {/* Main Content Canvas (Blurred Background behind modal) */} -
- {/* Mock Portfolio Content */} -
-
-
Portfolio Performance
-
-
-
-
-
-
-
-
-
-
-
-
Recent Activity
-
-
-
-
-
-
-
-
-
- - {/* Modal Overlay */} - {isVisible && ( -
- {/* Backdrop - Blurs global Navbar (z-50) and background content */} -
- - {/* Transaction Success Modal */} -
- {/* Header/Icon Section */} -
-
- check_circle -
-

Transaction Successful

-

Your trade has been executed and confirmed on the blockchain.

-
- - {/* Trade Summary Card */} -
-
-
- MARKET - US Presidential Election 2029 -
-
-
- POSITION -
- - YES -
-
-
- CONTRACTS - 1,250 Shares -
-
- AVG. PRICE - $0.62 -
-
- TOTAL COST - $775.00 USDC -
-
-
- - {/* TX Hash & Details */} -
-
- Transaction Hash -
- 0x8a2b...f91c - open_in_new -
-
-
- Network Fee - — -
-
- Execution Time - 1.8s -
-
- - {/* Actions */} -
- - -
-
- - {/* Footer Meta */} -
- verified - Secured by OracleDesk Settlement Layer -
-
-
- )} - - {/* Background Decoration (AI Reasoning Card Style) */} -
-
- auto_awesome - Oracle Insight -
-

- "Whale accumulation detected in the YES direction over the last 4h. Sentiment remains bullish." -

-
-
- ); + redirect("/tx"); } diff --git a/app/tx/page.tsx b/app/tx/page.tsx new file mode 100644 index 0000000..8875fcc --- /dev/null +++ b/app/tx/page.tsx @@ -0,0 +1,346 @@ +"use client"; + +import React, { Suspense, useState } from "react"; +import Link from "next/link"; +import { useSearchParams } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { scValToNative } from "@stellar/stellar-sdk"; +import { rpcServer } from "@/lib/stellar/clients"; +import { explorerTx } from "@/lib/stellar/config"; +import { formatXlm } from "@/lib/stellar/units"; +import { describeError } from "@/lib/stellar/errors"; + +export default function TxPage() { + return ( + +
+ + } + > + +
+ ); +} + +function TxContent() { + const searchParams = useSearchParams(); + const rawHash = searchParams.get("hash")?.trim() ?? ""; + const isValidHex64 = /^[0-9a-fA-F]{64}$/.test(rawHash); + const hash = isValidHex64 ? rawHash.toLowerCase() : null; + + const [copied, setCopied] = useState(false); + + const { data, isLoading, isError, error, refetch, isFetching } = useQuery({ + queryKey: ["stellar", "tx", hash], + enabled: Boolean(hash), + queryFn: async () => { + if (!hash) return null; + return await rpcServer().getTransaction(hash); + }, + refetchInterval: (query) => { + // Keep polling if transaction is still pending or not yet found + if (query.state.data?.status === "NOT_FOUND") { + return 2000; + } + return false; + }, + staleTime: 10_000, + }); + + const handleCopy = () => { + if (!hash) return; + void navigator.clipboard.writeText(hash); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + if (!rawHash || !isValidHex64) { + return ( +
+
+
+ error +
+
+

Invalid Transaction Hash

+

+ {rawHash + ? "The transaction hash provided is not a valid 64-character hex string." + : "No transaction hash was provided in the query string."} +

+
+ + Back to Markets + +
+
+ ); + } + + if (isLoading) { + return ( +
+
+
+

Fetching Transaction

+

{hash}

+
+
+ ); + } + + if (isError || !data) { + return ( +
+
+
+ cloud_off +
+
+

RPC Query Failed

+

+ {error instanceof Error ? error.message : "Unable to reach the Stellar RPC server."} +

+
+
+ + + View on Explorer + +
+
+
+ ); + } + + const isNotFound = data.status === "NOT_FOUND"; + const isSuccess = data.status === "SUCCESS"; + const isFailed = data.status === "FAILED"; + + const settledData = isSuccess || isFailed ? data : null; + const ledger = settledData?.ledger ?? null; + const applicationOrder = settledData?.applicationOrder ?? null; + + // Parse result value or failure error + let parsedResult: string | null = null; + if (isSuccess && data.returnValue) { + try { + const native = scValToNative(data.returnValue); + parsedResult = typeof native === "bigint" ? native.toString() : JSON.stringify(native); + } catch { + parsedResult = null; + } + } + + let failureDescription: string | null = null; + if (isFailed && data.resultXdr) { + try { + failureDescription = describeError(data.resultXdr, "marketCore").message; + } catch { + failureDescription = "Transaction execution reverted on-chain."; + } + } + + const feeCharged = settledData ? formatXlm(BigInt(settledData.resultXdr.feeCharged().toString())) : null; + + return ( +
+
+ {/* Breadcrumb Navigation */} +
+ + Markets + + / + Transaction +
+ + {/* Main Details Card */} +
+ {/* Card Header */} +
+
+
+ + {isSuccess ? "check_circle" : isFailed ? "cancel" : "hourglass_top"} + +
+
+

+ {isSuccess + ? "Transaction Confirmed" + : isFailed + ? "Transaction Failed" + : "Pending / Expired from RPC"} +

+

+ {isSuccess + ? `Settled on Stellar ledger #${ledger}` + : isFailed + ? `Failed on ledger #${ledger ?? "unknown"}` + : "Not retained in recent RPC ledgers or still propagating"} +

+
+
+ + {/* Live refresh indicator */} + {isFetching && ( + + sync Syncing + + )} +
+ + {/* Details Body */} +
+ {/* Hash Row */} +
+ +
+ {hash} + +
+
+ + {/* NOT_FOUND State Notice */} + {isNotFound && ( +
+

Why is this transaction not found?

+

+ Stellar RPC nodes only retain transactions for a limited window of recent ledgers (~100 to 200 ledgers). + If this transaction was submitted earlier, it has been committed to the ledger history and can be viewed directly + on Stellar Expert block explorer. +

+
+ )} + + {/* Error Message for Failed Tx */} + {isFailed && failureDescription && ( +
+

Error Reason:

+

{failureDescription}

+
+ )} + + {/* On-Chain Metrics Grid */} +
+
+ + Status + + + {data.status} + +
+ +
+ + Ledger + + + {ledger ?? "—"} + +
+ +
+ + Fee Charged + + + {feeCharged ? `${feeCharged} XLM` : "—"} + +
+ +
+ + Application Order + + + {applicationOrder ?? "—"} + +
+
+ + {/* Return Value / Result Output */} + {parsedResult !== null && ( +
+ +
+ {parsedResult} +
+
+ )} +
+ + {/* Action Footer */} +
+
+ + Explore Markets + + + Portfolio + +
+ + + View on Stellar Expert + open_in_new + +
+
+
+
+ ); +} diff --git a/components/ui/tx-toast.tsx b/components/ui/tx-toast.tsx new file mode 100644 index 0000000..9ab84fa --- /dev/null +++ b/components/ui/tx-toast.tsx @@ -0,0 +1,189 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import Link from "next/link"; +import { useWallet } from "@/lib/contexts/WalletContext"; +import { explorerTx } from "@/lib/stellar/config"; +import { formatUsdc } from "@/lib/stellar/units"; +import { useTxTracker, type TrackedTx } from "@/lib/stellar/tx-tracker"; +import { unlockDailyPass } from "@/lib/api/traces"; + +export function TxToastContainer() { + const { list, dismiss } = useTxTracker(); + const { address } = useWallet(); + const [showAll, setShowAll] = useState(false); + const [isOpen, setIsOpen] = useState(true); + const [unlockingHash, setUnlockingHash] = useState(null); + const [unlockSuccess, setUnlockSuccess] = useState>({}); + const [unlockError, setUnlockError] = useState>({}); + + useEffect(() => { + function handleKeyDown(e: KeyboardEvent) { + if (e.key === "Escape") { + setIsOpen(false); + } + } + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, []); + + const visibleList = list.filter((tx) => (showAll || !address ? true : tx.holder === address)); + + if (!isOpen || visibleList.length === 0) return null; + + const handleUnlock = async (tx: TrackedTx) => { + if (!tx.followUp || tx.followUp.type !== "unlock-daily-pass") return; + setUnlockingHash(tx.hash); + setUnlockError((prev) => ({ ...prev, [tx.hash]: "" })); + try { + await unlockDailyPass(tx.followUp.traceId, tx.hash, tx.followUp.amountRaw); + setUnlockSuccess((prev) => ({ ...prev, [tx.hash]: true })); + } catch (err: unknown) { + setUnlockError((prev) => ({ + ...prev, + [tx.hash]: err instanceof Error ? err.message : "Failed to activate pass", + })); + } finally { + setUnlockingHash(null); + } + }; + + return ( + + ); +} diff --git a/docs/architecture.md b/docs/architecture.md index e3c4e85..1023f57 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -27,7 +27,21 @@ A backend market links to the chain through `onChainMarketId` (market-core's `u6 - Reads are simulations (no fee, no signature). - Writes (`useBuy`, `useSell`, `useRedeem`, `useUsdcTransfer`) check that a wallet is connected and on the right network, simulate, then `signAndSend`. - `useBuy` quotes again immediately before building the transaction and sets `min_shares_out = minOut(quote, slippageBps)`, so slippage is enforced on-chain. -- `useSell` turns "sell N shares" into the exact `collateral_out` the contract needs, using the contract's own FPMM math (`generated/fpmm.ts`) on freshly read reserves, with `max_shares_in` slightly above N (see the contracts repo's `docs/frontend-integration.md`). +## Write path and transaction lifecycle + +Every state-changing write (`useBuy`, `useSell`, `useRedeem`, `useUsdcTransfer`) follows an explicit, observable lifecycle governed by `TxLifecycle` in `lib/stellar/tx-lifecycle.ts`: + +1. **Fee Preview & Simulation**: Before signing, `usePrepareBuy` and `usePrepareUsdcTransfer` simulate the transaction. `lib/stellar/fees.ts` calculates `feeBreakdown` (inclusion fee, resource fee, and Soroban resource footprint) and computes `spendableXlm` from the account ledger entry following CAP-33 rules (`minBalance = (2 + numSubEntries + numSponsoring - numSponsored) * baseReserve`). If spendable XLM is below the estimated total fee, the UI disables submission with an exact deficit warning. +2. **Observable Lifecycle Phases**: `useTxRunner` drives the transaction through typed phases: + - `building` → `simulating` → `awaiting-signature` → `submitting` (hash available) → `pending` (polling with backoff) → `confirmed` | `failed` | `expired`. + - Expiration is determined from `latestLedgerCloseTime` reported by Stellar RPC, not the browser clock. + - Statuses and errors (`PENDING`, `DUPLICATE`, `TRY_AGAIN_LATER`, `ERROR`, `txBadSeq`, `op_low_reserve`, etc.) are mapped cleanly to `TxDescribedError`. +3. **Session Transaction Tracker (`lib/stellar/tx-tracker.tsx`)**: + - `TransactionTrackerProvider` mounted in `WalletProvider` captures every submitted transaction as soon as the hash is known. + - Transactions are serialized to `sessionStorage` (`oracledesk_pending_txs`) with BigInt amounts as strings, resuming polling on page reload. + - Polling across multiple browser tabs is coordinated with `BroadcastChannel("oracledesk-tx")` to ensure only one tab polls the RPC server. + - Upon confirmation, `tradeInvalidationKeys` performs React Query cache invalidations across market, positions, and balance queries even if the initiating component unmounted. + - The `` component (`components/ui/tx-toast.tsx`) renders accessible toasts announcing state transitions and supports resuming premium daily pass activation follow-ups. ## Amounts diff --git a/docs/manual-test.md b/docs/manual-test.md index 49c53ea..9440e42 100644 --- a/docs/manual-test.md +++ b/docs/manual-test.md @@ -96,8 +96,18 @@ To try the same on market 0 (resolved): the buy button is disabled and the panel - [ ] Wallet menu → Disconnect. The button returns to **Connect Wallet**, and `oracledesk_token` is gone from Local Storage. +## 11. Low XLM and reserve check (fee preview) + +- [ ] On testnet, connect with an account that has only ~1.5 XLM and a USDC trustline (or an account unfunded by Friendbot). +- [ ] Open `http://localhost:3000/markets/quick-view?onChainId=`. +- [ ] Observe the fee preview line under the quote: `Network fee ≈ X XLM · spendable Y XLM` (hover for the inclusion + resource fee breakdown and network base reserve note). +- [ ] If unfunded: verify the message "Fund this account with XLM first." is displayed and the Buy button is disabled. +- [ ] If spendable XLM is below the total fee: verify the message "You need about X more XLM to pay the network fee." is displayed and the Buy button is disabled. +- [ ] Verify the same fee preview, spendable XLM display, and blocking warnings appear on `/copy-trade` (next to slippage text) and `/premium` (in the checkout modal above the pay button). + ## Also worth clicking - [ ] `/premium` → **Get a daily pass** → **Pay with wallet**. Freighter shows a USDC `transfer` to the treasury (`CBTFA3EP…`) for 0.50 USDC. After approval the backend verifies it on-chain and says the pass is active. Note: until `PAYMENTS_RECIPIENT` is decided, this payment becomes treasury trading capital (see docs/STATUS.md). - [ ] `/copy-trade?marketId=&traceId=`: the side comes from the trace's edge. With no trace or zero edge the confirm button is disabled and the page explains why. - [ ] `/admin` with an address not in `NEXT_PUBLIC_ADMIN_ADDRESSES` shows "Access Denied". +- [ ] `/tx?hash=<64-hex>` inspects live ledger state and fee charged for any testnet transaction, falling back cleanly to Stellar Expert when outside RPC retention. diff --git a/lib/hooks/useStellar.ts b/lib/hooks/useStellar.ts index 574738f..e2a2532 100644 --- a/lib/hooks/useStellar.ts +++ b/lib/hooks/useStellar.ts @@ -1,63 +1,49 @@ "use client"; +import { useCallback, useRef, useSyncExternalStore } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Keypair, scValToNative, xdr } from "@stellar/stellar-sdk"; import type { AssembledTransaction } from "@stellar/stellar-sdk/contract"; import { useWallet } from "@/lib/contexts/WalletContext"; -import { marketCore, reasoningRegistry, token, Outcomes, type OutcomeTag, type Signer } from "@/lib/stellar/clients"; -import { describeError, UserFacingError, type ContractName } from "@/lib/stellar/errors"; +import { marketCore, reasoningRegistry, token, Outcomes, rpcServer, type OutcomeTag, type Signer } from "@/lib/stellar/clients"; +import { UserFacingError, type ContractName } from "@/lib/stellar/errors"; import { collateralOutForShares, priceYesBps } from "@/lib/stellar/generated/fpmm"; import type { Market as OnChainMarket, Position } from "@/lib/stellar/generated/market-core"; import { fetchAndVerifyTrace, type TraceCheck } from "@/lib/stellar/trace"; import { maxIn, minOut } from "@/lib/stellar/units"; +import { + feeBreakdown, + fetchBaseReserve, + spendableXlm, + type AccountReserve, + type FeeBreakdown, +} from "@/lib/stellar/fees"; +import { + simulated, + TxLifecycle, + type TxPhase, +} from "@/lib/stellar/tx-lifecycle"; +import { useTxTracker } from "@/lib/stellar/tx-tracker"; +import { tradeInvalidationKeys } from "@/lib/stellar/tx-tracker-core"; +import { NETWORK_PASSPHRASE } from "@/lib/stellar/config"; + +export { simulated }; +export { tradeInvalidationKeys }; /** Query keys all start with "stellar" so a disconnect can drop them in one go. */ export const stellarKeys = { marketCount: ["stellar", "marketCount"] as const, market: (id: string) => ["stellar", "market", id] as const, - markets: (limit: number) => ["stellar", "markets", limit] as const, + markets: (limit = 20) => ["stellar", "markets", limit] as const, position: (id: string, holder: string) => ["stellar", "position", id, holder] as const, balance: (owner: string) => ["stellar", "usdcBalance", owner] as const, + account: (addr: string) => ["stellar", "account", addr] as const, quoteBuy: (id: string, outcome: OutcomeTag, amount: string) => ["stellar", "quoteBuy", id, outcome, amount] as const, trace: (id: string) => ["stellar", "trace", id] as const, }; const toId = (id: bigint | string | number) => BigInt(id); -/** - * The value of a simulated call. Contract `Result`s are unwrapped; failures - * become a UserFacingError named from the simulation's "Error(Contract, #N)". - */ -export function simulated(tx: AssembledTransaction, contract: ContractName = "marketCore"): T { - const sim = tx.simulation as { error?: string } | undefined; - let raw: unknown; - try { - raw = tx.result; - } catch (err) { - throw new UserFacingError(describeError(`${sim?.error ?? ""} ${String(err)}`, contract), err); - } - if (raw && typeof raw === "object" && "isOk" in raw && typeof (raw as { isOk: unknown }).isOk === "function") { - const result = raw as { isOk(): boolean; unwrap(): T }; - if (!result.isOk()) throw new UserFacingError(describeError(`${sim?.error ?? ""}`, contract), raw); - return result.unwrap(); - } - return raw as T; -} - -async function send(tx: AssembledTransaction, contract: ContractName = "marketCore"): Promise<{ value: T; txHash: string | null }> { - // Surface simulation failures before asking the wallet to sign. - simulated(tx, contract); - try { - const sent = await tx.signAndSend(); - const value = sent.result as unknown; - const unwrapped = - value && typeof value === "object" && "unwrap" in value ? (value as { unwrap(): T }).unwrap() : (value as T); - return { value: unwrapped, txHash: sent.sendTransactionResponse?.hash ?? null }; - } catch (err) { - if (err instanceof UserFacingError) throw err; - throw new UserFacingError(describeError(err, contract), err); - } -} - // ─── Reads ────────────────────────────────────────────────────────────────── export function useMarketCount() { @@ -130,6 +116,87 @@ export function useUsdcBalance(owner: string | null | undefined) { }); } +export interface AccountReserveState extends AccountReserve { + funded: boolean; +} + +/** Reads account entry via getLedgerEntries on the account key. */ +export function useAccountReserve(address: string | null | undefined) { + return useQuery({ + queryKey: stellarKeys.account(address ?? ""), + enabled: Boolean(address), + queryFn: async (): Promise => { + if (!address) { + return { + funded: false, + balance: 0n, + minBalance: 0n, + sellingLiabilities: 0n, + spendable: 0n, + subentries: 0, + sponsoring: 0, + sponsored: 0, + }; + } + try { + const kp = Keypair.fromPublicKey(address); + const key = xdr.LedgerKey.account( + new xdr.LedgerKeyAccount({ + accountId: kp.xdrPublicKey(), + }), + ); + const res = await rpcServer().getLedgerEntries(key); + if (!res.entries || res.entries.length === 0) { + return { + funded: false, + balance: 0n, + minBalance: 0n, + sellingLiabilities: 0n, + spendable: 0n, + subentries: 0, + sponsoring: 0, + sponsored: 0, + }; + } + + let accountEntry: xdr.AccountEntry | null = null; + const raw = res.entries[0] as unknown as { val?: xdr.LedgerEntryData; xdr?: string }; + if (raw.val && typeof raw.val.account === "function") { + accountEntry = raw.val.account(); + } else if (typeof raw.xdr === "string") { + const ledgerEntryData = xdr.LedgerEntryData.fromXDR(raw.xdr, "base64"); + accountEntry = ledgerEntryData.account(); + } + + if (!accountEntry) { + return { + funded: false, + balance: 0n, + minBalance: 0n, + sellingLiabilities: 0n, + spendable: 0n, + subentries: 0, + sponsoring: 0, + sponsored: 0, + }; + } + + const baseReserve = await fetchBaseReserve(); + const reserve = spendableXlm(accountEntry, baseReserve); + return { + funded: true, + ...reserve, + }; + } catch (err) { + // Fall back gracefully if account fetch fails + throw err; + } + }, + staleTime: 15_000, + refetchInterval: 30_000, + }); +} + /** Shares a buy would return right now. Debounce `collateralIn` at the call site. */ export function useQuoteBuy(id: bigint | string | null | undefined, outcome: OutcomeTag, collateralIn: bigint | null) { return useQuery({ @@ -143,6 +210,109 @@ export function useQuoteBuy(id: bigint | string | null | undefined, outcome: Out }); } +export interface PreparedBuy { + tx: AssembledTransaction; + fees: FeeBreakdown; + quote: bigint; + minSharesOut: bigint; + preparedAt: number; +} + +/** Pre-builds and simulates a buy transaction to preview fees and min shares. */ +export function usePrepareBuy(params: { + marketId: bigint | string | null | undefined; + outcome: OutcomeTag; + collateralIn: bigint | null; + slippageBps: number; + holder: string | null | undefined; +}) { + const { marketId, outcome, collateralIn, slippageBps, holder } = params; + return useQuery({ + queryKey: [ + "stellar", + "prepareBuy", + marketId?.toString() ?? "", + outcome, + collateralIn?.toString() ?? "", + slippageBps, + holder ?? "", + ] as const, + enabled: Boolean(marketId) && Boolean(holder) && collateralIn !== null && collateralIn > 0n, + queryFn: async (): Promise => { + const id = toId(marketId!); + const quote = simulated( + await marketCore().quote_buy({ + market_id: id, + outcome: Outcomes[outcome], + collateral_in: collateralIn!, + }), + ); + const minSharesOut = minOut(quote, slippageBps); + const dummySigner: Signer = { + publicKey: holder!, + signTransaction: async (xdr) => ({ signedTxXdr: xdr }), + }; + const tx = await marketCore(dummySigner).buy({ + trader: holder!, + market_id: id, + outcome: Outcomes[outcome], + collateral_in: collateralIn!, + min_shares_out: minSharesOut, + }); + const fees = feeBreakdown(tx); + return { + tx, + fees, + quote, + minSharesOut, + preparedAt: Date.now(), + }; + }, + staleTime: 5_000, + }); +} + +export interface PreparedUsdcTransfer { + tx: AssembledTransaction; + fees: FeeBreakdown; + amount: bigint; + preparedAt: number; +} + +/** Pre-builds and simulates a SAC transfer to preview network fees. */ +export function usePrepareUsdcTransfer(params: { + to: string | null | undefined; + amount: bigint | null; + holder: string | null | undefined; +}) { + const { to, amount, holder } = params; + return useQuery({ + queryKey: [ + "stellar", + "prepareUsdcTransfer", + to ?? "", + amount?.toString() ?? "", + holder ?? "", + ] as const, + enabled: Boolean(to) && Boolean(holder) && amount !== null && amount > 0n, + queryFn: async (): Promise => { + const dummySigner: Signer = { + publicKey: holder!, + signTransaction: async (xdr) => ({ signedTxXdr: xdr }), + }; + const tx = await token.transfer({ from: holder!, to: to!, amount: amount! }, dummySigner); + const fees = feeBreakdown(tx); + return { + tx, + fees, + amount: amount!, + preparedAt: Date.now(), + }; + }, + staleTime: 5_000, + }); +} + export interface VerifiedTrace { onChainTraceId: string; marketId: string; @@ -199,16 +369,43 @@ function useWriteGuard(): () => Signer { }; } -function useInvalidateAfterTrade() { +export function useInvalidateAfterTrade() { const queryClient = useQueryClient(); return (marketId: string, holder: string) => { - queryClient.invalidateQueries({ queryKey: stellarKeys.market(marketId) }); - queryClient.invalidateQueries({ queryKey: ["stellar", "markets"] }); - queryClient.invalidateQueries({ queryKey: stellarKeys.position(marketId, holder) }); - queryClient.invalidateQueries({ queryKey: stellarKeys.balance(holder) }); + for (const key of tradeInvalidationKeys(marketId, holder)) { + queryClient.invalidateQueries({ queryKey: key }); + } }; } +function useTxRunner(contract: ContractName) { + const ref = useRef | null>(null); + const phase = useSyncExternalStore( + useCallback((cb: () => void) => ref.current?.subscribe(cb) ?? (() => {}), []), + useCallback(() => ref.current?.getSnapshot() ?? ({ name: "building" } as TxPhase), []), + useCallback(() => ({ name: "building" } as TxPhase), []), + ); + + const start = useCallback( + ( + tx: AssembledTransaction, + parse: (v: xdr.ScVal | undefined) => R, + onHash?: (hash: string) => void, + ): Promise<{ value: R; txHash: string }> => { + const runner = new TxLifecycle({ + server: rpcServer(), + contract, + onHash, + }); + ref.current = runner as TxLifecycle; + return runner.run(tx as unknown as AssembledTransaction, parse); + }, + [contract], + ); + + return { phase, start }; +} + export interface BuyParams { marketId: bigint | string; outcome: OutcomeTag; @@ -220,31 +417,78 @@ export interface BuyParams { * Re-quotes right before building the transaction and sets * min_shares_out = minOut(quote, slippageBps), so slippage is enforced * on-chain (SlippageExceeded otherwise). + * + * Unmount safety: The underlying TxLifecycle runner keeps polling if the component + * unmounts so React Query's mutation promise resolves and onSuccess cache invalidations + * complete reliably. */ export function useBuy() { const guard = useWriteGuard(); const invalidate = useInvalidateAfterTrade(); - return useMutation({ - mutationFn: async ({ marketId, outcome, collateralIn, slippageBps }: BuyParams) => { + const runner = useTxRunner("marketCore"); + const tracker = useTxTracker(); + + const mutation = useMutation({ + mutationFn: async ({ + marketId, + outcome, + collateralIn, + slippageBps, + prepared, + }: BuyParams & { prepared?: PreparedBuy }) => { const signer = guard(); if (collateralIn <= 0n) throw new UserFacingError({ kind: "contract", message: "Enter an amount greater than zero." }); const id = toId(marketId); - const quote = simulated( - await marketCore().quote_buy({ market_id: id, outcome: Outcomes[outcome], collateral_in: collateralIn }), - ); - const minSharesOut = minOut(quote, slippageBps); - const tx = await marketCore(signer).buy({ - trader: signer.publicKey, - market_id: id, - outcome: Outcomes[outcome], - collateral_in: collateralIn, - min_shares_out: minSharesOut, - }); - const { value, txHash } = await send(tx); + + let tx: AssembledTransaction; + let quote: bigint; + let minSharesOut: bigint; + + const isFresh = prepared && Date.now() - prepared.preparedAt < 15_000; + if (isFresh && prepared) { + tx = prepared.tx; + quote = prepared.quote; + minSharesOut = prepared.minSharesOut; + } else { + quote = simulated( + await marketCore().quote_buy({ market_id: id, outcome: Outcomes[outcome], collateral_in: collateralIn }), + ); + minSharesOut = minOut(quote, slippageBps); + tx = await marketCore(signer).buy({ + trader: signer.publicKey, + market_id: id, + outcome: Outcomes[outcome], + collateral_in: collateralIn, + min_shares_out: minSharesOut, + }); + } + + const onHash = (hash: string) => { + tracker.track({ + hash, + kind: "buy", + holder: signer.publicKey, + marketId: String(marketId), + outcome, + amounts: { collateralIn: collateralIn.toString(), minSharesOut: minSharesOut.toString() }, + networkPassphrase: NETWORK_PASSPHRASE, + }); + }; + + const parse = (val: xdr.ScVal | undefined) => { + return (val ? scValToNative(val) : quote) as bigint; + }; + + const { value, txHash } = await runner.start(tx, parse, onHash); return { sharesOut: value, quotedShares: quote, minSharesOut, txHash, holder: signer.publicKey }; }, onSuccess: (d, v) => invalidate(String(v.marketId), d.holder), }); + + return { + ...mutation, + phase: runner.phase, + }; } export interface SellParams { @@ -255,16 +499,13 @@ export interface SellParams { slippageBps: number; } -/** - * `sell` takes an exact collateral_out, not a share count. Per the contracts - * repo's frontend-integration.md: read fresh reserves, compute - * collateral_out for the share count with the contract's FPMM math, and cap - * max_shares_in a little above the target. - */ export function useSell() { const guard = useWriteGuard(); const invalidate = useInvalidateAfterTrade(); - return useMutation({ + const runner = useTxRunner("marketCore"); + const tracker = useTxTracker(); + + const mutation = useMutation({ mutationFn: async ({ marketId, outcome, shares, slippageBps }: SellParams) => { const signer = guard(); const id = toId(marketId); @@ -276,7 +517,6 @@ export function useSell() { } catch { throw new UserFacingError({ kind: "contract", message: "There isn't enough liquidity to sell that many shares." }); } - // +1 covers the off-chain estimate's rounding; slippage covers price moves. const maxSharesIn = maxIn(shares, slippageBps) + 1n; const tx = await marketCore(signer).sell({ trader: signer.publicKey, @@ -285,37 +525,111 @@ export function useSell() { collateral_out: collateralOut, max_shares_in: maxSharesIn, }); - const { value, txHash } = await send(tx); + + const onHash = (hash: string) => { + tracker.track({ + hash, + kind: "sell", + holder: signer.publicKey, + marketId: String(marketId), + outcome, + amounts: { shares: shares.toString(), maxSharesIn: maxSharesIn.toString() }, + networkPassphrase: NETWORK_PASSPHRASE, + }); + }; + + const parse = (val: xdr.ScVal | undefined) => { + return (val ? scValToNative(val) : shares) as bigint; + }; + + const { value, txHash } = await runner.start(tx, parse, onHash); return { sharesSold: value, collateralOut, maxSharesIn, txHash, holder: signer.publicKey }; }, onSuccess: (d, v) => invalidate(String(v.marketId), d.holder), }); + + return { + ...mutation, + phase: runner.phase, + }; } export function useRedeem() { const guard = useWriteGuard(); const invalidate = useInvalidateAfterTrade(); - return useMutation({ + const runner = useTxRunner("marketCore"); + const tracker = useTxTracker(); + + const mutation = useMutation({ mutationFn: async ({ marketId }: { marketId: bigint | string }) => { const signer = guard(); const tx = await marketCore(signer).redeem({ holder: signer.publicKey, market_id: toId(marketId) }); - const { value, txHash } = await send(tx); + + const onHash = (hash: string) => { + tracker.track({ + hash, + kind: "redeem", + holder: signer.publicKey, + marketId: String(marketId), + amounts: {}, + networkPassphrase: NETWORK_PASSPHRASE, + }); + }; + + const parse = (val: xdr.ScVal | undefined) => { + return (val ? scValToNative(val) : 0n) as bigint; + }; + + const { value, txHash } = await runner.start(tx, parse, onHash); return { payout: value, txHash, holder: signer.publicKey }; }, onSuccess: (d, v) => invalidate(String(v.marketId), d.holder), }); + + return { + ...mutation, + phase: runner.phase, + }; +} + +export interface UsdcTransferParams { + to: string; + amount: bigint; + followUp?: { type: "unlock-daily-pass"; traceId: string; amountRaw: string }; + prepared?: PreparedUsdcTransfer; } /** SEP-41 transfer on the USDC SAC, signed by the connected wallet. */ export function useUsdcTransfer() { const guard = useWriteGuard(); const queryClient = useQueryClient(); - return useMutation({ - mutationFn: async ({ to, amount }: { to: string; amount: bigint }) => { + const runner = useTxRunner("marketCore"); + const tracker = useTxTracker(); + + const mutation = useMutation({ + mutationFn: async ({ to, amount, followUp, prepared }: UsdcTransferParams) => { const signer = guard(); if (amount <= 0n) throw new UserFacingError({ kind: "contract", message: "Enter an amount greater than zero." }); - const tx = await token.transfer({ from: signer.publicKey, to, amount }, signer); - const { txHash } = await send(tx); + + const isFresh = prepared && Date.now() - prepared.preparedAt < 15_000; + const tx = isFresh && prepared + ? (prepared.tx as unknown as AssembledTransaction) + : await token.transfer({ from: signer.publicKey, to, amount }, signer); + + const onHash = (hash: string) => { + tracker.track({ + hash, + kind: "usdc-transfer", + holder: signer.publicKey, + amounts: { amount: amount.toString() }, + networkPassphrase: NETWORK_PASSPHRASE, + followUp, + }); + }; + + const parse = () => null; + + const { txHash } = await runner.start(tx, parse, onHash); if (!txHash) throw new UserFacingError({ kind: "unknown", message: "The payment was sent but no transaction hash came back." }); return { txHash, holder: signer.publicKey }; }, @@ -323,4 +637,9 @@ export function useUsdcTransfer() { queryClient.invalidateQueries({ queryKey: stellarKeys.balance(d.holder) }); }, }); + + return { + ...mutation, + phase: runner.phase, + }; } diff --git a/lib/stellar/WalletProvider.tsx b/lib/stellar/WalletProvider.tsx index ae89ea6..715d2f5 100644 --- a/lib/stellar/WalletProvider.tsx +++ b/lib/stellar/WalletProvider.tsx @@ -7,6 +7,7 @@ import { clearAuthSession, getStoredSessionWallet, signInWithWallet } from "@/li import { NETWORK_PASSPHRASE } from "./config"; import { describeError } from "./errors"; import type { Signer } from "./clients"; +import { TransactionTrackerProvider } from "./tx-tracker"; type Kit = typeof import("@creit.tech/stellar-wallets-kit").StellarWalletsKit; @@ -204,7 +205,9 @@ export function WalletProvider({ children }: { children: ReactNode }) { return ( - {children} + + {children} + ); } diff --git a/lib/stellar/__tests__/errors.test.ts b/lib/stellar/__tests__/errors.test.ts index c2c333e..1c11bfe 100644 --- a/lib/stellar/__tests__/errors.test.ts +++ b/lib/stellar/__tests__/errors.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; -import { describeError } from "../errors"; +import { xdr, type rpc } from "@stellar/stellar-sdk"; +import { describeError, describeSubmission } from "../errors"; describe("describeError", () => { it("maps market-core contract errors by code", () => { @@ -28,8 +29,89 @@ describe("describeError", () => { expect(describeError("Error(Contract, #13) ... trustline entry is missing for account").kind).toBe("no-trustline"); }); + it("maps op_low_reserve and txInsufficientBalance to insufficient-xlm while preserving USDC balance mapping", () => { + expect(describeError("op_low_reserve").kind).toBe("insufficient-xlm"); + expect(describeError("txInsufficientBalance").kind).toBe("insufficient-xlm"); + expect(describeError("tx_insufficient_balance").kind).toBe("insufficient-xlm"); + // USDC balance still wins + expect(describeError("balance is not sufficient to spend").kind).toBe("insufficient-balance"); + expect(describeError("insufficient balance").kind).toBe("insufficient-balance"); + expect(describeError("op_underfunded").kind).toBe("insufficient-balance"); + }); + it("falls back to a readable message", () => { expect(describeError(new TypeError("Failed to fetch")).kind).toBe("network"); expect(describeError(42).message).toMatch(/something went wrong/i); }); }); + +describe("describeSubmission", () => { + it("maps TRY_AGAIN_LATER and DUPLICATE", () => { + const tryAgain = describeSubmission({ + status: "TRY_AGAIN_LATER", + hash: "1234", + latestLedger: 10, + latestLedgerCloseTime: 100, + } as rpc.Api.SendTransactionResponse); + expect(tryAgain.kind).toBe("submission"); + expect(tryAgain.submission).toBe("try-again-later"); + + const dup = describeSubmission({ + status: "DUPLICATE", + hash: "1234", + latestLedger: 10, + latestLedgerCloseTime: 100, + } as rpc.Api.SendTransactionResponse); + expect(dup.kind).toBe("submission"); + expect(dup.submission).toBe("duplicate"); + }); + + it("maps ERROR result codes txBadSeq, txInsufficientFee, txTooLate, txInsufficientBalance", () => { + const makeError = (resultArm: () => xdr.TransactionResultResult) => + ({ + status: "ERROR", + hash: "1234", + latestLedger: 10, + latestLedgerCloseTime: 100, + errorResult: new xdr.TransactionResult({ + feeCharged: xdr.Int64.fromString("100"), + result: resultArm(), + ext: new xdr.TransactionResultExt(0), + }), + }) as unknown as rpc.Api.SendTransactionResponse; + + const badSeq = describeSubmission(makeError(() => xdr.TransactionResultResult.txBadSeq())); + expect(badSeq.resultCode).toBe("txBadSeq"); + expect(badSeq.submission).toBe("rejected-by-network"); + + const lowFee = describeSubmission(makeError(() => xdr.TransactionResultResult.txInsufficientFee())); + expect(lowFee.resultCode).toBe("txInsufficientFee"); + + const tooLate = describeSubmission(makeError(() => xdr.TransactionResultResult.txTooLate())); + expect(tooLate.resultCode).toBe("txTooLate"); + + const noXlm = describeSubmission(makeError(() => xdr.TransactionResultResult.txInsufficientBalance())); + expect(noXlm.kind).toBe("insufficient-xlm"); + expect(noXlm.resultCode).toBe("txInsufficientBalance"); + }); + + it("falls through to contract errors on txFailed", () => { + const failedContract = { + status: "ERROR", + hash: "1234", + latestLedger: 10, + latestLedgerCloseTime: 100, + errorResult: new xdr.TransactionResult({ + feeCharged: xdr.Int64.fromString("100"), + result: xdr.TransactionResultResult.txFailed([]), + ext: new xdr.TransactionResultExt(0), + }), + message: "HostError: Error(Contract, #12)", + } as unknown as rpc.Api.SendTransactionResponse; + + const result = describeSubmission(failedContract, "marketCore"); + expect(result.code).toBe("SlippageExceeded"); + expect(result.resultCode).toBe("txFailed"); + expect(result.submission).toBe("rejected-by-network"); + }); +}); diff --git a/lib/stellar/__tests__/fees.test.ts b/lib/stellar/__tests__/fees.test.ts new file mode 100644 index 0000000..d82a8fa --- /dev/null +++ b/lib/stellar/__tests__/fees.test.ts @@ -0,0 +1,164 @@ +import { describe, expect, it } from "vitest"; +import { xdr } from "@stellar/stellar-sdk"; +import type { AssembledTransaction } from "@stellar/stellar-sdk/contract"; +import { + DEFAULT_BASE_RESERVE, + feeBreakdown, + fetchBaseReserve, + SimulationError, + spendableXlm, +} from "../fees"; +import { formatXlm } from "../units"; +import accountEntryFixture from "./fixtures/account-entry.json"; +import buySimulationFixture from "./fixtures/buy-simulation.json"; + +describe("feeBreakdown", () => { + it("splits inclusion and resource fee from a recorded simulation", () => { + const txData = xdr.SorobanTransactionData.fromXDR(buySimulationFixture.transactionDataXdr, "base64"); + const fakeTx = { + built: { fee: buySimulationFixture.fee }, + simulation: { + minResourceFee: buySimulationFixture.minResourceFee, + transactionData: { + build: () => txData, + }, + }, + } as unknown as AssembledTransaction; + + const breakdown = feeBreakdown(fakeTx); + + expect(breakdown.totalFee).toBe(50_000n); + expect(breakdown.resourceFee).toBe(35_000n); + expect(breakdown.inclusionFee).toBe(15_000n); + expect(breakdown.minResourceFee).toBe(25_000n); + expect(breakdown.resources).toEqual({ + instructions: 450_000, + readBytes: 1200, + writeBytes: 640, + readEntries: 1, + writeEntries: 1, + }); + }); + + it("keeps values as bigint", () => { + const txData = xdr.SorobanTransactionData.fromXDR(buySimulationFixture.transactionDataXdr, "base64"); + const fakeTx = { + built: { fee: "10000000" }, + simulation: { + minResourceFee: "2000000", + transactionData: txData, + }, + } as unknown as AssembledTransaction; + + const breakdown = feeBreakdown(fakeTx); + expect(typeof breakdown.totalFee).toBe("bigint"); + expect(typeof breakdown.resourceFee).toBe("bigint"); + expect(typeof breakdown.inclusionFee).toBe("bigint"); + expect(typeof breakdown.minResourceFee).toBe("bigint"); + }); + + it("throws SimulationError on simulation error or restore response", () => { + const errTx = { + built: { fee: "100" }, + simulation: { error: "HostError: Error(Contract, #1)" }, + } as unknown as AssembledTransaction; + expect(() => feeBreakdown(errTx)).toThrow(SimulationError); + + const restoreTx = { + built: { fee: "100" }, + simulation: { restorePreamble: {} }, + } as unknown as AssembledTransaction; + expect(() => feeBreakdown(restoreTx)).toThrow(SimulationError); + }); +}); + +describe("spendableXlm", () => { + it("uses 2 + subentries base reserves", () => { + const entry = new xdr.AccountEntry({ + accountId: xdr.PublicKey.publicKeyTypeEd25519(Buffer.alloc(32)), + balance: xdr.Int64.fromString("100000000"), // 10 XLM + seqNum: xdr.Int64.fromString("1"), + numSubEntries: 3, + inflationDest: null, + flags: 0, + homeDomain: "", + thresholds: Buffer.from([1, 1, 1, 1]), + signers: [], + ext: new xdr.AccountEntryExt(0), + }); + + const baseReserve = 5_000_000n; // 0.5 XLM + const res = spendableXlm(entry, baseReserve); + + // minBalance = (2 + 3) * 0.5 XLM = 2.5 XLM = 25,000,000 stroops + expect(res.minBalance).toBe(25_000_000n); + expect(res.sellingLiabilities).toBe(0n); + expect(res.spendable).toBe(75_000_000n); + expect(res.subentries).toBe(3); + expect(res.sponsoring).toBe(0); + expect(res.sponsored).toBe(0); + }); + + it("accounts for sponsoring and sponsored counts", () => { + const entry = xdr.AccountEntry.fromXDR(accountEntryFixture.accountEntryXdr, "base64"); + const baseReserve = 5_000_000n; + const res = spendableXlm(entry, baseReserve); + + // From fixture: balance = 100_000_000n, subentries = 2, sponsoring = 2, sponsored = 1, sellingLiabilities = 5_000_000n + // minBalance = (2 + 2 + 2 - 1) * 5_000_000 = 5 * 5_000_000 = 25_000_000n + expect(res.minBalance).toBe(25_000_000n); + expect(res.sellingLiabilities).toBe(5_000_000n); + // spendable = 100_000_000 - 25_000_000 - 5_000_000 = 70_000_000n + expect(res.spendable).toBe(70_000_000n); + expect(res.sponsoring).toBe(2); + expect(res.sponsored).toBe(1); + expect(res.subentries).toBe(2); + }); + + it("subtracts selling liabilities and floors at zero", () => { + const entry = new xdr.AccountEntry({ + accountId: xdr.PublicKey.publicKeyTypeEd25519(Buffer.alloc(32)), + balance: xdr.Int64.fromString("10000000"), // 1 XLM + seqNum: xdr.Int64.fromString("1"), + numSubEntries: 2, + inflationDest: null, + flags: 0, + homeDomain: "", + thresholds: Buffer.from([1, 1, 1, 1]), + signers: [], + ext: new xdr.AccountEntryExt( + 1, + new xdr.AccountEntryExtensionV1({ + liabilities: new xdr.Liabilities({ + buying: xdr.Int64.fromString("0"), + selling: xdr.Int64.fromString("20000000"), // 2 XLM liabilities + }), + ext: new xdr.AccountEntryExtensionV1Ext(0), + }), + ), + }); + + const baseReserve = 5_000_000n; + const res = spendableXlm(entry, baseReserve); + // minBalance = (2 + 2) * 5_000_000 = 20_000_000n + // raw spendable = 10_000_000 - 20_000_000 - 20_000_000 = -30_000_000n -> floored to 0 + expect(res.spendable).toBe(0n); + }); +}); + +describe("base reserve reading and formatXlm", () => { + it("falls back to DEFAULT_BASE_RESERVE when header XDR is missing", async () => { + const fakeServer = { + getLatestLedger: async () => ({ sequence: 100 }), + }; + const reserve = await fetchBaseReserve(fakeServer as unknown as import("@stellar/stellar-sdk").rpc.Server); + expect(reserve).toBe(DEFAULT_BASE_RESERVE); + expect(reserve).toBe(5_000_000n); + }); + + it("formatXlm formats stroops with 7 decimals and grouping", () => { + expect(formatXlm(12_345_600n)).toBe("1.23456"); + expect(formatXlm(99_981_000_000n, { grouping: true })).toBe("9,998.1"); + expect(formatXlm(123_456n)).toBe("0.0123456"); + }); +}); diff --git a/lib/stellar/__tests__/fixtures/account-entry.json b/lib/stellar/__tests__/fixtures/account-entry.json new file mode 100644 index 0000000..2147ac7 --- /dev/null +++ b/lib/stellar/__tests__/fixtures/account-entry.json @@ -0,0 +1,3 @@ +{ + "accountEntryXdr": "AAAAAJRaDkIo49gtR0RlcC/307yxKlmVvZpSs7J10S3mGz9YAAAAAAX14QAAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAABAQEBAAAAAAAAAAEAAAAAAAAAAAAAAAAATEtAAAAAAgAAAAEAAAACAAAAAAAAAAA=" +} diff --git a/lib/stellar/__tests__/fixtures/buy-simulation.json b/lib/stellar/__tests__/fixtures/buy-simulation.json new file mode 100644 index 0000000..3cf0893 --- /dev/null +++ b/lib/stellar/__tests__/fixtures/buy-simulation.json @@ -0,0 +1,5 @@ +{ + "minResourceFee": "25000", + "transactionDataXdr": "AAAAAAAAAAEAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAABAAAAAQAG3dAAAASwAAACgAAAAAAAAIi4", + "fee": "50000" +} diff --git a/lib/stellar/__tests__/tx-lifecycle.test.ts b/lib/stellar/__tests__/tx-lifecycle.test.ts new file mode 100644 index 0000000..79c252b --- /dev/null +++ b/lib/stellar/__tests__/tx-lifecycle.test.ts @@ -0,0 +1,275 @@ +import { describe, expect, it, vi } from "vitest"; +import { xdr, type rpc } from "@stellar/stellar-sdk"; +import type { AssembledTransaction } from "@stellar/stellar-sdk/contract"; +import { TxLifecycle, type TxPhase } from "../tx-lifecycle"; + +function makeFakeTx(opts: { + hashHex?: string; + maxTime?: number; + simResult?: unknown; + signError?: Error; +}) { + const hash = Buffer.from(opts.hashHex ?? "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", "hex"); + return { + result: opts.simResult ?? 100n, + simulation: {}, + sign: async () => { + if (opts.signError) throw opts.signError; + }, + signed: { + hash: () => hash, + timeBounds: opts.maxTime ? { maxTime: opts.maxTime } : undefined, + }, + } as unknown as AssembledTransaction; +} + +describe("TxLifecycle", () => { + it("emits phases in order for a successful buy and exposes hash from submitting onwards", async () => { + const phases: TxPhase[] = []; + const hashHex = "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"; + + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "PENDING" }), + getTransaction: vi.fn().mockResolvedValue({ + status: "SUCCESS", + ledger: 1234, + returnValue: undefined, + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + runner.subscribe(() => { + phases.push(runner.getSnapshot()); + }); + + const tx = makeFakeTx({ hashHex }); + const result = await runner.run(tx, () => 500n); + + expect(result.value).toBe(500n); + expect(result.txHash).toBe(hashHex); + + const phaseNames = phases.map((p) => p.name); + expect(phaseNames).toEqual(["simulating", "awaiting-signature", "submitting", "pending", "confirmed"]); + + // Hash is present from submitting onwards + const submitting = phases.find((p) => p.name === "submitting"); + expect((submitting as { hash: string }).hash).toBe(hashHex); + + const pending = phases.find((p) => p.name === "pending"); + expect((pending as { hash: string }).hash).toBe(hashHex); + + const confirmed = phases.find((p) => p.name === "confirmed"); + expect((confirmed as { hash: string }).hash).toBe(hashHex); + }); + + it("maps TRY_AGAIN_LATER to submission try-again-later", async () => { + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "TRY_AGAIN_LATER" }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + }); + + const tx = makeFakeTx({}); + await expect(runner.run(tx, () => null)).rejects.toThrow(); + + const snapshot = runner.getSnapshot(); + expect(snapshot.name).toBe("failed"); + if (snapshot.name === "failed") { + expect(snapshot.error.kind).toBe("submission"); + expect(snapshot.error.submission).toBe("try-again-later"); + } + }); + + it("treats DUPLICATE as pending and polls the same hash", async () => { + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "DUPLICATE" }), + getTransaction: vi.fn().mockResolvedValue({ + status: "SUCCESS", + ledger: 99, + returnValue: undefined, + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + const tx = makeFakeTx({}); + const res = await runner.run(tx, () => 42n); + expect(res.value).toBe(42n); + expect(fakeServer.getTransaction).toHaveBeenCalled(); + }); + + it("maps ERROR txBadSeq and txInsufficientFee result codes", async () => { + const makeServer = (arm: () => xdr.TransactionResultResult) => ({ + sendTransaction: vi.fn().mockResolvedValue({ + status: "ERROR", + errorResult: new xdr.TransactionResult({ + feeCharged: xdr.Int64.fromString("0"), + result: arm(), + ext: new xdr.TransactionResultExt(0), + }), + }), + }); + + const badSeqServer = makeServer(() => xdr.TransactionResultResult.txBadSeq()); + const runner1 = new TxLifecycle({ + server: badSeqServer as unknown as rpc.Server, + contract: "marketCore", + }); + await expect(runner1.run(makeFakeTx({}), () => null)).rejects.toThrow(); + expect(runner1.getSnapshot()).toMatchObject({ + name: "failed", + error: { resultCode: "txBadSeq" }, + }); + + const lowFeeServer = makeServer(() => xdr.TransactionResultResult.txInsufficientFee()); + const runner2 = new TxLifecycle({ + server: lowFeeServer as unknown as rpc.Server, + contract: "marketCore", + }); + await expect(runner2.run(makeFakeTx({}), () => null)).rejects.toThrow(); + expect(runner2.getSnapshot()).toMatchObject({ + name: "failed", + error: { resultCode: "txInsufficientFee" }, + }); + }); + + it("maps FAILED with Error(Contract, #12) to SlippageExceeded", async () => { + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "PENDING" }), + getTransaction: vi.fn().mockResolvedValue({ + status: "FAILED", + resultXdr: "HostError: Error(Contract, #12)", + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + await expect(runner.run(makeFakeTx({}), () => null)).rejects.toThrow(); + const snapshot = runner.getSnapshot(); + expect(snapshot.name).toBe("failed"); + if (snapshot.name === "failed") { + expect(snapshot.error.code).toBe("SlippageExceeded"); + expect(snapshot.error.submission).toBe("failed-on-chain"); + } + }); + + it("keeps polling through NOT_FOUND then confirms", async () => { + let callCount = 0; + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "PENDING" }), + getTransaction: vi.fn().mockImplementation(async () => { + callCount++; + if (callCount < 3) { + return { status: "NOT_FOUND", latestLedger: 10, latestLedgerCloseTime: 1000 }; + } + return { status: "SUCCESS", ledger: 11, returnValue: undefined }; + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + const res = await runner.run(makeFakeTx({}), () => 77n); + expect(res.value).toBe(77n); + expect(callCount).toBe(3); + }); + + it("emits expired using latestLedgerCloseTime, not Date.now", async () => { + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "PENDING" }), + getTransaction: vi.fn().mockResolvedValue({ + status: "NOT_FOUND", + latestLedger: 50, + latestLedgerCloseTime: 2000, // beyond maxTime 1500 + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + const tx = makeFakeTx({ maxTime: 1500 }); + await expect(runner.run(tx, () => null)).rejects.toThrow(); + + const snapshot = runner.getSnapshot(); + expect(snapshot.name).toBe("expired"); + if (snapshot.name === "expired") { + expect(snapshot.lastLedgerSeen).toBe(50); + } + }); + + it("wallet rejection yields failed with kind rejected and null hash", async () => { + const fakeServer = { + sendTransaction: vi.fn(), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + }); + + const tx = makeFakeTx({ + signError: new Error("User declined transaction"), + }); + + await expect(runner.run(tx, () => null)).rejects.toThrow(); + const snapshot = runner.getSnapshot(); + expect(snapshot.name).toBe("failed"); + if (snapshot.name === "failed") { + expect(snapshot.hash).toBeNull(); + expect(snapshot.error.kind).toBe("rejected"); + } + }); + + it("unsubscribe stops notifications but run() still resolves", async () => { + const notifications: TxPhase[] = []; + const fakeServer = { + sendTransaction: vi.fn().mockResolvedValue({ status: "PENDING" }), + getTransaction: vi.fn().mockResolvedValue({ + status: "SUCCESS", + ledger: 10, + returnValue: undefined, + }), + }; + + const runner = new TxLifecycle({ + server: fakeServer as unknown as rpc.Server, + contract: "marketCore", + pollIntervalMs: 1, + }); + + const unsub = runner.subscribe(() => { + notifications.push(runner.getSnapshot()); + }); + + // Unsubscribe immediately + unsub(); + + const res = await runner.run(makeFakeTx({}), () => 123n); + expect(res.value).toBe(123n); + // notifications array received 0 updates after unsubscription + expect(notifications.length).toBe(0); + expect(runner.getSnapshot().name).toBe("confirmed"); + }); +}); diff --git a/lib/stellar/__tests__/tx-tracker.test.ts b/lib/stellar/__tests__/tx-tracker.test.ts new file mode 100644 index 0000000..e812fb8 --- /dev/null +++ b/lib/stellar/__tests__/tx-tracker.test.ts @@ -0,0 +1,199 @@ +import { describe, expect, it } from "vitest"; +import type { rpc } from "@stellar/stellar-sdk"; +import { + evaluateTxStatus, + fromRecord, + isValidRecord, + loadRecords, + mergeRecords, + saveRecords, + toRecord, + tradeInvalidationKeys, + type TrackedTx, +} from "../tx-tracker-core"; + +class FakeStorage implements Storage { + private store = new Map(); + get length() { + return this.store.size; + } + clear(): void { + this.store.clear(); + } + getItem(key: string): string | null { + return this.store.get(key) ?? null; + } + key(index: number): string | null { + return Array.from(this.store.keys())[index] ?? null; + } + removeItem(key: string): void { + this.store.delete(key); + } + setItem(key: string, value: string): void { + this.store.set(key, value); + } +} + +const TEST_PASSPHRASE = "Test SDF Network ; September 2015"; +const VALID_HOLDER = "GCM7WU3RADBCIKBLGPPAEYV5WHASWMEQX6BU524QR3QFWSE7BIWCXAIF"; +const VALID_HASH_1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; +const VALID_HASH_2 = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; + +describe("tx-tracker pure functions", () => { + it("round-trips bigint amounts through sessionStorage strings without precision loss", () => { + const rawAmounts = { + collateralIn: 100_000_000n, + minSharesOut: 98_765_432n, + largeValue: 999_999_999_999_999_999n, + zero: 0n, + }; + + const serialized = toRecord(rawAmounts); + expect(serialized).toEqual({ + collateralIn: "100000000", + minSharesOut: "98765432", + largeValue: "999999999999999999", + zero: "0", + }); + + const restored = fromRecord(serialized); + expect(restored).toEqual(rawAmounts); + }); + + it("drops records for a different network passphrase", () => { + const now = Date.now(); + const wrongNetRecord: TrackedTx = { + hash: VALID_HASH_1, + kind: "buy", + holder: VALID_HOLDER, + marketId: "1", + outcome: "Yes", + amounts: { collateralIn: "100000000" }, + networkPassphrase: "Public Global Stellar Network ; September 2015", + submittedAt: now, + state: "pending", + }; + + expect(isValidRecord(wrongNetRecord, TEST_PASSPHRASE, now)).toBe(false); + + const storage = new FakeStorage(); + saveRecords(storage, [wrongNetRecord]); + const loaded = loadRecords(storage, TEST_PASSPHRASE, now); + expect(loaded.length).toBe(0); + }); + + it("drops malformed and stale records", () => { + const now = Date.now(); + const staleTime = now - 25 * 60 * 60 * 1000; // 25 hours old + + const staleRecord: TrackedTx = { + hash: VALID_HASH_1, + kind: "buy", + holder: VALID_HOLDER, + amounts: { collateralIn: "100" }, + networkPassphrase: TEST_PASSPHRASE, + submittedAt: staleTime, + state: "pending", + }; + expect(isValidRecord(staleRecord, TEST_PASSPHRASE, now)).toBe(false); + + // Malformed records + expect(isValidRecord({ hash: "not-a-hex" }, TEST_PASSPHRASE, now)).toBe(false); + expect(isValidRecord({ hash: VALID_HASH_1, kind: "unknown" }, TEST_PASSPHRASE, now)).toBe(false); + expect(isValidRecord({ hash: VALID_HASH_1, kind: "buy", holder: "short" }, TEST_PASSPHRASE, now)).toBe(false); + expect(isValidRecord(null, TEST_PASSPHRASE, now)).toBe(false); + }); + + it("merges records from two writers by hash without blind overwrite", () => { + const now = Date.now(); + const writer1: TrackedTx[] = [ + { + hash: VALID_HASH_1, + kind: "buy", + holder: VALID_HOLDER, + marketId: "1", + amounts: { collateralIn: "100" }, + networkPassphrase: TEST_PASSPHRASE, + submittedAt: now - 1000, + state: "pending", + }, + ]; + + const writer2: TrackedTx[] = [ + { + hash: VALID_HASH_1, + kind: "buy", + holder: VALID_HOLDER, + marketId: "1", + amounts: { collateralIn: "100" }, + networkPassphrase: TEST_PASSPHRASE, + submittedAt: now - 1000, + state: "confirmed", + ledger: 500, + }, + { + hash: VALID_HASH_2, + kind: "usdc-transfer", + holder: VALID_HOLDER, + amounts: { amount: "5000000" }, + networkPassphrase: TEST_PASSPHRASE, + submittedAt: now, + state: "pending", + }, + ]; + + const merged = mergeRecords(writer1, writer2); + expect(merged.length).toBe(2); + + const tx1 = merged.find((r) => r.hash === VALID_HASH_1); + expect(tx1?.state).toBe("confirmed"); + expect(tx1?.ledger).toBe(500); + + const tx2 = merged.find((r) => r.hash === VALID_HASH_2); + expect(tx2?.state).toBe("pending"); + }); + + it("marks NOT_FOUND past time bound as expired with mayNotHaveBeenSent flag", () => { + const record: TrackedTx = { + hash: VALID_HASH_1, + kind: "buy", + holder: VALID_HOLDER, + marketId: "1", + amounts: { collateralIn: "100" }, + networkPassphrase: TEST_PASSPHRASE, + submittedAt: Date.now(), + state: "pending", + maxTime: 1000, + }; + + const notExpiredRes = { + status: "NOT_FOUND", + latestLedger: 10, + latestLedgerCloseTime: 999, + } as rpc.Api.GetTransactionResponse; + const stillPending = evaluateTxStatus(record, notExpiredRes); + expect(stillPending.state).toBe("pending"); + + const expiredRes = { + status: "NOT_FOUND", + latestLedger: 15, + latestLedgerCloseTime: 1005, + } as rpc.Api.GetTransactionResponse; + const expired = evaluateTxStatus(record, expiredRes); + expect(expired.state).toBe("expired"); + expect(expired.mayNotHaveBeenSent).toBe(true); + }); + + it("computes the same invalidation keys as useInvalidateAfterTrade", () => { + const marketId = "42"; + const holder = VALID_HOLDER; + + const keys = tradeInvalidationKeys(marketId, holder); + expect(keys).toEqual([ + ["stellar", "market", "42"], + ["stellar", "markets"], + ["stellar", "position", "42", holder], + ["stellar", "usdcBalance", holder], + ]); + }); +}); diff --git a/lib/stellar/__tests__/units.test.ts b/lib/stellar/__tests__/units.test.ts index 851c29a..17c827c 100644 --- a/lib/stellar/__tests__/units.test.ts +++ b/lib/stellar/__tests__/units.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { formatUsdc, maxIn, minOut, parseUsdc, shareOf, shortAddress, tryParseUsdc, USDC_UNIT } from "../units"; +import { formatUsdc, formatXlm, maxIn, minOut, parseUsdc, shareOf, shortAddress, tryParseUsdc, USDC_UNIT, XLM_UNIT } from "../units"; describe("parseUsdc / formatUsdc", () => { it("uses 7 decimals", () => { @@ -39,6 +39,19 @@ describe("parseUsdc / formatUsdc", () => { }); }); +describe("formatXlm", () => { + it("uses 7 decimals and stroops unit", () => { + expect(XLM_UNIT).toBe(10_000_000n); + expect(formatXlm(10_000_000n)).toBe("1"); + expect(formatXlm(1n)).toBe("0.0000001"); + expect(formatXlm(123_456n)).toBe("0.0123456"); + expect(formatXlm(12_345_678_900_000n, { grouping: true })).toBe("1,234,567.89"); + expect(formatXlm(99_981_000_000n, { grouping: true })).toBe("9,998.1"); + expect(formatXlm(0n)).toBe("0"); + expect(formatXlm(5_000_000n, { minDecimals: 2 })).toBe("0.50"); + }); +}); + describe("slippage helpers round against the user", () => { it("minOut rounds down", () => { expect(minOut(10_000n, 100)).toBe(9_900n); diff --git a/lib/stellar/clients.ts b/lib/stellar/clients.ts index a0a9a12..fc301dc 100644 --- a/lib/stellar/clients.ts +++ b/lib/stellar/clients.ts @@ -1,4 +1,4 @@ -import { Address, nativeToScVal, scValToNative } from "@stellar/stellar-sdk"; +import { Address, nativeToScVal, rpc, scValToNative } from "@stellar/stellar-sdk"; import { AssembledTransaction } from "@stellar/stellar-sdk/contract"; import type { ClientOptions, SignTransaction } from "@stellar/stellar-sdk/contract"; import { Client as MarketCoreClient, type Category, type Outcome } from "./generated/market-core"; @@ -13,6 +13,17 @@ export interface Signer { signTransaction: SignTransaction; } +let _rpcServer: rpc.Server | null = null; +/** Memoised Stellar RPC server instance. */ +export function rpcServer(): rpc.Server { + if (!_rpcServer) { + _rpcServer = new rpc.Server(RPC_URL, { + allowHttp: RPC_URL.startsWith("http://"), + }); + } + return _rpcServer; +} + function options(contractId: string, signer?: Signer): ClientOptions { return { contractId, diff --git a/lib/stellar/errors.ts b/lib/stellar/errors.ts index 8aa78cb..7ad3820 100644 --- a/lib/stellar/errors.ts +++ b/lib/stellar/errors.ts @@ -43,13 +43,31 @@ const FRIENDLY: Record = { Unauthorized: "Your wallet isn't allowed to do this.", }; +import type { rpc } from "@stellar/stellar-sdk"; + export interface DescribedError { - kind: "rejected" | "insufficient-balance" | "no-trustline" | "contract" | "wrong-network" | "disconnected" | "network" | "unknown"; + kind: + | "rejected" + | "insufficient-balance" + | "insufficient-xlm" + | "no-trustline" + | "contract" + | "wrong-network" + | "disconnected" + | "network" + | "submission" + | "expired" + | "unknown"; message: string; /** Contract error name, e.g. "SlippageExceeded", when known. */ code?: string; } +export interface TxDescribedError extends DescribedError { + submission?: "try-again-later" | "duplicate" | "rejected-by-network" | "failed-on-chain" | "not-found-after-timeout"; + resultCode?: string; // e.g. "txBadSeq", "txInsufficientFee", "txFailed" +} + function textOf(err: unknown): string { if (err == null) return ""; if (typeof err === "string") return err; @@ -86,6 +104,9 @@ export function describeError(err: unknown, contract: ContractName = "marketCore if (/balance is not sufficient|resulting balance is not within the allowed range|insufficient (balance|funds)|BalanceError|op_underfunded/i.test(text)) { return { kind: "insufficient-balance", message: "You don't have enough USDC for this." }; } + if (/op_low_reserve|txInsufficientBalance|tx_insufficient_balance/i.test(text)) { + return { kind: "insufficient-xlm", message: "You don't have enough spendable XLM to pay the network fee." }; + } if (/wrong network|network mismatch/i.test(text)) { return { kind: "wrong-network", message: "Switch your wallet to Stellar Testnet and try again." }; } @@ -106,6 +127,104 @@ export function describeError(err: unknown, contract: ContractName = "marketCore return { kind: "unknown", message: "Something went wrong. Please try again." }; } +/** + * Maps an rpc.Api.SendTransactionResponse to a TxDescribedError. + */ +export function describeSubmission( + response: rpc.Api.SendTransactionResponse, + contract: ContractName = "marketCore", +): TxDescribedError { + if (response.status === "TRY_AGAIN_LATER") { + return { + kind: "submission", + submission: "try-again-later", + message: "The network is busy. Please try again in a moment.", + }; + } + if (response.status === "DUPLICATE") { + return { + kind: "submission", + submission: "duplicate", + message: "This transaction is already in flight.", + }; + } + + // ERROR case + let resultCode: string | undefined; + try { + resultCode = response.errorResult?.result().switch().name; + } catch { + // ignore + } + + if (resultCode === "txBadSeq") { + return { + kind: "submission", + submission: "rejected-by-network", + resultCode, + message: "Transaction sequence number is invalid. Please try again.", + }; + } + if (resultCode === "txInsufficientFee") { + return { + kind: "submission", + submission: "rejected-by-network", + resultCode, + message: "The network fee bid was too low. Please try again with a higher fee.", + }; + } + if (resultCode === "txTooLate") { + return { + kind: "submission", + submission: "rejected-by-network", + resultCode, + message: "The transaction expired before reaching the ledger. Please try again.", + }; + } + if (resultCode === "txInsufficientBalance") { + return { + kind: "insufficient-xlm", + submission: "rejected-by-network", + resultCode, + message: "You don't have enough spendable XLM to pay the network fee.", + }; + } + + // For txFailed on an InvokeHostFunction, fall through to describeError with the contract name + // so Error(Contract, #N) still maps via TABLES. + const diagText = response.diagnosticEvents + ? response.diagnosticEvents + .map((e) => { + try { + return typeof (e as unknown as { toXDR?: (f: string) => string }).toXDR === "function" + ? (e as unknown as { toXDR: (format: string) => string }).toXDR("base64") + : String(e); + } catch { + return String(e); + } + }) + .join(" ") + : ""; + const fullText = `${textOf(response)} ${diagText}`; + const described = describeError(fullText, contract); + if (described.kind !== "unknown") { + return { + ...described, + submission: "rejected-by-network", + resultCode: resultCode ?? "txFailed", + }; + } + + return { + kind: "submission", + submission: "rejected-by-network", + resultCode: resultCode ?? "txFailed", + message: resultCode + ? `Transaction was rejected by the network (${resultCode}).` + : "Transaction was rejected by the network. Please try again.", + }; +} + /** Thrown by write hooks so callers get a readable message in `error.message`. */ export class UserFacingError extends Error { constructor(public readonly described: DescribedError, public readonly original?: unknown) { diff --git a/lib/stellar/fees.ts b/lib/stellar/fees.ts new file mode 100644 index 0000000..6fbdef9 --- /dev/null +++ b/lib/stellar/fees.ts @@ -0,0 +1,171 @@ +import { rpc, xdr } from "@stellar/stellar-sdk"; +import type { AssembledTransaction } from "@stellar/stellar-sdk/contract"; +import { rpcServer } from "./clients"; + +export interface FeeBreakdown { + /** Stroops: totalFee - resourceFee */ + inclusionFee: bigint; + /** Stroops from SorobanTransactionData.resourceFee() */ + resourceFee: bigint; + /** Stroops: BigInt(tx.built.fee) */ + totalFee: bigint; + /** Stroops from simulation.minResourceFee */ + minResourceFee: bigint; + resources: { + instructions: number; + readBytes: number; + writeBytes: number; + readEntries: number; + writeEntries: number; + }; +} + +export class SimulationError extends Error { + constructor(message: string, public readonly response?: rpc.Api.SimulateTransactionResponse) { + super(message); + this.name = "SimulationError"; + } +} + +/** + * Extracts fee breakdown and footprint statistics from a simulated AssembledTransaction. + * Arithmetic is kept strictly in bigint (stroops). Never passes through float/number. + */ +export function feeBreakdown(tx: AssembledTransaction): FeeBreakdown { + if (!tx || !tx.simulation) { + throw new SimulationError("Transaction has no simulation data"); + } + + const sim = tx.simulation as rpc.Api.SimulateTransactionResponse; + + if (rpc.Api.isSimulationError(sim) || (sim as { error?: string }).error) { + throw new SimulationError( + String((sim as { error?: string }).error ?? "Simulation failed"), + sim, + ); + } + + if (rpc.Api.isSimulationRestore(sim) || "restorePreamble" in (sim as object)) { + throw new SimulationError("Transaction requires footprint restore", sim); + } + + const minResourceFee = BigInt(sim.minResourceFee ?? 0); + const rawTx = tx.built; + if (!rawTx) { + throw new SimulationError("Transaction has not been built"); + } + const totalFee = BigInt(rawTx.fee); + + const rawTxData = (sim as { transactionData?: unknown }).transactionData; + if (!rawTxData) { + throw new SimulationError("Simulation is missing transactionData"); + } + + const sorobanData: xdr.SorobanTransactionData = + typeof (rawTxData as { build?: () => xdr.SorobanTransactionData }).build === "function" + ? (rawTxData as { build: () => xdr.SorobanTransactionData }).build() + : (rawTxData as xdr.SorobanTransactionData); + + const resourceFee = BigInt(sorobanData.resourceFee().toString()); + const inclusionFee = totalFee - resourceFee; + + const resources = sorobanData.resources(); + const footprint = resources.footprint(); + const readBytes = + typeof (resources as { diskReadBytes?: () => number }).diskReadBytes === "function" + ? (resources as { diskReadBytes: () => number }).diskReadBytes() + : typeof (resources as unknown as { readBytes?: () => number }).readBytes === "function" + ? (resources as unknown as { readBytes: () => number }).readBytes() + : 0; + + return { + inclusionFee, + resourceFee, + totalFee, + minResourceFee, + resources: { + instructions: resources.instructions(), + readBytes, + writeBytes: resources.writeBytes(), + readEntries: footprint.readOnly().length, + writeEntries: footprint.readWrite().length, + }, + }; +} + +export interface AccountReserve { + balance: bigint; + minBalance: bigint; + sellingLiabilities: bigint; + spendable: bigint; + subentries: number; + sponsoring: number; + sponsored: number; +} + +/** + * Standard Stellar network base reserve: 0.5 XLM (5,000,000 stroops). + * Used when network RPC does not expose the ledger header XDR. + */ +export const DEFAULT_BASE_RESERVE = 5_000_000n; + +/** + * Computes spendable native XLM from an account entry per CAP-33 sponsored reserves. + * All arithmetic is performed in BigInt stroops. + */ +export function spendableXlm(entry: xdr.AccountEntry, baseReserve: bigint): AccountReserve { + const balance = BigInt(entry.balance().toString()); + const subentries = Number(entry.numSubEntries()); + let sellingLiabilities = 0n; + let sponsoring = 0; + let sponsored = 0; + + try { + if (entry.ext().switch() >= 1) { + const v1 = entry.ext().v1(); + sellingLiabilities = BigInt(v1.liabilities().selling().toString()); + if (v1.ext().switch() >= 2) { + const v2 = v1.ext().v2(); + sponsoring = Number(v2.numSponsoring()); + sponsored = Number(v2.numSponsored()); + } + } + } catch { + // Non-fatal if extension format differs + } + + // Formula (CAP-33): minBalance = (2 + numSubEntries + numSponsoring - numSponsored) * baseReserve + const reserveMultiplier = 2n + BigInt(subentries) + BigInt(sponsoring) - BigInt(sponsored); + const minBalance = reserveMultiplier * baseReserve; + const rawSpendable = balance - minBalance - sellingLiabilities; + const spendable = rawSpendable < 0n ? 0n : rawSpendable; + + return { + balance, + minBalance, + sellingLiabilities, + spendable, + subentries, + sponsoring, + sponsored, + }; +} + +/** + * Reads the latest base reserve from the network if exposed in the ledger header XDR, + * otherwise falls back to DEFAULT_BASE_RESERVE (0.5 XLM). + */ +export async function fetchBaseReserve(server: rpc.Server = rpcServer()): Promise { + try { + const latest = (await server.getLatestLedger()) as unknown as { headerXdr?: string }; + if (latest && typeof latest.headerXdr === "string") { + const header = xdr.LedgerHeader.fromXDR(latest.headerXdr, "base64"); + return BigInt(header.baseReserve().toString()); + } + } catch { + // Fall back to protocol default + } + // Soroban RPC getLatestLedger does not always include the raw ledger header XDR; + // fall back to the protocol standard base reserve of 0.5 XLM (5_000_000 stroops). + return DEFAULT_BASE_RESERVE; +} diff --git a/lib/stellar/tx-lifecycle.ts b/lib/stellar/tx-lifecycle.ts new file mode 100644 index 0000000..1ec48dd --- /dev/null +++ b/lib/stellar/tx-lifecycle.ts @@ -0,0 +1,260 @@ +import type { rpc, xdr } from "@stellar/stellar-sdk"; +import { scValToNative } from "@stellar/stellar-sdk"; +import type { AssembledTransaction } from "@stellar/stellar-sdk/contract"; +import { + describeError, + describeSubmission, + UserFacingError, + type ContractName, + type TxDescribedError, +} from "./errors"; + +export type { TxDescribedError }; + +export type TxPhase = + | { name: "building" } + | { name: "simulating" } + | { name: "awaiting-signature" } + | { name: "submitting"; hash: string } + | { name: "pending"; hash: string; sentAt: number; attempts: number } + | { name: "confirmed"; hash: string; ledger: number; returnValue?: xdr.ScVal } + | { name: "failed"; hash: string | null; error: TxDescribedError } + | { name: "expired"; hash: string; lastLedgerSeen: number }; + +/** + * The value of a simulated call. Contract `Result`s are unwrapped; failures + * become a UserFacingError named from the simulation's "Error(Contract, #N)". + */ +export function simulated(tx: AssembledTransaction, contract: ContractName = "marketCore"): T { + const sim = tx.simulation as { error?: string } | undefined; + let raw: unknown; + try { + raw = tx.result; + } catch (err) { + throw new UserFacingError(describeError(`${sim?.error ?? ""} ${String(err)}`, contract), err); + } + if (raw && typeof raw === "object" && "isOk" in raw && typeof (raw as { isOk: unknown }).isOk === "function") { + const result = raw as { isOk(): boolean; unwrap(): T }; + if (!result.isOk()) throw new UserFacingError(describeError(`${sim?.error ?? ""}`, contract), raw); + return result.unwrap(); + } + return raw as T; +} + +export class TxLifecycle { + private phase: TxPhase = { name: "building" }; + private listeners = new Set<() => void>(); + private aborted = false; + private timer: ReturnType | null = null; + private readonly server: rpc.Server; + private readonly contract: ContractName; + private readonly pollIntervalMs: number; + private readonly maxPollMs: number; + private readonly onHash?: (hash: string) => void; + + constructor(opts: { + server: rpc.Server; + contract: ContractName; + pollIntervalMs?: number; + maxPollMs?: number; + onHash?: (hash: string) => void; + }) { + this.server = opts.server; + this.contract = opts.contract; + this.pollIntervalMs = opts.pollIntervalMs ?? 1000; + this.maxPollMs = opts.maxPollMs ?? 60_000; + this.onHash = opts.onHash; + } + + getSnapshot = (): TxPhase => { + return this.phase; + }; + + subscribe = (listener: () => void): (() => void) => { + this.listeners.add(listener); + return () => { + this.listeners.delete(listener); + }; + }; + + private setPhase(newPhase: TxPhase) { + this.phase = newPhase; + for (const listener of this.listeners) { + try { + listener(); + } catch { + // Ignore listener errors + } + } + } + + abort(): void { + this.aborted = true; + if (this.timer) { + clearTimeout(this.timer); + this.timer = null; + } + } + + async run( + tx: AssembledTransaction, + parse: (v: xdr.ScVal | undefined) => T, + ): Promise<{ value: T; txHash: string }> { + // 1. Simulating + this.setPhase({ name: "simulating" }); + try { + simulated(tx, this.contract); + } catch (err) { + const described: TxDescribedError = + err instanceof UserFacingError ? err.described : describeError(err, this.contract); + this.setPhase({ name: "failed", hash: null, error: described }); + if (err instanceof UserFacingError) throw err; + throw new UserFacingError(described, err); + } + + // 2. Awaiting signature + this.setPhase({ name: "awaiting-signature" }); + try { + await tx.sign(); + } catch (err) { + const described: TxDescribedError = describeError(err, this.contract); + this.setPhase({ name: "failed", hash: null, error: described }); + throw new UserFacingError(described, err); + } + + const signed = (tx as unknown as { signed?: { hash: () => Buffer; timeBounds?: { maxTime?: string | number } } }).signed; + if (!signed) { + const error: TxDescribedError = { + kind: "unknown", + message: "Signing succeeded but no signed transaction was found.", + }; + this.setPhase({ name: "failed", hash: null, error }); + throw new UserFacingError(error); + } + + const hash = signed.hash().toString("hex").toLowerCase(); + this.onHash?.(hash); + + // 3. Submitting + this.setPhase({ name: "submitting", hash }); + let sendRes: rpc.Api.SendTransactionResponse; + try { + sendRes = await this.server.sendTransaction(signed as unknown as import("@stellar/stellar-sdk").Transaction); + } catch (err) { + const described: TxDescribedError = { + ...describeError(err, this.contract), + submission: "rejected-by-network", + }; + this.setPhase({ name: "failed", hash, error: described }); + throw new UserFacingError(described, err); + } + + if (sendRes.status === "TRY_AGAIN_LATER") { + const error: TxDescribedError = { + kind: "submission", + submission: "try-again-later", + message: "The network is busy. Please try again in a moment.", + }; + this.setPhase({ name: "failed", hash, error }); + throw new UserFacingError(error, sendRes); + } + + if (sendRes.status === "ERROR") { + const error = describeSubmission(sendRes, this.contract); + this.setPhase({ name: "failed", hash, error }); + throw new UserFacingError(error, sendRes); + } + + // PENDING or DUPLICATE -> start polling + const sentAt = Date.now(); + let attempts = 0; + this.setPhase({ name: "pending", hash, sentAt, attempts }); + + let delayMs = this.pollIntervalMs; + let initialLedgerCloseTime: number | null = null; + + while (!this.aborted) { + await new Promise((resolve) => { + this.timer = setTimeout(resolve, delayMs); + }); + if (this.aborted) { + throw new UserFacingError({ + kind: "unknown", + message: "Transaction monitoring was aborted.", + }); + } + + attempts++; + delayMs = Math.min(Math.floor(delayMs * 1.5), 5000); + + let getRes: rpc.Api.GetTransactionResponse; + try { + getRes = await this.server.getTransaction(hash); + } catch { + // Transient network error; continue polling + continue; + } + + if (getRes.status === "SUCCESS") { + let value: T; + try { + value = parse(getRes.returnValue); + } catch { + value = (getRes.returnValue ? scValToNative(getRes.returnValue) : null) as T; + } + this.setPhase({ + name: "confirmed", + hash, + ledger: getRes.ledger ?? getRes.latestLedger, + returnValue: getRes.returnValue, + }); + return { value, txHash: hash }; + } + + if (getRes.status === "FAILED") { + const fullErrText = `${getRes.resultXdr ? String(getRes.resultXdr) : ""} ${getRes.resultMetaXdr ? String(getRes.resultMetaXdr) : ""}`; + const described = describeError(fullErrText || "Transaction failed on chain", this.contract); + const error: TxDescribedError = { + ...described, + submission: "failed-on-chain", + }; + this.setPhase({ name: "failed", hash, error }); + throw new UserFacingError(error, getRes); + } + + if (getRes.status === "NOT_FOUND") { + this.setPhase({ name: "pending", hash, sentAt, attempts }); + + if (initialLedgerCloseTime === null && getRes.latestLedgerCloseTime) { + initialLedgerCloseTime = getRes.latestLedgerCloseTime; + } + + const maxTimeRaw = signed.timeBounds?.maxTime; + const maxTime = maxTimeRaw ? BigInt(maxTimeRaw) : 0n; + const isPastTimeBound = + maxTime > 0n && + getRes.latestLedgerCloseTime !== undefined && + BigInt(getRes.latestLedgerCloseTime) > maxTime; + const isPastMaxPoll = + initialLedgerCloseTime !== null && + getRes.latestLedgerCloseTime !== undefined && + (getRes.latestLedgerCloseTime - initialLedgerCloseTime) * 1000 >= this.maxPollMs; + + if (isPastTimeBound || isPastMaxPoll) { + const error: TxDescribedError = { + kind: "expired", + submission: "not-found-after-timeout", + message: "Transaction expired before reaching a ledger.", + }; + this.setPhase({ name: "expired", hash, lastLedgerSeen: getRes.latestLedger }); + throw new UserFacingError(error, getRes); + } + } + } + + throw new UserFacingError({ + kind: "unknown", + message: "Transaction monitoring was aborted.", + }); + } +} diff --git a/lib/stellar/tx-tracker-core.ts b/lib/stellar/tx-tracker-core.ts new file mode 100644 index 0000000..f0d9fc1 --- /dev/null +++ b/lib/stellar/tx-tracker-core.ts @@ -0,0 +1,174 @@ +import type { rpc } from "@stellar/stellar-sdk"; +import { describeError, type ContractName } from "./errors"; + +export type TrackedKind = "buy" | "sell" | "redeem" | "usdc-transfer"; + +export interface TrackedTx { + /** Lowercase 64-char hex transaction hash */ + hash: string; + kind: TrackedKind; + /** G-address of the account that signed */ + holder: string; + marketId?: string; + outcome?: "Yes" | "No"; + /** Bigint amounts represented as base-10 decimal strings */ + amounts: Record; + networkPassphrase: string; + /** Epoch milliseconds at submit time */ + submittedAt: number; + state: "pending" | "confirmed" | "failed" | "expired"; + ledger?: number; + maxTime?: number; + mayNotHaveBeenSent?: boolean; + error?: { kind: string; message: string; code?: string }; + followUp?: { type: "unlock-daily-pass"; traceId: string; amountRaw: string }; +} + +export const STORAGE_KEY = "oracledesk_pending_txs"; +const TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000; + +/** Computes the query keys to invalidate when a trade confirms. */ +export function tradeInvalidationKeys(marketId: string, holder: string) { + return [ + ["stellar", "market", marketId] as const, + ["stellar", "markets"] as const, + ["stellar", "position", marketId, holder] as const, + ["stellar", "usdcBalance", holder] as const, + ]; +} + +/** Converts bigint values into decimal strings for serialization. */ +export function toRecord(amounts: Record): Record { + const result: Record = {}; + for (const [key, val] of Object.entries(amounts)) { + result[key] = val.toString(10); + } + return result; +} + +/** Converts serialized decimal strings back into bigints without precision loss. */ +export function fromRecord(amounts: Record): Record { + const result: Record = {}; + for (const [key, val] of Object.entries(amounts)) { + result[key] = BigInt(val); + } + return result; +} + +/** Validates that a parsed item matches TrackedTx shape and is within the 24h validity window. */ +export function isValidRecord(item: unknown, currentNetworkPassphrase: string, now = Date.now()): item is TrackedTx { + if (!item || typeof item !== "object") return false; + const o = item as Partial; + + if (typeof o.hash !== "string" || !/^[a-f0-9]{64}$/i.test(o.hash)) return false; + if (!["buy", "sell", "redeem", "usdc-transfer"].includes(o.kind as string)) return false; + if (typeof o.holder !== "string" || o.holder.length < 50) return false; + if (!o.amounts || typeof o.amounts !== "object") return false; + for (const val of Object.values(o.amounts)) { + if (typeof val !== "string" || !/^-?\d+$/.test(val)) return false; + } + if (o.networkPassphrase !== currentNetworkPassphrase) return false; + if (typeof o.submittedAt !== "number" || isNaN(o.submittedAt)) return false; + if (now - o.submittedAt > TWENTY_FOUR_HOURS_MS || o.submittedAt - now > 60_000) return false; + if (!["pending", "confirmed", "failed", "expired"].includes(o.state as string)) return false; + + return true; +} + +/** Safely reads records from storage, filtering out stale/invalid entries. */ +export function loadRecords(storage: Storage | null, networkPassphrase: string, now = Date.now()): TrackedTx[] { + if (!storage) return []; + try { + const raw = storage.getItem(STORAGE_KEY); + if (!raw) return []; + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) return []; + return parsed.filter((item): item is TrackedTx => isValidRecord(item, networkPassphrase, now)); + } catch { + return []; + } +} + +/** Safely writes records to storage. */ +export function saveRecords(storage: Storage | null, records: TrackedTx[]): void { + if (!storage) return; + try { + storage.setItem(STORAGE_KEY, JSON.stringify(records)); + } catch { + // SessionStorage full or unavailable + } +} + +/** Merges records from multiple writers/tabs by transaction hash. */ +export function mergeRecords(existing: TrackedTx[], incoming: TrackedTx[]): TrackedTx[] { + const map = new Map(); + + for (const r of existing) { + map.set(r.hash.toLowerCase(), r); + } + + for (const r of incoming) { + const key = r.hash.toLowerCase(); + const prev = map.get(key); + if (!prev) { + map.set(key, r); + } else { + // Final states take precedence over pending + const isFinal = (s: TrackedTx["state"]) => s === "confirmed" || s === "failed" || s === "expired"; + const state = isFinal(r.state) ? r.state : prev.state; + map.set(key, { + ...prev, + ...r, + state, + ledger: r.ledger ?? prev.ledger, + error: r.error ?? prev.error, + followUp: r.followUp ?? prev.followUp, + mayNotHaveBeenSent: r.mayNotHaveBeenSent ?? prev.mayNotHaveBeenSent, + }); + } + } + + return Array.from(map.values()).sort((a, b) => b.submittedAt - a.submittedAt); +} + +/** Evaluates a single transaction's updated state from an RPC getTransaction response. */ +export function evaluateTxStatus( + record: TrackedTx, + res: rpc.Api.GetTransactionResponse, + contract: ContractName = "marketCore", +): TrackedTx { + if (res.status === "SUCCESS") { + return { + ...record, + state: "confirmed", + ledger: res.ledger ?? res.latestLedger, + }; + } + + if (res.status === "FAILED") { + const fullErr = `${res.resultXdr ? String(res.resultXdr) : ""} ${res.resultMetaXdr ? String(res.resultMetaXdr) : ""}`; + const described = describeError(fullErr || "Transaction failed", contract); + return { + ...record, + state: "failed", + error: { kind: described.kind, message: described.message, code: described.code }, + }; + } + + if (res.status === "NOT_FOUND") { + // If transaction had a time bound and latest ledger close time is past it + if (record.maxTime && res.latestLedgerCloseTime && res.latestLedgerCloseTime > record.maxTime) { + return { + ...record, + state: "expired", + mayNotHaveBeenSent: true, + error: { + kind: "expired", + message: "Transaction expired without landing on-chain (may not have been sent).", + }, + }; + } + } + + return record; +} diff --git a/lib/stellar/tx-tracker.tsx b/lib/stellar/tx-tracker.tsx new file mode 100644 index 0000000..6aa8c2a --- /dev/null +++ b/lib/stellar/tx-tracker.tsx @@ -0,0 +1,238 @@ +"use client"; + +import React, { createContext, useContext, useEffect, useRef, useState, useCallback } from "react"; +import { useQueryClient } from "@tanstack/react-query"; +import { NETWORK_PASSPHRASE } from "./config"; +import { rpcServer } from "./clients"; +import { + evaluateTxStatus, + loadRecords, + mergeRecords, + saveRecords, + tradeInvalidationKeys, + type TrackedKind, + type TrackedTx, +} from "./tx-tracker-core"; +import { TxToastContainer } from "@/components/ui/tx-toast"; + +export type { TrackedKind, TrackedTx }; + +export interface TrackerApi { + track: (tx: Omit) => void; + list: TrackedTx[]; + dismiss: (hash: string) => void; +} + +const TxTrackerContext = createContext(null); + +export function useTxTracker(): TrackerApi { + const ctx = useContext(TxTrackerContext); + if (!ctx) { + throw new Error("useTxTracker must be used within TransactionTrackerProvider"); + } + return ctx; +} + +export function TransactionTrackerProvider({ children }: { children: React.ReactNode }) { + const queryClient = useQueryClient(); + const [records, setRecords] = useState(() => { + if (typeof window === "undefined") return []; + try { + return loadRecords(window.sessionStorage, NETWORK_PASSPHRASE); + } catch { + return []; + } + }); + + const recordsRef = useRef(records); + useEffect(() => { + recordsRef.current = records; + }, [records]); + + const channelRef = useRef(null); + const pollerTimerRef = useRef | null>(null); + const isPollingRef = useRef(false); + + // Invalidate queries when a transaction finalises + const invalidateFor = useCallback( + (record: TrackedTx) => { + if (record.kind === "usdc-transfer") { + queryClient.invalidateQueries({ queryKey: ["stellar", "usdcBalance", record.holder] }); + } else if (record.marketId) { + for (const key of tradeInvalidationKeys(record.marketId, record.holder)) { + queryClient.invalidateQueries({ queryKey: key }); + } + } + }, + [queryClient], + ); + + // Sync to sessionStorage + const updateRecords = useCallback((updater: (prev: TrackedTx[]) => TrackedTx[]) => { + setRecords((prev) => { + const next = updater(prev); + if (typeof window !== "undefined") { + try { + saveRecords(window.sessionStorage, next); + } catch { + // ignore storage error + } + } + return next; + }); + }, []); + + // BroadcastChannel setup for cross-tab sync and claim coordination + useEffect(() => { + if (typeof window === "undefined" || typeof BroadcastChannel === "undefined") return; + + try { + const channel = new BroadcastChannel("oracledesk-tx"); + channelRef.current = channel; + + channel.onmessage = (event: MessageEvent) => { + const data = event.data; + if (!data || typeof data !== "object") return; + + if (data.type === "record_update" && data.record) { + updateRecords((prev) => mergeRecords(prev, [data.record])); + if (data.record.state === "confirmed") { + invalidateFor(data.record); + } + } else if (data.type === "record_dismiss" && data.hash) { + updateRecords((prev) => prev.filter((r) => r.hash.toLowerCase() !== String(data.hash).toLowerCase())); + } + }; + + return () => { + channel.close(); + channelRef.current = null; + }; + } catch { + // BroadcastChannel unavailable + } + }, [updateRecords, invalidateFor]); + + // Polling loop for pending records + useEffect(() => { + let active = true; + + async function poll() { + if (!active) return; + if (typeof document !== "undefined" && document.visibilityState === "hidden") { + return; + } + + const pending = recordsRef.current.filter((r) => r.state === "pending"); + if (pending.length === 0) { + isPollingRef.current = false; + return; + } + + isPollingRef.current = true; + const server = rpcServer(); + + for (const record of pending) { + if (!active) break; + try { + const res = await server.getTransaction(record.hash); + const updated = evaluateTxStatus(record, res); + if (updated.state !== record.state || updated.ledger !== record.ledger) { + updateRecords((prev) => mergeRecords(prev, [updated])); + if (updated.state === "confirmed") { + invalidateFor(updated); + } + channelRef.current?.postMessage({ type: "record_update", record: updated }); + } + } catch { + // RPC hiccup, skip this record for this tick + } + } + + if (active) { + // Backoff: 2s to 10s + pollerTimerRef.current = setTimeout(poll, 3000); + } + } + + // Handle document visibility change + function handleVisibilityChange() { + if (typeof document !== "undefined" && document.visibilityState === "visible") { + if (pollerTimerRef.current) clearTimeout(pollerTimerRef.current); + poll(); + } + } + + if (typeof document !== "undefined") { + document.addEventListener("visibilitychange", handleVisibilityChange); + } + + // Start polling immediately if pending records exist + poll(); + + return () => { + active = false; + if (pollerTimerRef.current) { + clearTimeout(pollerTimerRef.current); + pollerTimerRef.current = null; + } + if (typeof document !== "undefined") { + document.removeEventListener("visibilitychange", handleVisibilityChange); + } + }; + }, [updateRecords, invalidateFor]); + + const track = useCallback( + (tx: Omit) => { + const newRecord: TrackedTx = { + ...tx, + hash: tx.hash.toLowerCase(), + state: "pending", + submittedAt: Date.now(), + }; + updateRecords((prev) => mergeRecords(prev, [newRecord])); + channelRef.current?.postMessage({ type: "record_update", record: newRecord }); + + // Trigger poller immediately + if (!isPollingRef.current) { + setTimeout(async () => { + try { + const server = rpcServer(); + const res = await server.getTransaction(newRecord.hash); + const updated = evaluateTxStatus(newRecord, res); + if (updated.state !== newRecord.state) { + updateRecords((prev) => mergeRecords(prev, [updated])); + if (updated.state === "confirmed") invalidateFor(updated); + channelRef.current?.postMessage({ type: "record_update", record: updated }); + } + } catch { + // ignore + } + }, 1500); + } + }, + [updateRecords, invalidateFor], + ); + + const dismiss = useCallback( + (hash: string) => { + const lower = hash.toLowerCase(); + updateRecords((prev) => prev.filter((r) => r.hash.toLowerCase() !== lower)); + channelRef.current?.postMessage({ type: "record_dismiss", hash: lower }); + }, + [updateRecords], + ); + + const value: TrackerApi = { + track, + list: records, + dismiss, + }; + + return ( + + {children} + + + ); +} diff --git a/lib/stellar/units.ts b/lib/stellar/units.ts index a42c5e8..096aada 100644 --- a/lib/stellar/units.ts +++ b/lib/stellar/units.ts @@ -26,21 +26,40 @@ export function tryParseUsdc(input: string): bigint | null { } } -/** - * Formats base units as a decimal string. Trailing zeros are trimmed unless - * `minDecimals` asks for some; `maxDecimals` truncates (never rounds up). - */ -export function formatUsdc(raw: bigint, opts: { minDecimals?: number; maxDecimals?: number; grouping?: boolean } = {}): string { - const { minDecimals = 0, maxDecimals = USDC_DECIMALS, grouping = false } = opts; +export const XLM_DECIMALS = 7; +export const XLM_UNIT = 10n ** BigInt(XLM_DECIMALS); + +function formatFixed( + raw: bigint, + decimals: number, + opts: { minDecimals?: number; maxDecimals?: number; grouping?: boolean } = {}, +): string { + const { minDecimals = 0, maxDecimals = decimals, grouping = false } = opts; + const unit = 10n ** BigInt(decimals); const negative = raw < 0n; const abs = negative ? -raw : raw; - const whole = (abs / USDC_UNIT).toString(); - let frac = (abs % USDC_UNIT).toString().padStart(USDC_DECIMALS, "0").slice(0, maxDecimals).replace(/0+$/, ""); + const whole = (abs / unit).toString(); + let frac = (abs % unit).toString().padStart(decimals, "0").slice(0, maxDecimals).replace(/0+$/, ""); if (frac.length < minDecimals) frac = frac.padEnd(minDecimals, "0"); const wholeOut = grouping ? whole.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : whole; return `${negative ? "-" : ""}${wholeOut}${frac ? `.${frac}` : ""}`; } +/** + * Formats base units as a decimal string. Trailing zeros are trimmed unless + * `minDecimals` asks for some; `maxDecimals` truncates (never rounds up). + */ +export function formatUsdc(raw: bigint, opts: { minDecimals?: number; maxDecimals?: number; grouping?: boolean } = {}): string { + return formatFixed(raw, USDC_DECIMALS, opts); +} + +/** + * Formats stroops as a decimal XLM string with 7 decimal places. + */ +export function formatXlm(stroops: bigint, opts: { minDecimals?: number; maxDecimals?: number; grouping?: boolean } = {}): string { + return formatFixed(stroops, XLM_DECIMALS, opts); +} + /** Display-only conversion. Never feed the result back into a transaction. */ export const usdcToNumber = (raw: bigint) => Number(formatUsdc(raw)); diff --git a/package-lock.json b/package-lock.json index 009abe9..dd3aacf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "oracledesk-frontend", "version": "0.1.0", + "license": "MIT", "dependencies": { "@creit.tech/stellar-wallets-kit": "2.5.0", "@stellar/stellar-sdk": "^16.3.1", @@ -38,6 +39,7 @@ "postcss": "^8.5.14", "tailwindcss": "^3.4.19", "typescript": "^5", + "vite": "^8.3.4", "vitest": "^5.0.3" } }, @@ -1098,20 +1100,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@emurgo/cardano-serialization-lib-browser": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", - "integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==", - "license": "MIT", - "peer": true - }, - "node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz", - "integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==", - "license": "MIT", - "peer": true - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -1256,131 +1244,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@ethereumjs/common": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-10.1.3.tgz", - "integrity": "sha512-ECWwbc4s8Ji7U0mkfZP6gIDy1FxXe0ZyVOTt0adkztPQRzX2DbH2ul7a83DSS8qYAiG6//vVXMkP60TyYOnv8Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@ethereumjs/util": "^10.1.3", - "eventemitter3": "^5.0.1" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-10.1.3.tgz", - "integrity": "sha512-d795YWkN6O8EJh/PgJ2zZKCdBMl8OlqkuVQESoidH666gaFtUuJ01jDtiuqfyOqTNcTdGhHi8LkQv1WEZzvZZw==", - "license": "MPL-2.0", - "peer": true, - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-10.1.3.tgz", - "integrity": "sha512-5uk9qB2MjyF4axL6GGPvYODe3uR/h6k36boDbvjH81WYFphw/JAIrI1thkWQX4BCyF8bi6suxORhi+vDc3lPlg==", - "license": "MPL-2.0", - "peer": true, - "dependencies": { - "@ethereumjs/common": "^10.1.3", - "@ethereumjs/rlp": "^10.1.3", - "@ethereumjs/util": "^10.1.3", - "@noble/curves": "^2.0.1", - "@noble/hashes": "^2.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@ethereumjs/tx/node_modules/@noble/curves": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.4.0.tgz", - "integrity": "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "2.4.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/tx/node_modules/@noble/hashes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", - "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-10.1.3.tgz", - "integrity": "sha512-PhezOVe4DFaC+QLIsnK/tiOaXjpjS2F9AH4Ez0EfWevFw9NWNSg95l7I0dWuHF0B7v9odm2Ijqwo0EnARXtUmA==", - "license": "MPL-2.0", - "peer": true, - "dependencies": { - "@ethereumjs/rlp": "^10.1.3", - "@noble/curves": "^2.0.1", - "@noble/hashes": "^2.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.4.0.tgz", - "integrity": "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "2.4.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", - "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@fivebinaries/coin-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-3.0.0.tgz", - "integrity": "sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@emurgo/cardano-serialization-lib-browser": "^13.2.0", - "@emurgo/cardano-serialization-lib-nodejs": "13.2.0" - } - }, "node_modules/@floating-ui/core": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", @@ -2208,16 +2071,6 @@ "integrity": "sha512-jwlVyzMFF296iaNgMWn1lu+EU6BeUD4mgPurEsy8EygYNCrjA8igLpsDlXhfvXhst9tX5w4wRuTDX+FZtpfCug==", "license": "GPL-3.0" }, - "node_modules/@mobily/ts-belt": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", - "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10.*" - } - }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", @@ -2325,47 +2178,6 @@ "@tybys/wasm-util": "^0.10.0" } }, - "node_modules/@near-js/accounts": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@near-js/accounts/-/accounts-1.4.1.tgz", - "integrity": "sha512-ni3QT9H3NdrbVVKyx56yvz93r89Dvpc/vgVtiIK2OdXjkK6jcj+UKMDRQ6F7rd9qJOInLkHZbVBtcR6j1CXLjw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@noble/hashes": "1.7.1", - "borsh": "1.0.0", - "depd": "2.0.0", - "is-my-json-valid": "^2.20.6", - "lru_map": "0.4.1", - "near-abi": "0.2.0" - } - }, - "node_modules/@near-js/accounts/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@near-js/accounts/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-js/crypto": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-1.4.2.tgz", @@ -2413,145 +2225,6 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, - "node_modules/@near-js/keystores": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.2.2.tgz", - "integrity": "sha512-DLhi/3a4qJUY+wgphw2Jl4S+L0AKsUYm1mtU0WxKYV5OBwjOXvbGrXNfdkheYkfh3nHwrQgtjvtszX6LrRXLLw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/types": "0.3.1" - } - }, - "node_modules/@near-js/keystores-browser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores-browser/-/keystores-browser-0.2.2.tgz", - "integrity": "sha512-Pxqm7WGtUu6zj32vGCy9JcEDpZDSB5CCaLQDTQdF3GQyL0flyRv2I/guLAgU5FLoYxU7dJAX9mslJhPW7P2Bfw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2" - } - }, - "node_modules/@near-js/keystores-node": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@near-js/keystores-node/-/keystores-node-0.1.2.tgz", - "integrity": "sha512-MWLvTszZOVziiasqIT/LYNhUyWqOJjDGlsthOsY6dTL4ZcXjjmhmzrbFydIIeQr+CcEl5wukTo68ORI9JrHl6g==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2" - } - }, - "node_modules/@near-js/providers": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@near-js/providers/-/providers-1.0.3.tgz", - "integrity": "sha512-VJMboL14R/+MGKnlhhE3UPXCGYvMd1PpvF9OqZ9yBbulV7QVSIdTMfY4U1NnDfmUC2S3/rhAEr+3rMrIcNS7Fg==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "borsh": "1.0.0", - "exponential-backoff": "^3.1.2" - }, - "optionalDependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@near-js/providers/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@near-js/providers/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@near-js/signers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@near-js/signers/-/signers-0.2.2.tgz", - "integrity": "sha512-M6ib+af9zXAPRCjH2RyIS0+RhCmd9gxzCeIkQ+I2A3zjgGiEDkBZbYso9aKj8Zh2lPKKSH7h+u8JGymMOSwgyw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@noble/hashes": "1.3.3" - } - }, - "node_modules/@near-js/signers/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@near-js/transactions": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@near-js/transactions/-/transactions-1.3.3.tgz", - "integrity": "sha512-1AXD+HuxlxYQmRTLQlkVmH+RAmV3HwkAT8dyZDu+I2fK/Ec9BQHXakOJUnOBws3ihF+akQhamIBS5T0EXX/Ylw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/crypto": "1.4.2", - "@near-js/signers": "0.2.2", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@noble/hashes": "1.7.1", - "borsh": "1.0.0" - } - }, - "node_modules/@near-js/transactions/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@near-js/transactions/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-js/types": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.3.1.tgz", @@ -2570,31 +2243,6 @@ "mustache": "4.0.0" } }, - "node_modules/@near-js/wallet-account": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@near-js/wallet-account/-/wallet-account-1.3.3.tgz", - "integrity": "sha512-GDzg/Kz0GBYF7tQfyQQQZ3vviwV8yD+8F2lYDzsWJiqIln7R1ov0zaXN4Tii86TeS21KPn2hHAsVu3Y4txa8OQ==", - "license": "ISC", - "peer": true, - "dependencies": { - "@near-js/accounts": "1.4.1", - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "borsh": "1.0.0" - } - }, - "node_modules/@near-js/wallet-account/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@near-wallet-selector/core": { "version": "8.10.2", "resolved": "https://registry.npmjs.org/@near-wallet-selector/core/-/core-8.10.2.tgz", @@ -2890,12 +2538,11 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.153.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz", - "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==", + "version": "0.154.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.154.0.tgz", + "integrity": "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/oxc-project" } @@ -2935,79 +2582,6 @@ "url": "https://opencollective.com/preact" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", - "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", - "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -4703,9 +4277,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", - "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.14.tgz", + "integrity": "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==", "cpu": [ "arm" ], @@ -4715,15 +4289,14 @@ "os": [ "android" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", - "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.14.tgz", + "integrity": "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==", "cpu": [ "arm64" ], @@ -4733,15 +4306,14 @@ "os": [ "android" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", - "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.14.tgz", + "integrity": "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==", "cpu": [ "arm64" ], @@ -4751,15 +4323,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", - "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.14.tgz", + "integrity": "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==", "cpu": [ "x64" ], @@ -4769,15 +4340,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", - "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.14.tgz", + "integrity": "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==", "cpu": [ "x64" ], @@ -4787,15 +4357,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", - "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.14.tgz", + "integrity": "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==", "cpu": [ "arm" ], @@ -4805,15 +4374,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", - "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.14.tgz", + "integrity": "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==", "cpu": [ "arm64" ], @@ -4823,15 +4391,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", - "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.14.tgz", + "integrity": "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==", "cpu": [ "arm64" ], @@ -4841,15 +4408,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", - "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.14.tgz", + "integrity": "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==", "cpu": [ "ppc64" ], @@ -4859,15 +4425,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", - "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.14.tgz", + "integrity": "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==", "cpu": [ "s390x" ], @@ -4877,15 +4442,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", - "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.14.tgz", + "integrity": "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==", "cpu": [ "x64" ], @@ -4895,15 +4459,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", - "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.14.tgz", + "integrity": "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==", "cpu": [ "x64" ], @@ -4913,15 +4476,14 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", - "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.14.tgz", + "integrity": "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==", "cpu": [ "arm64" ], @@ -4931,15 +4493,14 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", - "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.14.tgz", + "integrity": "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==", "cpu": [ "arm64" ], @@ -4949,15 +4510,14 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", - "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.14.tgz", + "integrity": "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==", "cpu": [ "x64" ], @@ -4967,7 +4527,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } @@ -4977,8 +4536,7 @@ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@rtsao/scc": { "version": "1.1.0", @@ -5062,13 +4620,6 @@ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "license": "MIT" }, - "node_modules/@sinclair/typebox": { - "version": "0.33.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.24.tgz", - "integrity": "sha512-91up4t0BLjfkCZ4Ap/BcgaPrMaX6n0I2YRu+kc03xGhLy9G3N05nbTpnK8q7GXdv0PxwUoxi67A8o3Wr5U7j3w==", - "license": "MIT", - "peer": true - }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -6273,42 +5824,6 @@ "pnpm": ">=9.0.0" } }, - "node_modules/@stellar/stellar-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", - "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@stellar/stellar-base/node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@stellar/stellar-base/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/@stellar/stellar-sdk": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-16.3.1.tgz", @@ -6394,2229 +5909,179 @@ "react": "^18 || ^19" } }, - "node_modules/@trezor/analytics": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.5.0.tgz", - "integrity": "sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.6.2.tgz", - "integrity": "sha512-HMz+Dm6nMflqRkaebMqpv3uNnVkRrb6lD2HKTHNBGhjVbqf0wRzJ8JoQ08wn/sF00ljJZz8pGnpcMYHJNxE+wQ==", + "node_modules/@trezor/connect-plugin-stellar": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-10.0.0-alpha.1.tgz", + "integrity": "sha512-v4lMnnBPxLoV/Yf8F0WmtkZGNsqurpxK62kqvaDeVoAtn5Ud+l6POQkLeQRiGsJYVm0vSDc4LHb5vLMrZTH/KA==", "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/stake": "^0.2.1", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@solana/rpc-types": "^2.3.0", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/blockchain-link-types": "1.5.1", - "@trezor/blockchain-link-utils": "1.5.2", - "@trezor/env-utils": "1.5.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "@trezor/websocket-client": "1.3.0", - "@types/web": "^0.0.197", - "crypto-browserify": "3.12.0", - "socks-proxy-agent": "8.0.5", - "stream-browserify": "^3.0.0", - "xrpl": "4.4.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-types": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.1.tgz", - "integrity": "sha512-Idavz6LwLBW8sXc69fh5AJEnl666EDl2Nt3io7updvBgOR0/P12I900DgjNhCKtiWuv66A33/5RE7zLcj3lfnw==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/blockchain-link-utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.2.tgz", - "integrity": "sha512-OSS5OEE98FMnYfjoEALPjBt7ebjC/FKnq3HOolHdEWXBpVlXZNN2+Vo1R9J6WbZUU087sHuUTJJy/GJYWY13Tg==", - "license": "See LICENSE.md in repo root", - "peer": true, "dependencies": { - "@mobily/ts-belt": "^3.13.1", - "@stellar/stellar-sdk": "14.2.0", - "@trezor/env-utils": "1.5.0", - "@trezor/protobuf": "1.5.2", - "@trezor/utils": "9.5.0", - "xrpl": "4.4.3" + "@trezor/utils": "10.0.0-alpha.1" }, "peerDependencies": { + "@stellar/stellar-sdk": "^13.3.0", + "@trezor/connect": "9.x.x", "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link-utils/node_modules/@stellar/stellar-sdk": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz", - "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@stellar/stellar-base": "^14.0.1", - "axios": "^1.12.2", - "bignumber.js": "^9.3.1", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@trezor/blockchain-link-utils/node_modules/@trezor/protobuf": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.2.tgz", - "integrity": "sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==", - "license": "See LICENSE.md in repo root", - "peer": true, + "node_modules/@trezor/connect-plugin-stellar/node_modules/@trezor/utils": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-10.0.0-alpha.1.tgz", + "integrity": "sha512-A+txzREoeX2MO1AqocDBsMNe+R21jTx5kungXGuzeTRRevARLsYh8MPes0170uMjq4qNSgopBnYZK18WyksOmQ==", + "license": "MIT", "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.4.0" + "bignumber.js": "^9.3.1" }, "peerDependencies": { "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link-utils/node_modules/bignumber.js": { + "node_modules/@trezor/connect-plugin-stellar/node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } }, - "node_modules/@trezor/blockchain-link-utils/node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@trezor/blockchain-link-utils/node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana-program/compute-budget": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.8.0.tgz", - "integrity": "sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana-program/stake": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@solana-program/stake/-/stake-0.2.1.tgz", - "integrity": "sha512-ssNPsJv9XHaA+L7ihzmWGYcm/+XYURQ8UA3wQMKf6ccEHyHOUgoglkkDU/BoA0+wul6HxZUN0tHFymC0qFw6sg==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana-program/token": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", - "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana-program/token-2022": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.4.2.tgz", - "integrity": "sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0", - "@solana/sysvars": "^2.1.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/accounts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.3.0.tgz", - "integrity": "sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==", + "node_modules/@trezor/connect-web": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-10.0.0-alpha.1.tgz", + "integrity": "sha512-CW1ZXzXNVYrJ2WuYneLK2LznkRAfKxRPB3vJyv1U2gia5Q7hsblImITsutLOztO0C2xO1sfETTCyVzfRkRVJEA==", "license": "MIT", - "peer": true, "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" + "@trezor/connect-common": "10.0.0-alpha.1", + "@trezor/utils": "10.0.0-alpha.1", + "@trezor/websocket-client": "10.0.0-alpha.1" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/addresses": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.3.0.tgz", - "integrity": "sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } + "node_modules/@trezor/connect-web/node_modules/@sinclair/typebox": { + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", + "license": "MIT" }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/assertions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.3.0.tgz", - "integrity": "sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==", + "node_modules/@trezor/connect-web/node_modules/@trezor/connect-common": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-10.0.0-alpha.1.tgz", + "integrity": "sha512-tuvM72XHACogT/fkp9D8wyzTE8h4X9emYUhvFs2pdTyIfTFs5RHDbcHQWFsvJgJoTK0H44XSSJb8pORijRfn9A==", "license": "MIT", - "peer": true, "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" + "@trezor/device-utils": "10.0.0-alpha.1", + "@trezor/protobuf": "10.0.0-alpha.1", + "@trezor/protocol": "^10.0.0-alpha.1", + "@trezor/schema-utils": "10.0.0-alpha.1", + "@trezor/type-utils": "10.0.0-alpha.1", + "@trezor/utils": "10.0.0-alpha.1" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/codecs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.3.0.tgz", - "integrity": "sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/options": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } + "node_modules/@trezor/connect-web/node_modules/@trezor/device-utils": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-10.0.0-alpha.1.tgz", + "integrity": "sha512-93LhEqH8uKCZHLtF+62uxd3/PXCfqpK4Z98ztfGu5vrtmoONb9dV8Falha0b3KXPDrQ10TUKasFGKLg570Z/Ew==", + "license": "MIT" }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", - "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", + "node_modules/@trezor/connect-web/node_modules/@trezor/protobuf": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-10.0.0-alpha.1.tgz", + "integrity": "sha512-aCUyqAr7Sho9TequaNAjnf27mgae6qzesNrOgB19bUrDrhaDDd/2eyr2SrrY1G4hPYkTyBC0jymvQnozn9f/kA==", "license": "MIT", - "peer": true, "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" + "@bufbuild/protobuf": "^2.11.0", + "@trezor/schema-utils": "10.0.0-alpha.1" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.3.0.tgz", - "integrity": "sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==", + "node_modules/@trezor/connect-web/node_modules/@trezor/protocol": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-10.0.1.tgz", + "integrity": "sha512-uoFyMzfr3/p7uXhTJSxXurfwM6N0vDicTKHlQRrwH9dMcidEEOxuOJZBrhKnoj4osLfDPt5+ctQ+mqFjxJA9Tw==", "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", - "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", + "node_modules/@trezor/connect-web/node_modules/@trezor/schema-utils": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-10.0.0-alpha.1.tgz", + "integrity": "sha512-0beYv0b0De3Z60sZzM1T+IrYwXeNL+7RKfLokTvqEFDzsQkwxhYrIX47FsBhGsOmGWx9x4+65dxDbnyd4wZT6g==", "license": "MIT", - "peer": true, "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" + "@sinclair/typebox": "^0.34.49", + "@trezor/type-utils": "10.0.0-alpha.1", + "ts-mixer": "^6.0.4" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.3.0.tgz", - "integrity": "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } + "node_modules/@trezor/connect-web/node_modules/@trezor/type-utils": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-10.0.0-alpha.1.tgz", + "integrity": "sha512-wK75rrwlyXFgPfdHQFRbeKCoj+orQLXKj7rliMK30z+F1y+rEcfv/MW2VP48Q9mL5pea+ZX1nRnb4hYx1v38Ow==", + "license": "MIT" }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", - "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", + "node_modules/@trezor/connect-web/node_modules/@trezor/utils": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-10.0.0-alpha.1.tgz", + "integrity": "sha512-A+txzREoeX2MO1AqocDBsMNe+R21jTx5kungXGuzeTRRevARLsYh8MPes0170uMjq4qNSgopBnYZK18WyksOmQ==", "license": "MIT", - "peer": true, "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/fast-stable-stringify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.3.0.tgz", - "integrity": "sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/functional": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.3.0.tgz", - "integrity": "sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" + "bignumber.js": "^9.3.1" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/instructions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.3.0.tgz", - "integrity": "sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==", + "node_modules/@trezor/connect-web/node_modules/@trezor/websocket-client": { + "version": "10.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-10.0.0-alpha.1.tgz", + "integrity": "sha512-129Ot1m+fDodRFBvav2d6v8nLxZLAl/udQP5l5W6jxQZcWUuviphDceT/juF8EvNGdw+L6OIu6fH+yCXARpFWQ==", "license": "MIT", - "peer": true, "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" + "@trezor/utils": "10.0.0-alpha.1", + "ws": "^8.20.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "tslib": "^2.6.2" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/keys": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.3.0.tgz", - "integrity": "sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==", + "node_modules/@trezor/connect-web/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", - "peer": true, - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" + "node": "*" } }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/kit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.3.0.tgz", - "integrity": "sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/addresses": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/programs": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/signers": "2.3.0", - "@solana/sysvars": "2.3.0", - "@solana/transaction-confirmation": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, + "node_modules/@trezor/connect-web/node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "license": "MIT", "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/nominal-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-2.3.0.tgz", - "integrity": "sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/options": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.3.0.tgz", - "integrity": "sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/programs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.3.0.tgz", - "integrity": "sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/promises": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.3.0.tgz", - "integrity": "sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.3.0.tgz", - "integrity": "sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-api": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-transport-http": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.3.0.tgz", - "integrity": "sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-parsed-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.3.0.tgz", - "integrity": "sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-spec": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.3.0.tgz", - "integrity": "sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-spec-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.3.0.tgz", - "integrity": "sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-subscriptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.3.0.tgz", - "integrity": "sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions-api": "2.3.0", - "@solana/rpc-subscriptions-channel-websocket": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-subscriptions-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.3.0.tgz", - "integrity": "sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.3.0.tgz", - "integrity": "sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3", - "ws": "^8.18.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-subscriptions-spec": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.3.0.tgz", - "integrity": "sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-transformers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.3.0.tgz", - "integrity": "sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-transport-http": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.3.0.tgz", - "integrity": "sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "undici-types": "^7.11.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/rpc-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.3.0.tgz", - "integrity": "sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/signers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.3.0.tgz", - "integrity": "sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/subscribable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.3.0.tgz", - "integrity": "sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/sysvars": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz", - "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/transaction-confirmation": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.3.0.tgz", - "integrity": "sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/transaction-messages": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.3.0.tgz", - "integrity": "sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@solana/transactions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.3.0.tgz", - "integrity": "sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/@stellar/stellar-sdk": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.2.0.tgz", - "integrity": "sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@stellar/stellar-base": "^14.0.1", - "axios": "^1.12.2", - "bignumber.js": "^9.3.1", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/undici-types": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.30.0.tgz", - "integrity": "sha512-7QjA5O+GhM27do7Id6hQZpnYEd7WzHbs7/XIS9A1k+Gat/ZVF7Jmpzt68zL/205f65FYwDNLSjQemHPS8ReM/A==", - "license": "MIT", - "peer": true - }, - "node_modules/@trezor/connect": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.7.3.tgz", - "integrity": "sha512-oAOfvJHT8tPqOXTmCOhn8uTZcoqSDuWAiWXQegx7C46tq+NLg+enkYXxUYEHq/9PmfZAOrUT9VMxZDsXM2thkA==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@ethereumjs/common": "^10.1.0", - "@ethereumjs/tx": "^10.1.0", - "@fivebinaries/coin-selection": "3.0.0", - "@mobily/ts-belt": "^3.13.1", - "@noble/hashes": "^1.6.1", - "@scure/bip39": "^1.5.1", - "@solana-program/compute-budget": "^0.8.0", - "@solana-program/system": "^0.7.0", - "@solana-program/token": "^0.5.1", - "@solana-program/token-2022": "^0.4.2", - "@solana/kit": "^2.3.0", - "@trezor/blockchain-link": "2.6.2", - "@trezor/blockchain-link-types": "1.5.1", - "@trezor/blockchain-link-utils": "1.5.2", - "@trezor/connect-analytics": "1.4.0", - "@trezor/connect-common": "0.5.1", - "@trezor/crypto-utils": "1.2.0", - "@trezor/device-authenticity": "1.1.2", - "@trezor/device-utils": "1.2.0", - "@trezor/env-utils": "^1.5.0", - "@trezor/protobuf": "1.5.3", - "@trezor/protocol": "1.3.1", - "@trezor/schema-utils": "1.4.0", - "@trezor/transport": "1.6.3", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "@trezor/utxo-lib": "2.5.0", - "blakejs": "^1.2.1", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cbor": "^10.0.10", - "cross-fetch": "^4.0.0", - "jws": "^4.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-analytics": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.4.0.tgz", - "integrity": "sha512-hy2J2oeIhRC/e1bOWXo5dsVMVnDwO2UKnxhR6FD8PINR3jgM6PWAXc6k33WJsBcyiTzwMP7/xPysLcgNJH5o4w==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/analytics": "1.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-common": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.5.1.tgz", - "integrity": "sha512-wdpVCwdylBh4SBO5Ys40tB/d59UlfjmxgBHDkkLgaR+JcqkthCfiw5VlUrV9wu65lquejAZhA5KQL4mUUUhCow==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/env-utils": "1.5.0", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-plugin-stellar": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-10.0.0-alpha.1.tgz", - "integrity": "sha512-v4lMnnBPxLoV/Yf8F0WmtkZGNsqurpxK62kqvaDeVoAtn5Ud+l6POQkLeQRiGsJYVm0vSDc4LHb5vLMrZTH/KA==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@trezor/utils": "10.0.0-alpha.1" - }, - "peerDependencies": { - "@stellar/stellar-sdk": "^13.3.0", - "@trezor/connect": "9.x.x", - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-plugin-stellar/node_modules/@trezor/utils": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-10.0.0-alpha.1.tgz", - "integrity": "sha512-A+txzREoeX2MO1AqocDBsMNe+R21jTx5kungXGuzeTRRevARLsYh8MPes0170uMjq4qNSgopBnYZK18WyksOmQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.3.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-plugin-stellar/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@trezor/connect-web": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-10.0.0-alpha.1.tgz", - "integrity": "sha512-CW1ZXzXNVYrJ2WuYneLK2LznkRAfKxRPB3vJyv1U2gia5Q7hsblImITsutLOztO0C2xO1sfETTCyVzfRkRVJEA==", - "license": "MIT", - "dependencies": { - "@trezor/connect-common": "10.0.0-alpha.1", - "@trezor/utils": "10.0.0-alpha.1", - "@trezor/websocket-client": "10.0.0-alpha.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@sinclair/typebox": { - "version": "0.34.52", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", - "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", - "license": "MIT" - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/connect-common": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-10.0.0-alpha.1.tgz", - "integrity": "sha512-tuvM72XHACogT/fkp9D8wyzTE8h4X9emYUhvFs2pdTyIfTFs5RHDbcHQWFsvJgJoTK0H44XSSJb8pORijRfn9A==", - "license": "MIT", - "dependencies": { - "@trezor/device-utils": "10.0.0-alpha.1", - "@trezor/protobuf": "10.0.0-alpha.1", - "@trezor/protocol": "^10.0.0-alpha.1", - "@trezor/schema-utils": "10.0.0-alpha.1", - "@trezor/type-utils": "10.0.0-alpha.1", - "@trezor/utils": "10.0.0-alpha.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/device-utils": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-10.0.0-alpha.1.tgz", - "integrity": "sha512-93LhEqH8uKCZHLtF+62uxd3/PXCfqpK4Z98ztfGu5vrtmoONb9dV8Falha0b3KXPDrQ10TUKasFGKLg570Z/Ew==", - "license": "MIT" - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/protobuf": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-10.0.0-alpha.1.tgz", - "integrity": "sha512-aCUyqAr7Sho9TequaNAjnf27mgae6qzesNrOgB19bUrDrhaDDd/2eyr2SrrY1G4hPYkTyBC0jymvQnozn9f/kA==", - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.11.0", - "@trezor/schema-utils": "10.0.0-alpha.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/protocol": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-10.0.1.tgz", - "integrity": "sha512-uoFyMzfr3/p7uXhTJSxXurfwM6N0vDicTKHlQRrwH9dMcidEEOxuOJZBrhKnoj4osLfDPt5+ctQ+mqFjxJA9Tw==", - "license": "MIT", - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/schema-utils": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-10.0.0-alpha.1.tgz", - "integrity": "sha512-0beYv0b0De3Z60sZzM1T+IrYwXeNL+7RKfLokTvqEFDzsQkwxhYrIX47FsBhGsOmGWx9x4+65dxDbnyd4wZT6g==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.49", - "@trezor/type-utils": "10.0.0-alpha.1", - "ts-mixer": "^6.0.4" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/type-utils": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-10.0.0-alpha.1.tgz", - "integrity": "sha512-wK75rrwlyXFgPfdHQFRbeKCoj+orQLXKj7rliMK30z+F1y+rEcfv/MW2VP48Q9mL5pea+ZX1nRnb4hYx1v38Ow==", - "license": "MIT" - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/utils": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-10.0.0-alpha.1.tgz", - "integrity": "sha512-A+txzREoeX2MO1AqocDBsMNe+R21jTx5kungXGuzeTRRevARLsYh8MPes0170uMjq4qNSgopBnYZK18WyksOmQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.3.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/@trezor/websocket-client": { - "version": "10.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-10.0.0-alpha.1.tgz", - "integrity": "sha512-129Ot1m+fDodRFBvav2d6v8nLxZLAl/udQP5l5W6jxQZcWUuviphDceT/juF8EvNGdw+L6OIu6fH+yCXARpFWQ==", - "license": "MIT", - "dependencies": { - "@trezor/utils": "10.0.0-alpha.1", - "ws": "^8.20.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/connect-web/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@trezor/connect-web/node_modules/ws": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", - "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@trezor/connect/node_modules/@solana-program/compute-budget": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.8.0.tgz", - "integrity": "sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/connect/node_modules/@solana-program/system": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz", - "integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/connect/node_modules/@solana-program/token": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", - "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@trezor/connect/node_modules/@solana-program/token-2022": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@solana-program/token-2022/-/token-2022-0.4.2.tgz", - "integrity": "sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==", - "license": "Apache-2.0", - "peer": true, - "peerDependencies": { - "@solana/kit": "^2.1.0", - "@solana/sysvars": "^2.1.0" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/accounts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.3.0.tgz", - "integrity": "sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/addresses": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.3.0.tgz", - "integrity": "sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/assertions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.3.0.tgz", - "integrity": "sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/codecs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.3.0.tgz", - "integrity": "sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/options": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", - "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/codecs-data-structures": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.3.0.tgz", - "integrity": "sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", - "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/codecs-strings": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.3.0.tgz", - "integrity": "sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", - "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/fast-stable-stringify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.3.0.tgz", - "integrity": "sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/functional": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.3.0.tgz", - "integrity": "sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/instructions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.3.0.tgz", - "integrity": "sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/keys": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.3.0.tgz", - "integrity": "sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/assertions": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/kit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.3.0.tgz", - "integrity": "sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/addresses": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/programs": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/signers": "2.3.0", - "@solana/sysvars": "2.3.0", - "@solana/transaction-confirmation": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/nominal-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-2.3.0.tgz", - "integrity": "sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/options": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.3.0.tgz", - "integrity": "sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/programs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.3.0.tgz", - "integrity": "sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/promises": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.3.0.tgz", - "integrity": "sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.3.0.tgz", - "integrity": "sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-api": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-transport-http": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.3.0.tgz", - "integrity": "sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-parsed-types": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-parsed-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.3.0.tgz", - "integrity": "sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-spec": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.3.0.tgz", - "integrity": "sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-spec-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.3.0.tgz", - "integrity": "sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-subscriptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.3.0.tgz", - "integrity": "sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/fast-stable-stringify": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-subscriptions-api": "2.3.0", - "@solana/rpc-subscriptions-channel-websocket": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-subscriptions-api": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.3.0.tgz", - "integrity": "sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/rpc-transformers": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.3.0.tgz", - "integrity": "sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/rpc-subscriptions-spec": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3", - "ws": "^8.18.0" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-subscriptions-spec": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.3.0.tgz", - "integrity": "sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/subscribable": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-transformers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.3.0.tgz", - "integrity": "sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-transport-http": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.3.0.tgz", - "integrity": "sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0", - "@solana/rpc-spec": "2.3.0", - "@solana/rpc-spec-types": "2.3.0", - "undici-types": "^7.11.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/rpc-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.3.0.tgz", - "integrity": "sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/nominal-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/signers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.3.0.tgz", - "integrity": "sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/subscribable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.3.0.tgz", - "integrity": "sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/sysvars": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz", - "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/accounts": "2.3.0", - "@solana/codecs": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/transaction-confirmation": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.3.0.tgz", - "integrity": "sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/promises": "2.3.0", - "@solana/rpc": "2.3.0", - "@solana/rpc-subscriptions": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0", - "@solana/transactions": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/transaction-messages": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.3.0.tgz", - "integrity": "sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/@solana/transactions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.3.0.tgz", - "integrity": "sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==", - "license": "MIT", - "peer": true, - "dependencies": { - "@solana/addresses": "2.3.0", - "@solana/codecs-core": "2.3.0", - "@solana/codecs-data-structures": "2.3.0", - "@solana/codecs-numbers": "2.3.0", - "@solana/codecs-strings": "2.3.0", - "@solana/errors": "2.3.0", - "@solana/functional": "2.3.0", - "@solana/instructions": "2.3.0", - "@solana/keys": "2.3.0", - "@solana/nominal-types": "2.3.0", - "@solana/rpc-types": "2.3.0", - "@solana/transaction-messages": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" - } - }, - "node_modules/@trezor/connect/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@trezor/connect/node_modules/undici-types": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.30.0.tgz", - "integrity": "sha512-7QjA5O+GhM27do7Id6hQZpnYEd7WzHbs7/XIS9A1k+Gat/ZVF7Jmpzt68zL/205f65FYwDNLSjQemHPS8ReM/A==", - "license": "MIT", - "peer": true - }, - "node_modules/@trezor/crypto-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.2.0.tgz", - "integrity": "sha512-9i1NrfW1IE6JO910ut7xrx4u5LxE++GETbpJhWLj4P5xpuGDDSDLEn/MXaYisls2DpE897aOrGPaa1qyt8V6tw==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/device-authenticity": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@trezor/device-authenticity/-/device-authenticity-1.1.2.tgz", - "integrity": "sha512-313uSXYR4XKDv3CjtCpgHA+yEe9xxqN7EFl/D68FEn70SPsuWI0+2zUvjPPh6TIOh/EcLv7hCO/QTHUAGd7ZWQ==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@noble/curves": "^2.0.1", - "@trezor/crypto-utils": "1.2.0", - "@trezor/protobuf": "1.5.2", - "@trezor/schema-utils": "1.4.0", - "@trezor/utils": "9.5.0" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/@noble/curves": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.4.0.tgz", - "integrity": "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "2.4.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/@noble/hashes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", - "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/@trezor/protobuf": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.2.tgz", - "integrity": "sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.4.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/device-authenticity/node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@trezor/device-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.2.0.tgz", - "integrity": "sha512-Aqp7pIooFTx21zRUtTI6i1AS4d9Lrx7cclvksh2nJQF9WJvbzuCXshEGkLoOsHwhQrCl3IXfbGuMdA12yDenPA==", - "license": "See LICENSE.md in repo root", - "peer": true - }, - "node_modules/@trezor/env-utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", - "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "ua-parser-js": "^2.0.4" - }, - "peerDependencies": { - "expo-constants": "*", - "expo-localization": "*", - "react-native": "*", - "tslib": "^2.6.2" - }, - "peerDependenciesMeta": { - "expo-constants": { - "optional": true - }, - "expo-localization": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@trezor/protobuf": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.5.3.tgz", - "integrity": "sha512-ZYQtapkT2NaiVrAgb91Zprnk3uhl2Wca0bsnJcWgE7vwzqKegjrSorRnkZLqLTKTbCaT6sgkCYtM2hPl4Hqw5Q==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@trezor/schema-utils": "1.4.0", - "long": "5.2.5", - "protobufjs": "7.5.5" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/protocol": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.3.1.tgz", - "integrity": "sha512-uNJ83n38+BM+AJKsWza1ocvQ206d6NXJQ8/g+DelPLTj5c37Rj6hFiY5Nb5zgM7DBnq6T8Aa2K8t4TVCzHT1qg==", - "license": "See LICENSE.md in repo root", - "peer": true, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/schema-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.4.0.tgz", - "integrity": "sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==", - "license": "See LICENSE.md in repo root", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.33.7", - "ts-mixer": "^6.0.3" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/transport": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.6.3.tgz", - "integrity": "sha512-GEi9KfiJsBgT/MCGNDIn9RDeXceLaAPjJT/GCayirXaCr3KnlpZCs6LGYkrjqapxiBm73nxM+BctKBKhpUl2cQ==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/protobuf": "1.5.3", - "@trezor/protocol": "1.3.1", - "@trezor/type-utils": "1.2.0", - "@trezor/utils": "9.5.0", - "cross-fetch": "^4.0.0", - "usb": "^2.15.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/type-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.2.0.tgz", - "integrity": "sha512-+E2QntxkyQuYfQQyl8RvT01tq2i5Dp/LFUOXuizF+KVOqsZBjBY43j5hewcCO3+MokD7deDiPyekbUEN5/iVlw==", - "license": "See LICENSE.md in repo root", - "peer": true - }, - "node_modules/@trezor/utils": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.5.0.tgz", - "integrity": "sha512-kdyMyDbxzvOZmwBNvTjAK+C/kzyOz8T4oUbFvq+KaXn5mBFf1uf8rq5X2HkxgdYRPArtHS3PxLKsfkNCdhCYtQ==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "bignumber.js": "^9.3.1" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/utils/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/@trezor/utxo-lib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.5.0.tgz", - "integrity": "sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "bech32": "^2.0.0", - "bip66": "^2.0.0", - "bitcoin-ops": "^1.4.1", - "blake-hash": "^2.0.0", - "blakejs": "^1.2.1", - "bn.js": "^5.2.2", - "bs58": "^6.0.0", - "bs58check": "^4.0.0", - "cashaddrjs": "0.4.4", - "create-hmac": "^1.1.7", - "int64-buffer": "^1.1.0", - "pushdata-bitcoin": "^1.0.1", - "tiny-secp256k1": "^1.1.7", - "typeforce": "^1.18.0", - "varuint-bitcoin": "2.0.0", - "wif": "^5.0.0" - }, - "peerDependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@trezor/websocket-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.3.0.tgz", - "integrity": "sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==", - "license": "SEE LICENSE IN LICENSE.md", - "peer": true, - "dependencies": { - "@trezor/utils": "9.5.0", - "ws": "^8.18.0" + "node": ">=10.0.0" }, "peerDependencies": { - "tslib": "^2.6.2" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@ts-morph/common": { @@ -8806,6 +6271,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -8828,7 +6294,7 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -8838,7 +6304,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -8883,20 +6349,6 @@ "integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==", "license": "MIT" }, - "node_modules/@types/w3c-web-usb": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", - "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/web": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.197.tgz", - "integrity": "sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -10230,74 +7682,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, - "node_modules/@xrplf/isomorphic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.2.tgz", - "integrity": "sha512-ncZUdMXr6VlSXtdoiDi0jTH+gBrgGxwVeEidhoegII3PmyErbQsyj6e+j7acmR4LW/lvBkPkzb9QzRfJH0n3rA==", - "license": "ISC", - "peer": true, - "dependencies": { - "@noble/hashes": "^2.0.1", - "eventemitter3": "5.0.1", - "ws": "^8.20.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@xrplf/isomorphic/node_modules/@noble/hashes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", - "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT", - "peer": true - }, - "node_modules/@xrplf/isomorphic/node_modules/ws": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", - "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@xrplf/secret-numbers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-2.0.0.tgz", - "integrity": "sha512-z3AOibRTE9E8MbjgzxqMpG1RNaBhQ1jnfhNCa1cGf2reZUJzPMYs4TggQTc7j8+0WyV3cr7y/U8Oz99SXIkN5Q==", - "license": "ISC", - "peer": true, - "dependencies": { - "@xrplf/isomorphic": "^1.0.1", - "ripple-keypairs": "^2.0.0" - } - }, "node_modules/abitype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.3.0.tgz", @@ -10674,25 +8058,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -10788,6 +8153,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -10923,23 +8289,6 @@ "node": ">=6.0.0" } }, - "node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "license": "MIT", - "peer": true - }, - "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "license": "Unlicense", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", @@ -10972,52 +8321,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bip32-path": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/bip32-path/-/bip32-path-0.4.2.tgz", "integrity": "sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ==", "license": "MIT" }, - "node_modules/bip66": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-2.0.0.tgz", - "integrity": "sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ==", - "license": "MIT", - "peer": true - }, - "node_modules/bitcoin-ops": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", - "license": "MIT", - "peer": true - }, - "node_modules/blake-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", - "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -11089,129 +8398,6 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "license": "MIT" }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "license": "MIT", - "peer": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", - "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", - "license": "ISC", - "peer": true, - "dependencies": { - "bn.js": "^5.2.3", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true - }, "node_modules/browserslist": { "version": "4.28.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", @@ -11254,17 +8440,6 @@ "base-x": "^5.0.0" } }, - "node_modules/bs58check": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", - "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "^1.2.0", - "bs58": "^6.0.0" - } - }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -11289,20 +8464,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT", - "peer": true - }, "node_modules/bufferutil": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", @@ -11345,6 +8506,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -11436,29 +8598,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/cashaddrjs": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cashaddrjs/-/cashaddrjs-0.4.4.tgz", - "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", - "license": "MIT", - "peer": true, - "dependencies": { - "big-integer": "1.6.36" - } - }, - "node_modules/cbor": { - "version": "10.0.12", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.12.tgz", - "integrity": "sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==", - "license": "MIT", - "peer": true, - "dependencies": { - "nofilter": "^3.0.2" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/chai": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", @@ -11533,21 +8672,6 @@ "node": ">= 6" } }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -11770,13 +8894,6 @@ "node": ">=6.6.0" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT", - "peer": true - }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -11820,84 +8937,6 @@ } } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -11930,29 +8969,6 @@ "node": "*" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "license": "MIT", - "peer": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -12262,6 +9278,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -12337,19 +9354,8 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "engines": { + "node": ">= 0.8" } }, "node_modules/destr": { @@ -12364,27 +9370,6 @@ "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", "license": "MIT" }, - "node_modules/detect-europe-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", - "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -12417,25 +9402,6 @@ "node": ">=0.3.1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -12488,16 +9454,6 @@ "node": ">= 0.4" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/eciesjs": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", @@ -13317,17 +10273,6 @@ "node": ">=18.0.0" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "peer": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/execa": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", @@ -13364,13 +10309,6 @@ "node": ">=12.0.0" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -13480,6 +10418,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -13535,13 +10474,6 @@ "fast-string-width": "^3.0.2" } }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0", - "peer": true - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -13623,13 +10555,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT", - "peer": true - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -13725,6 +10650,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -13919,26 +10845,6 @@ "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", "license": "MIT" }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "is-property": "^1.0.0" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -14198,6 +11104,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -14249,69 +11156,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/hash-base/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true - }, - "node_modules/hash-base/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true - }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -14531,13 +11375,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/int64-buffer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.1.2.tgz", - "integrity": "sha512-ZBb2qDtapL5lWiwgXIoNaCRb/OBPrQ6bK6J4p1AcPXzH/JA/eZmoTVCGGCOIQWIsWwOExGsPu5n8+aBG6itMzA==", - "license": "MIT", - "peer": true - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -14713,6 +11550,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -14908,27 +11746,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-my-ip-valid": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", - "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", - "license": "MIT", - "peer": true - }, - "node_modules/is-my-json-valid": { - "version": "2.20.6", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", - "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", - "license": "MIT", - "peer": true, - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^5.0.0", - "xtend": "^4.0.0" - } - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -15004,13 +11821,6 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT", - "peer": true - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -15084,27 +11894,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-standalone-pwa": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz", - "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", @@ -15156,6 +11945,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -15244,6 +12034,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -15471,16 +12262,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -15497,29 +12278,6 @@ "node": ">=4.0" } }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "peer": true, - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -15585,7 +12343,6 @@ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -15623,7 +12380,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15645,7 +12401,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15667,7 +12422,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15689,7 +12443,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15711,7 +12464,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15733,7 +12485,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15755,7 +12506,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15777,7 +12527,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15799,7 +12548,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15821,7 +12569,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15843,7 +12590,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -15965,13 +12711,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.5.tgz", - "integrity": "sha512-e0r9YBBgNCq1D1o5Dp8FMH0N5hsFtXDBiVa0qoJPHpakvZkmDKPRoGffZJII/XsHvj9An9blm+cRJ01yQqU+Dw==", - "license": "Apache-2.0", - "peer": true - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -15985,13 +12724,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lru_map": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.4.1.tgz", - "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==", - "license": "MIT", - "peer": true - }, "node_modules/lru-cache": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", @@ -16041,18 +12773,6 @@ "is-buffer": "~1.1.6" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "peer": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -16102,27 +12822,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -16320,13 +13019,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz", - "integrity": "sha512-GlGk3HIvitbvs+LT3g6XUP1kpirKNvmDFwF/bmo6XNWSb/eYEs/O4bfgIEIXCZ+lIOTS5xNwDvSGMw6FJdAhtA==", - "license": "MIT", - "peer": true - }, "node_modules/nanoid": { "version": "3.3.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", @@ -16368,160 +13060,6 @@ "dev": true, "license": "MIT" }, - "node_modules/near-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/near-abi/-/near-abi-0.2.0.tgz", - "integrity": "sha512-kCwSf/3fraPU2zENK18sh+kKG4uKbEUEQdyWQkmW8ZofmLarObIz2+zAYjA1teDZLeMvEQew3UysnPDXgjneaA==", - "license": "(MIT AND Apache-2.0)", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.11" - } - }, - "node_modules/near-api-js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-5.1.1.tgz", - "integrity": "sha512-h23BGSKxNv8ph+zU6snicstsVK1/CTXsQz4LuGGwoRE24Hj424nSe4+/1tzoiC285Ljf60kPAqRCmsfv9etF2g==", - "license": "(MIT AND Apache-2.0)", - "peer": true, - "dependencies": { - "@near-js/accounts": "1.4.1", - "@near-js/crypto": "1.4.2", - "@near-js/keystores": "0.2.2", - "@near-js/keystores-browser": "0.2.2", - "@near-js/keystores-node": "0.1.2", - "@near-js/providers": "1.0.3", - "@near-js/signers": "0.2.2", - "@near-js/transactions": "1.3.3", - "@near-js/types": "0.3.1", - "@near-js/utils": "1.1.0", - "@near-js/wallet-account": "1.3.3", - "@noble/curves": "1.8.1", - "borsh": "1.0.0", - "depd": "2.0.0", - "http-errors": "1.7.2", - "near-abi": "0.2.0", - "node-fetch": "2.6.7" - } - }, - "node_modules/near-api-js/node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/near-api-js/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/near-api-js/node_modules/borsh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz", - "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/near-api-js/node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "license": "MIT", - "peer": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/near-api-js/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/near-api-js/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC", - "peer": true - }, - "node_modules/near-api-js/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/near-api-js/node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "license": "ISC", - "peer": true - }, - "node_modules/near-api-js/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/near-api-js/node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -16612,13 +13150,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "license": "MIT", - "peer": true - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -16701,19 +13232,9 @@ }, "node_modules/node-releases": { "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", - "license": "MIT" - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.19" - } + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -17149,23 +13670,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "license": "ISC", - "peer": true, - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -17242,24 +13746,6 @@ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "license": "MIT" }, - "node_modules/pbkdf2": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.7.tgz", - "integrity": "sha512-nS4mvFgVwUrecPTRdpdseM2fwpdfnX0/HibA8DgBRQtihUAzHQYJFU2l+OlEtiXtpqkrMvCPDwyXMUnASDt6Qw==", - "license": "MIT", - "peer": true, - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -17357,6 +13843,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -17614,13 +14101,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true - }, "node_modules/process-warning": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.0.tgz", @@ -17678,31 +14158,6 @@ "dev": true, "license": "MIT" }, - "node_modules/protobufjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", - "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -17731,28 +14186,6 @@ "node": ">=10" } }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -17763,16 +14196,6 @@ "node": ">=6" } }, - "node_modules/pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "bitcoin-ops": "^1.3.0" - } - }, "node_modules/qrcode": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", @@ -18083,17 +14506,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "license": "MIT", - "peer": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -18247,21 +14659,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -18494,90 +14891,14 @@ "node": ">=0.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "license": "MIT", - "peer": true, - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripple-address-codec": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.1.tgz", - "integrity": "sha512-JQHLKuVJV8lv9Qobmn4aUM2Dpv9WRRLKnNWfM8tN02fAbUtG8mUPsu9q9UYX8P76G4qzytEc5ZKMp/3JggNYmw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@scure/base": "^2.0.0", - "@xrplf/isomorphic": "^1.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/ripple-address-codec/node_modules/@scure/base": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.4.0.tgz", - "integrity": "sha512-thZ1TuJwFwBblOhgsjDKvvGirBxNp+wSvY/DR6tJBJOTDhdAAcHJ8Vbr2eFnqaxeca4+t0i9KBf+uHYGWwZORg==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ripple-binary-codec": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.11.0.tgz", - "integrity": "sha512-qad61CYAqIi8H7DuPnuDpj40wrXY8wYrc1YbuDcA9G/NZG0Uu8unHNbTC6Itz8SlOSL0P/nF/8HTFW/1caVlTg==", - "license": "ISC", - "peer": true, - "dependencies": { - "@xrplf/isomorphic": "^1.0.2", - "bignumber.js": "^10.0.2", - "ripple-address-codec": "^5.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/ripple-binary-codec/node_modules/bignumber.js": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-10.0.2.tgz", - "integrity": "sha512-E8Wp9O06QA6lneJ4aRUXKYf/1GIomqUEmUMwtIOMtDxf1U52ffJY+y7JBk/8wRafA8qOIqLnXQGqonYXZdBnFQ==", - "license": "MIT", - "peer": true - }, - "node_modules/ripple-keypairs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.1.0.tgz", - "integrity": "sha512-B+Pf4A2EOQhU8LavUVz+ilQsS8yLXivmDFrJ0FswmCjL3bMHNvFovfqQVdffsJOZnIVHQDNehy9uiKJBfQSnbw==", - "license": "ISC", - "peer": true, - "dependencies": { - "@noble/curves": "^1.0.0", - "@xrplf/isomorphic": "^1.0.1", - "ripple-address-codec": "^5.0.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/rolldown": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.13.tgz", - "integrity": "sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.14.tgz", + "integrity": "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@oxc-project/types": "=0.153.0", + "@oxc-project/types": "=0.154.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -18587,21 +14908,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.13", - "@rolldown/binding-android-arm64": "1.2.13", - "@rolldown/binding-darwin-arm64": "1.2.13", - "@rolldown/binding-darwin-x64": "1.2.13", - "@rolldown/binding-freebsd-x64": "1.2.13", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.13", - "@rolldown/binding-linux-arm64-gnu": "1.2.13", - "@rolldown/binding-linux-arm64-musl": "1.2.13", - "@rolldown/binding-linux-ppc64-gnu": "1.2.13", - "@rolldown/binding-linux-s390x-gnu": "1.2.13", - "@rolldown/binding-linux-x64-gnu": "1.2.13", - "@rolldown/binding-linux-x64-musl": "1.2.13", - "@rolldown/binding-openharmony-arm64": "1.2.13", - "@rolldown/binding-win32-arm64-msvc": "1.2.13", - "@rolldown/binding-win32-x64-msvc": "1.2.13" + "@rolldown/binding-android-arm-eabi": "1.2.14", + "@rolldown/binding-android-arm64": "1.2.14", + "@rolldown/binding-darwin-arm64": "1.2.14", + "@rolldown/binding-darwin-x64": "1.2.14", + "@rolldown/binding-freebsd-x64": "1.2.14", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", + "@rolldown/binding-linux-arm64-gnu": "1.2.14", + "@rolldown/binding-linux-arm64-musl": "1.2.14", + "@rolldown/binding-linux-ppc64-gnu": "1.2.14", + "@rolldown/binding-linux-s390x-gnu": "1.2.14", + "@rolldown/binding-linux-x64-gnu": "1.2.14", + "@rolldown/binding-linux-x64-musl": "1.2.14", + "@rolldown/binding-openharmony-arm64": "1.2.14", + "@rolldown/binding-win32-arm64-msvc": "1.2.14", + "@rolldown/binding-win32-x64-msvc": "1.2.14" } }, "node_modules/router": { @@ -18906,6 +15227,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -18956,27 +15278,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "peer": true, - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/sha1": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", @@ -19261,17 +15562,6 @@ "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==", "license": "MIT" }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/smol-toml": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz", @@ -19312,36 +15602,6 @@ "node": ">=10.0.0" } }, - "node_modules/socks": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz", - "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/sonic-boom": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", @@ -19427,17 +15687,6 @@ "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, "node_modules/stream-chain": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", @@ -19459,16 +15708,6 @@ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "license": "MIT" }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -19937,31 +16176,6 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, - "node_modules/tiny-secp256k1": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", - "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tiny-secp256k1/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT", - "peer": true - }, "node_modules/tinybench": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.1.tgz", @@ -20048,21 +16262,6 @@ "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", "license": "MIT" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "peer": true, - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -20084,13 +16283,6 @@ "node": ">=0.6" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "license": "MIT", - "peer": true - }, "node_modules/tough-cookie": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", @@ -20261,6 +16453,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -20334,17 +16527,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "license": "MIT", - "peer": true - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -20378,59 +16565,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ua-is-frozen": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz", - "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/ua-parser-js": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.10.tgz", - "integrity": "sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "AGPL-3.0-or-later", - "peer": true, - "dependencies": { - "detect-europe-js": "^0.1.2", - "is-standalone-pwa": "^0.1.1", - "ua-is-frozen": "^0.1.2" - }, - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/ufo": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", @@ -20449,16 +16583,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uint8array-tools": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.8.tgz", - "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/uint8arrays": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", @@ -20737,39 +16861,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT", - "peer": true - }, - "node_modules/usb": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/usb/-/usb-2.19.1.tgz", - "integrity": "sha512-fjVddzu00GFc1Z5fd5+zuZrqylsfuBbmKKygx3rbIS9w5Nh3ddGVWDHkPBQ/BbB3PVEp6kdsZfX9WXhlsRdPDQ==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/w3c-web-usb": "^1.0.6", - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.5.0" - }, - "engines": { - "node": ">=12.22.0 <13.0 || >=14.17.0" - } - }, - "node_modules/usb/node_modules/node-addon-api": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", - "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -20891,16 +16982,6 @@ } } }, - "node_modules/varuint-bitcoin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-2.0.0.tgz", - "integrity": "sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog==", - "license": "MIT", - "peer": true, - "dependencies": { - "uint8array-tools": "^0.0.8" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -21056,17 +17137,16 @@ } }, "node_modules/vite": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.3.tgz", - "integrity": "sha512-cTAldKPImjg6c+gk48U19POPn3GCBzZwpdsN8ZMEEcbpes+6/wvfqUd0C2y3qYY4wsj8PwgFwrZ/1jBPVttMSg==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", + "integrity": "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", - "postcss": "^8.5.28", - "rolldown": "~1.2.11", + "postcss": "^8.5.29", + "rolldown": "~1.2.12", "tinyglobby": "^0.2.17" }, "bin": { @@ -21140,7 +17220,6 @@ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -21361,6 +17440,7 @@ "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -21391,16 +17471,6 @@ "node": ">=20.11" } }, - "node_modules/wif": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/wif/-/wif-5.0.0.tgz", - "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "bs58check": "^4.0.0" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -21520,48 +17590,6 @@ "node": ">=0.4.0" } }, - "node_modules/xrpl": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.4.3.tgz", - "integrity": "sha512-vi2OjuNkiaP8nv1j+nqHp8GZwwEjO6Y8+j/OuVMg6M4LwXEwyHdIj33dlg7cyY1Lw5+jb9HqFOQvABhaywVbTQ==", - "license": "ISC", - "peer": true, - "dependencies": { - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@xrplf/isomorphic": "^1.0.1", - "@xrplf/secret-numbers": "^2.0.0", - "bignumber.js": "^9.0.0", - "eventemitter3": "^5.0.1", - "fast-json-stable-stringify": "^2.1.0", - "ripple-address-codec": "^5.0.0", - "ripple-binary-codec": "^2.5.0", - "ripple-keypairs": "^2.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/xrpl/node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 1839d2c..4e2e52c 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "postcss": "^8.5.14", "tailwindcss": "^3.4.19", "typescript": "^5", + "vite": "^8.3.4", "vitest": "^5.0.3" }, "license": "MIT"