diff --git a/src/app/api/registry/route.ts b/src/app/api/registry/route.ts index 96a3a26..e2fa464 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/solana-verify'; import { transferLNTTokens } from '@/services/laconic-transfer'; import { getRegistry, getRegistryConfig } from '@/config'; -import { getRequiredTokenInfo } from '@/services/jupiter-price'; +import { getRequiredTokenInfo, RequiredTokenInfo } from '@/services/jupiter-price'; import { IS_NAT_GOR_TRANSFER_ENABLED, WRAPPED_SOL_MINT_ADDRESS } from '@/constants/payments'; import { PaymentMethod } from '@/types'; @@ -139,12 +139,27 @@ export const registryTransactionWithRetry = async ( throw lastError; }; +let solanaConnection: Connection | null = null; +let gorbaganaConnection: Connection | null = null; + // Helper function to get the appropriate connection based on payment method const getConnection = (paymentMethod: PaymentMethod): Connection => { - if (paymentMethod === PaymentMethod.NAT_GOR && GORBAGANA_RPC_URL) { - return new Connection(GORBAGANA_RPC_URL); + switch (paymentMethod) { + case PaymentMethod.NAT_GOR: + if (!gorbaganaConnection) { + gorbaganaConnection = new Connection(GORBAGANA_RPC_URL!); + } + + return gorbaganaConnection; + case PaymentMethod.SPL_TOKEN: + if (!solanaConnection) { + solanaConnection = new Connection(SOLANA_RPC_URL); + } + + return solanaConnection; + default: + throw new Error("Invalid payment method"); } - return new Connection(SOLANA_RPC_URL); }; export async function POST(request: NextRequest) { @@ -205,18 +220,16 @@ export async function POST(request: NextRequest) { // Calculate expected token amount based on current price - let requiredAmountInBaseUnits: number; + let requiredTokenInfo: RequiredTokenInfo; const targetUsdAmount = parseFloat(process.env.NEXT_PUBLIC_SOLANA_PAYMENT_AMOUNT_USD!); const mintAddress = process.env.NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS!; try { if (paymentMethod === PaymentMethod.NAT_GOR) { - const requiredNativeGorInfo = await getRequiredTokenInfo(targetUsdAmount, WRAPPED_SOL_MINT_ADDRESS); - requiredAmountInBaseUnits = requiredNativeGorInfo.requiredAmountInBaseUnits; + requiredTokenInfo = await getRequiredTokenInfo(targetUsdAmount, WRAPPED_SOL_MINT_ADDRESS); } else if (paymentMethod === PaymentMethod.SPL_TOKEN) { - const requiredTokenInfo = await getRequiredTokenInfo(targetUsdAmount, mintAddress); - requiredAmountInBaseUnits = requiredTokenInfo.requiredAmountInBaseUnits; + requiredTokenInfo = await getRequiredTokenInfo(targetUsdAmount, mintAddress); } else { return NextResponse.json({ status: 'error', @@ -231,6 +244,7 @@ export async function POST(request: NextRequest) { }, { status: 500 }); } + const requiredAmountInBaseUnits = requiredTokenInfo.requiredAmountInBaseUnits; const expectedTokenAmount = Math.round(requiredAmountInBaseUnits - ALLOWED_SLIPPAGE_FACTOR * requiredAmountInBaseUnits); const solanaPaymentResult = await verifyUnusedSolanaPayment( diff --git a/src/components/PaymentModal.tsx b/src/components/PaymentModal.tsx index d836503..5140aa8 100644 --- a/src/components/PaymentModal.tsx +++ b/src/components/PaymentModal.tsx @@ -3,7 +3,7 @@ import { useCallback, useState, useEffect } from 'react'; import assert from 'assert'; -import { Connection, LAMPORTS_PER_SOL } from '@solana/web3.js'; +import { Connection } from '@solana/web3.js'; import { useConnection, useWallet } from '@solana/wallet-adapter-react'; import { sendSolanaPayment } from '@/services/solana'; @@ -131,16 +131,11 @@ export default function PaymentModal({ }, [paymentMethod, tokenAmount, loadingPrice, wallet, solanaConnection, publicKey, onPaymentComplete]); const getPaymentAmountDisplay = () => { - if (loadingPrice) return 'Loading...'; + if (loadingPrice) { + return 'Loading...' + }; - switch (paymentMethod) { - case PaymentMethod.NAT_GOR: - return tokenAmount > 0 ? `${(tokenAmount / LAMPORTS_PER_SOL).toFixed(6)} GOR` : '0'; - case PaymentMethod.SPL_TOKEN: - return tokenAmount > 0 ? `${(tokenAmount / Math.pow(10, tokenDecimals)).toFixed(6)} ${tokenSymbol}` : '0'; - default: - return ''; - } + return tokenAmount > 0 ? `${(tokenAmount / Math.pow(10, tokenDecimals)).toFixed(6)}` : '0'; }; if (!isOpen || !paymentMethod) return null; diff --git a/src/components/WalletProviders.tsx b/src/components/WalletProviders.tsx index b57209c..11788eb 100644 --- a/src/components/WalletProviders.tsx +++ b/src/components/WalletProviders.tsx @@ -43,8 +43,8 @@ export default function WalletProviders({ children }: WalletProvidersProps) { // Filter wallets based on selected payment method const wallets = useMemo(() => { if (!selectedPaymentMethod) { - // If no payment method selected, show all wallets - return allWallets; + // If no payment method selected, do not show any wallets + return []; } return allWallets.filter(wallet => {