From fb78e67633312a25db04686ebd4c548bf72fd393 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Tue, 22 Jul 2025 14:46:57 +0530 Subject: [PATCH] Fix jupiter price methods --- src/app/api/registry/route.ts | 9 +++--- src/components/PaymentModal.tsx | 15 ++++------ src/services/jupiterPrice.ts | 51 +++++++++++++-------------------- 3 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/app/api/registry/route.ts b/src/app/api/registry/route.ts index 0f1838f..f1fbb3f 100644 --- a/src/app/api/registry/route.ts +++ b/src/app/api/registry/route.ts @@ -10,7 +10,7 @@ import { DENOM as ALNT_DENOM } from '@cerc-io/registry-sdk'; import { verifyUnusedSolanaPayment } from '@/utils/solanaVerify'; import { transferLNTTokens } from '@/services/laconicTransfer'; import { getRegistry, getRegistryConfig } from '@/config'; -import { calculateTokenAmount } from '@/services/jupiterPrice'; +import { GetRequiredTokenInfo } from '@/services/jupiterPrice'; assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required'); const SOLANA_RPC_URL = process.env.NEXT_PUBLIC_SOLANA_RPC_URL; @@ -185,7 +185,8 @@ export async function POST(request: NextRequest) { // Calculate expected token amount based on current price let expectedTokenAmount: number; try { - expectedTokenAmount = await calculateTokenAmount(targetUsdAmount, mintAddress); + const { requiredAmount } = await GetRequiredTokenInfo(targetUsdAmount, mintAddress); + expectedTokenAmount = Math.round(requiredAmount - 0.2 * requiredAmount); // Allow 20% slippage due to price fluctuations } catch (error) { console.error('Error calculating token amount:', error); return NextResponse.json({ @@ -223,7 +224,7 @@ export async function POST(request: NextRequest) { } console.log('LNT transfer completed:', lntTransferResult.transactionHash); - const finalTxHash = lntTransferResult.transactionHash!; // Use LNT transfer hash for registry + const laconicTxHash = lntTransferResult.transactionHash!; // Use LNT transfer hash for registry // Validate required environment variables for Solana payments const requiredEnvVars = [ @@ -412,7 +413,7 @@ export async function POST(request: NextRequest) { tx_hash: txHash, pubkey: senderPublicKey }, - payment: finalTxHash, + payment: laconicTxHash, }; console.log('Deployment request data:', deploymentRequestData); diff --git a/src/components/PaymentModal.tsx b/src/components/PaymentModal.tsx index 70107fc..041327c 100644 --- a/src/components/PaymentModal.tsx +++ b/src/components/PaymentModal.tsx @@ -7,7 +7,7 @@ import assert from 'assert'; import { Connection } from '@solana/web3.js'; import { sendSolanaTokenPayment } from '@/services/solana'; -import { calculateTokenAmount, getTokenPrice } from '@/services/jupiterPrice'; +import { GetRequiredTokenInfo } from '@/services/jupiterPrice'; import { PaymentModalProps } from '@/types'; assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required'); @@ -42,12 +42,9 @@ export default function PaymentModal({ setError(''); try { - const [amount, priceInfo] = await Promise.all([ - calculateTokenAmount(targetUsdAmount, mintAddress), - getTokenPrice(mintAddress) - ]); - setTokenAmount(amount); - setTokenDecimals(priceInfo.decimals); + const {requiredAmount, decimals} = await GetRequiredTokenInfo(targetUsdAmount, mintAddress) + setTokenAmount(requiredAmount); + setTokenDecimals(decimals); } catch (error) { console.error('Error fetching token price:', error); setError('Unable to fetch current token price. Please try again.'); @@ -147,7 +144,7 @@ export default function PaymentModal({ - Calculating token amount... + Fetching token amount... ) : (

- Token amount calculated from current market price + Token information fetched from Jupiter

diff --git a/src/services/jupiterPrice.ts b/src/services/jupiterPrice.ts index 4120e3f..364b6bc 100644 --- a/src/services/jupiterPrice.ts +++ b/src/services/jupiterPrice.ts @@ -12,27 +12,32 @@ interface TokenPriceInfo { decimals: number; } +interface RequiredTokenInfo { + requiredAmount: number; + decimals: number; +} + /** * Fetches token price from Jupiter aggregator API * @param mintAddress The Solana token mint address * @returns Token price information including USD price and decimals */ -export async function getTokenPrice(mintAddress: string): Promise { +export async function getTokenInfo(mintAddress: string): Promise { try { const response = await fetch(`https://lite-api.jup.ag/price/v3?ids=${mintAddress}`); - + if (!response.ok) { throw new Error(`Jupiter API error: ${response.status} ${response.statusText}`); } - + const data: JupiterPriceResponse = await response.json(); - + if (!data[mintAddress]) { throw new Error(`Price not found for token: ${mintAddress}`); } - + const tokenInfo = data[mintAddress]; - + return { usdPrice: tokenInfo.usdPrice, decimals: tokenInfo.decimals @@ -47,32 +52,16 @@ export async function getTokenPrice(mintAddress: string): Promise { - const priceInfo = await getTokenPrice(mintAddress); - +export async function GetRequiredTokenInfo(targetUsdAmount: number, mintAddress: string): Promise { + const priceInfo = await getTokenInfo(mintAddress); + // Calculate token amount needed const tokenAmount = targetUsdAmount / priceInfo.usdPrice; - - // Convert to smallest units (considering decimals) - const amountInSmallestUnits = Math.ceil(tokenAmount * Math.pow(10, priceInfo.decimals)); - - return amountInSmallestUnits; -} -/** - * Gets the current USD value of a token amount - * @param tokenAmount Token amount in smallest units - * @param mintAddress The Solana token mint address - * @returns USD value of the token amount - */ -export async function getTokenValueInUSD(tokenAmount: number, mintAddress: string): Promise { - const priceInfo = await getTokenPrice(mintAddress); - - // Convert from smallest units to token units - const actualTokens = tokenAmount / Math.pow(10, priceInfo.decimals); - - // Calculate USD value - return actualTokens * priceInfo.usdPrice; -} \ No newline at end of file + // Convert to smallest units (considering decimals) + const amountInSmallestUnits = Math.round(tokenAmount * Math.pow(10, priceInfo.decimals)); + + return {requiredAmount: amountInSmallestUnits, decimals: priceInfo.decimals}; +}