diff --git a/app/copy-trade/page.tsx b/app/copy-trade/page.tsx index ade9760..8b58598 100644 --- a/app/copy-trade/page.tsx +++ b/app/copy-trade/page.tsx @@ -57,6 +57,7 @@ function CopyTradeContent() { const [traceError, setTraceError] = useState(null); const { data: market } = useMarket(marketIdParam ?? trace?.marketId ?? undefined); const onChainMarketId = market?.onChainMarketId ?? null; + const onChainMarket = useOnChainMarket(onChainMarketId); const balance = useUsdcBalance(address); const reserve = useAccountReserve(address); @@ -184,6 +185,24 @@ function CopyTradeContent() { setStatusMessage("This market isn't on-chain yet, so it can't be traded."); return; } + if (!onChainMarket.data) { + setStatusMessage("Checking the on-chain market and ledger time…"); + return; + } + if (!marketCanTrade) { + setStatusMessage("This market is closed or too close to its deadline to safely place a trade."); + return; + } + if (!trustlineReady) { + setStatusMessage( + trustlineMissing + ? "Enable your USDC trustline before copying this trade." + : trustline.data?.kind === "present" + ? "The issuer hasn't authorized your USDC trustline." + : "Checking your USDC trustline…", + ); + return; + } if (!amountRaw || amountRaw <= 0n) { setStatusMessage("Choose an allocation greater than zero. You may need USDC in your wallet first."); return; @@ -197,6 +216,17 @@ function CopyTradeContent() { return; } + const freshMarket = await fetchOnChainMarket(onChainMarketId); + const freshLedgerNow = getLedgerNow(); + if ( + freshLedgerNow === null || + freshMarket.market.status.tag !== "Open" || + BigInt(Math.floor(freshLedgerNow)) + BigInt(SAFETY_MARGIN_S + MIN_TX_TIMEOUT_S) >= freshMarket.market.close_time + ) { + setStatusMessage("This market is closed or too close to its deadline to safely place a trade."); + return; + } + setStatusMessage("Recording your copy trade…"); const { copyTradeId } = await initiateCopyTrade({ traceId: trace.id, @@ -230,6 +260,16 @@ function CopyTradeContent() { } }; + const handleEnableUsdc = async () => { + setStatusMessage("Checking XLM reserve, then opening your wallet…"); + try { + await enableUsdc.mutateAsync(); + setStatusMessage("USDC is enabled. Click Confirm Copy Trade when you're ready."); + } catch (error) { + setStatusMessage(error instanceof Error ? error.message : "Couldn't enable USDC."); + } + }; + return (