diff --git a/components/swap/SwapReviewRouteInfo.tsx b/components/swap/SwapReviewRouteInfo.tsx index f7933ea1..5510a32c 100644 --- a/components/swap/SwapReviewRouteInfo.tsx +++ b/components/swap/SwapReviewRouteInfo.tsx @@ -38,6 +38,7 @@ import useJupiterSwapData from './useJupiterSwapData' // import { Transaction } from '@solana/web3.js' import { JUPITER_V6_QUOTE_API_MAINNET, + MANGO_ROUTER_API_URL, SOUND_SETTINGS_KEY, } from 'utils/constants' import useLocalStorageState from 'hooks/useLocalStorageState' @@ -216,23 +217,29 @@ export const fetchJupiterTransaction = async ( slippage: number, inputMint: PublicKey, outputMint: PublicKey, + origin?: 'mango' | 'jupiter' | 'raydium', ): Promise<[TransactionInstruction[], AddressLookupTableAccount[]]> => { // docs https://station.jup.ag/api-v6/post-swap const transactions = await ( - await fetch(`${JUPITER_V6_QUOTE_API_MAINNET}/swap`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', + await fetch( + `${ + origin === 'mango' ? MANGO_ROUTER_API_URL : JUPITER_V6_QUOTE_API_MAINNET + }/swap`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + // response from /quote api + quoteResponse: selectedRoute, + // user public key to be used for the swap + userPublicKey, + slippageBps: Math.ceil(slippage * 100), + wrapAndUnwrapSol: false, + }), }, - body: JSON.stringify({ - // response from /quote api - quoteResponse: selectedRoute, - // user public key to be used for the swap - userPublicKey, - slippageBps: Math.ceil(slippage * 100), - wrapAndUnwrapSol: false, - }), - }) + ) ).json() const { swapTransaction } = transactions @@ -451,6 +458,7 @@ const SwapReviewRouteInfo = ({ slippage, inputBank.mint, outputBank.mint, + selectedRoute.origin, ) try { diff --git a/components/swap/useQuoteRoutes.ts b/components/swap/useQuoteRoutes.ts index ffd3581b..1c9b8f4b 100644 --- a/components/swap/useQuoteRoutes.ts +++ b/components/swap/useQuoteRoutes.ts @@ -110,6 +110,7 @@ const fetchJupiterRoute = async ( slippage, new PublicKey(inputMint), new PublicKey(outputMint), + 'jupiter', ) if ( @@ -236,9 +237,10 @@ const fetchMangoRoute = async ( throw 'No route found' } const res = await response.json() + if (res.outAmount) { resolve({ - bestRoute: res, + bestRoute: { ...res, origin: 'mango' }, }) } else { reject('No route found') @@ -378,7 +380,6 @@ export async function handleGetRoutes( wallet, sendAnalytics, ) - routes.push(jupiterDirectRoute) } diff --git a/components/trade/SpotMarketOrderSwapForm.tsx b/components/trade/SpotMarketOrderSwapForm.tsx index 2ea8b8ea..78a2ea70 100644 --- a/components/trade/SpotMarketOrderSwapForm.tsx +++ b/components/trade/SpotMarketOrderSwapForm.tsx @@ -278,6 +278,7 @@ export default function SpotMarketOrderSwapForm() { slippage, inputBank.mint, outputBank.mint, + selectedRoute.origin, ) try { diff --git a/hooks/useAnalytics.ts b/hooks/useAnalytics.ts index 51e0b2e8..ba42beb0 100644 --- a/hooks/useAnalytics.ts +++ b/hooks/useAnalytics.ts @@ -2,21 +2,34 @@ import useMangoAccount from './useMangoAccount' import { useWallet } from '@solana/wallet-adapter-react' import { WHITE_LIST_API } from 'utils/constants' import useMangoGroup from './useMangoGroup' -import { PublicKey } from '@metaplex-foundation/js' -import { useCallback } from 'react' +import { useCallback, useMemo } from 'react' export default function useAnalytics() { const { group } = useMangoGroup() const { mangoAccountAddress, mangoAccount } = useMangoAccount() const { publicKey } = useWallet() - const analyticsTokenBank = group?.getFirstBankByMint( - new PublicKey('EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm'), - ) - const val = - mangoAccount && analyticsTokenBank - ? mangoAccount.getTokenBalanceUi(analyticsTokenBank) * - analyticsTokenBank.uiPrice - : 0 + // eslint-disable-next-line react-hooks/exhaustive-deps + const ignoredMints = [ + 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So', + 'So11111111111111111111111111111111111111112', + 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn', + 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1', + '7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn', + '7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj', + ] + const banks = useMemo(() => { + return group && mangoAccount + ? [...group.banksMapByMint.values()].filter( + (x) => + x.length && + x[0] && + x[0].collateralFeePerDay > 0 && + !ignoredMints.includes(x[0].mint.toBase58()) && + mangoAccount.getTokenBalanceUi(x[0]) * x[0].uiPrice > 10000, + ) + : [] + }, [group, ignoredMints, mangoAccount]) + const sendAnalytics = useCallback( async (data: object, tag: string) => { if ( @@ -24,7 +37,7 @@ export default function useAnalytics() { tag && data && mangoAccountAddress && - val >= 10000 + banks.length ) { const enchantedData = JSON.stringify({ mangoAccountAddress: mangoAccountAddress, @@ -45,7 +58,7 @@ export default function useAnalytics() { }) } }, - [val, mangoAccountAddress, publicKey], + [banks, mangoAccountAddress, publicKey], ) return { diff --git a/types/jupiter.ts b/types/jupiter.ts index 78952ac8..8533eaee 100644 --- a/types/jupiter.ts +++ b/types/jupiter.ts @@ -124,6 +124,7 @@ export interface JupiterV6RouteInfo { timeTaken?: number error?: string instructions?: TransactionInstruction[] + origin?: 'jupiter' | 'mango' | 'raydium' } export interface JupiterV6RoutePlan { diff --git a/utils/swap/raydium.ts b/utils/swap/raydium.ts index fc340be9..06f7671a 100644 --- a/utils/swap/raydium.ts +++ b/utils/swap/raydium.ts @@ -269,7 +269,6 @@ export const getSwapTransaction = async ( slippage, directionIn, ) - console.log(bestRoute, '@@@') const tokenInAta = getAssociatedTokenAddressSync( new PublicKey(directionIn ? bestRoute.outputMint : bestRoute.inputMint),