From 2de17043ca2499a57e4f5041d7db9b4f7e748361 Mon Sep 17 00:00:00 2001 From: mstfyldz Date: Sat, 14 Mar 2026 00:45:09 +0300 Subject: [PATCH] fix: update checkout sweep api to use binance price fetching for consistency with sync worker --- app/api/crypto-sweep/route.ts | 41 +++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/app/api/crypto-sweep/route.ts b/app/api/crypto-sweep/route.ts index 67c5b1c..8f5e1b5 100644 --- a/app/api/crypto-sweep/route.ts +++ b/app/api/crypto-sweep/route.ts @@ -87,26 +87,39 @@ export async function POST(request: Request) { let expectedCryptoAmount = transaction.amount.toString(); try { - const coinIdMap: Record = { - 'SOL': 'solana', 'USDC': 'usd-coin', 'USDT': 'tether', 'TRX': 'tron', 'BTC': 'bitcoin' + const symbolMap: Record = { + 'SOL': 'SOLUSDT', 'MATIC': 'MATICUSDT', 'POLYGON': 'MATICUSDT', + 'USDC': 'USDCUSDT', 'USDT': 'USDTUSDT', 'TRX': 'TRXUSDT' }; - const coinId = coinIdMap[selectedToken] || 'solana'; - const priceUrl = `https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd,try`; - const priceRes = await fetch(priceUrl); - const priceData = await priceRes.json(); - const currencyKey = (transaction.currency || 'TRY').toLowerCase(); + const pair = symbolMap[selectedToken] || 'SOLUSDT'; - const priceInCurrency = priceData[coinId][currencyKey] || priceData[coinId]['usd']; + // 1. Get USD/TRY rate + const tryRes = await fetch(`https://api.binance.com/api/v3/ticker/price?symbol=USDTTRY`); + const tryData = await tryRes.json(); + const usdTryPrice = parseFloat(tryData.price) || 32.5; - if (priceInCurrency) { - // Apply a small tolerance (2%) and cross-convert if needed (simple assumption for demo) - const price = currencyKey === 'try' ? priceInCurrency : (priceInCurrency * 32.5); // Fallback conversion - const rawExpected = parseFloat(transaction.amount) / priceInCurrency; + // 2. Get Crypto/USD rate + let cryptoUsdPrice = 1.0; + if (pair !== 'USDTUSDT' && pair !== 'USDCUSDT') { + const cryptoRes = await fetch(`https://api.binance.com/api/v3/ticker/price?symbol=${pair}`); + const cryptoData = await cryptoRes.json(); + cryptoUsdPrice = parseFloat(cryptoData.price) || 1.0; + } + + const priceInTry = cryptoUsdPrice * usdTryPrice; + const currency = (transaction.currency || 'TRY').toUpperCase(); + const priceInTarget = currency === 'USD' ? cryptoUsdPrice : priceInTry; + + if (priceInTarget > 0) { + const rawExpected = parseFloat(transaction.amount) / priceInTarget; expectedCryptoAmount = (rawExpected * 0.98).toFixed(6); - console.log(`[Sweep] ${transaction.amount} ${transaction.currency} => ~${rawExpected.toFixed(6)} ${selectedToken}`); + console.log(`[Sweep API] Price for ${selectedToken}: ${priceInTarget.toFixed(2)} ${currency} | Expected: ${expectedCryptoAmount}`); } } catch (priceErr) { - console.warn("[Sweep] Price fetch failed, using order amount as fallback"); + console.warn("[Sweep API] Price fetch failed, using fallback rates."); + const staticRates: Record = { 'SOL': 4000, 'USDT': 33, 'USDC': 33, 'TRX': 5, 'MATIC': 25 }; + const rate = staticRates[selectedToken] || 1; + expectedCryptoAmount = (parseFloat(transaction.amount) / rate * 0.95).toFixed(6); } const verification = await cryptoEngine.verifyPayment(