2022-08-03 14:46:37 -07:00
|
|
|
import { toUiDecimals } from '@blockworks-foundation/mango-v4'
|
|
|
|
import { Jupiter, RouteInfo } from '@jup-ag/core'
|
|
|
|
import { useEffect, useState } from 'react'
|
2022-08-09 15:44:01 -07:00
|
|
|
import JSBI from 'jsbi'
|
2022-08-15 21:19:09 -07:00
|
|
|
import Decimal from 'decimal.js'
|
2022-08-09 15:44:01 -07:00
|
|
|
|
2022-09-12 08:53:57 -07:00
|
|
|
import mangoStore, { CLUSTER } from '@store/mangoStore'
|
2022-08-03 14:46:37 -07:00
|
|
|
import { Token } from '../../types/jupiter'
|
2022-08-18 13:50:34 -07:00
|
|
|
import { PublicKey } from '@solana/web3.js'
|
2022-08-03 14:46:37 -07:00
|
|
|
|
|
|
|
type useJupiterPropTypes = {
|
2022-08-18 13:50:34 -07:00
|
|
|
inputTokenInfo: Token | undefined
|
|
|
|
outputTokenInfo: Token | undefined
|
2022-08-17 13:06:25 -07:00
|
|
|
inputAmount: string
|
2022-08-03 14:46:37 -07:00
|
|
|
slippage: number
|
|
|
|
}
|
|
|
|
|
|
|
|
type RouteParams = {
|
|
|
|
routes: RouteInfo[]
|
2022-09-02 16:52:07 -07:00
|
|
|
amountOut: Decimal
|
2022-08-03 14:46:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const defaultComputedInfo = {
|
|
|
|
routes: [],
|
2022-09-02 16:52:07 -07:00
|
|
|
amountOut: new Decimal(0),
|
2022-08-03 14:46:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const useJupiter = ({
|
2022-08-18 13:50:34 -07:00
|
|
|
inputTokenInfo,
|
|
|
|
outputTokenInfo,
|
2022-08-03 14:46:37 -07:00
|
|
|
inputAmount,
|
|
|
|
slippage,
|
|
|
|
}: useJupiterPropTypes) => {
|
|
|
|
const [jupiter, setJupiter] = useState<Jupiter>()
|
|
|
|
const [computedInfo, setComputedInfo] =
|
|
|
|
useState<RouteParams>(defaultComputedInfo)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const connection = mangoStore.getState().connection
|
|
|
|
const loadJupiter = async () => {
|
|
|
|
const jupiter = await Jupiter.load({
|
|
|
|
connection,
|
|
|
|
cluster: CLUSTER,
|
2022-08-09 15:44:01 -07:00
|
|
|
wrapUnwrapSOL: false,
|
2022-08-03 14:46:37 -07:00
|
|
|
// platformFeeAndAccounts: NO_PLATFORM_FEE,
|
2022-08-09 15:44:01 -07:00
|
|
|
routeCacheDuration: 30_000, // Will not refetch data on computeRoutes for up to 10 seconds
|
2022-08-03 14:46:37 -07:00
|
|
|
})
|
|
|
|
setJupiter(jupiter)
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
loadJupiter()
|
|
|
|
} catch (e) {
|
|
|
|
console.warn(e)
|
|
|
|
}
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const group = mangoStore.getState().group
|
|
|
|
if (!group) return
|
|
|
|
const tokens = mangoStore.getState().jupiterTokens
|
|
|
|
|
|
|
|
const loadRoutes = async () => {
|
2022-08-18 13:50:34 -07:00
|
|
|
if (!outputTokenInfo || !inputTokenInfo) return
|
2022-08-03 14:46:37 -07:00
|
|
|
if (!inputAmount) {
|
|
|
|
setComputedInfo(defaultComputedInfo)
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
const computedRoutes = await jupiter
|
|
|
|
?.computeRoutes({
|
2022-08-18 13:50:34 -07:00
|
|
|
inputMint: new PublicKey(inputTokenInfo.address), // Mint address of the input token
|
|
|
|
outputMint: new PublicKey(outputTokenInfo.address), // Mint address of the output token
|
2022-08-09 15:44:01 -07:00
|
|
|
amount: JSBI.BigInt(
|
2022-08-18 13:50:34 -07:00
|
|
|
new Decimal(inputAmount).mul(10 ** inputTokenInfo.decimals)
|
2022-08-09 15:44:01 -07:00
|
|
|
),
|
2022-08-03 14:46:37 -07:00
|
|
|
slippage, // The slippage in % terms
|
|
|
|
filterTopNResult: 10,
|
|
|
|
onlyDirectRoutes: true,
|
|
|
|
})
|
|
|
|
.catch((e) => {
|
|
|
|
console.error('Error computing Jupiter routes:', e)
|
|
|
|
return
|
|
|
|
})
|
2022-08-18 13:50:34 -07:00
|
|
|
|
2022-08-03 14:46:37 -07:00
|
|
|
const routesInfosWithoutRaydium = computedRoutes?.routesInfos.filter(
|
|
|
|
(r) => {
|
2022-08-10 13:34:30 -07:00
|
|
|
for (const mkt of r.marketInfos) {
|
2022-08-11 17:52:23 -07:00
|
|
|
if (mkt.amm.label === 'Raydium' || mkt.amm.label === 'Serum')
|
|
|
|
return false
|
2022-08-03 14:46:37 -07:00
|
|
|
}
|
2022-08-10 13:34:30 -07:00
|
|
|
|
2022-08-03 14:46:37 -07:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
)
|
|
|
|
if (routesInfosWithoutRaydium?.length) {
|
|
|
|
const bestRoute = routesInfosWithoutRaydium[0]
|
|
|
|
|
|
|
|
setComputedInfo({
|
|
|
|
routes: routesInfosWithoutRaydium,
|
2022-09-02 16:52:07 -07:00
|
|
|
amountOut: new Decimal(bestRoute.outAmount.toString()).div(
|
|
|
|
10 ** outputTokenInfo.decimals!
|
2022-08-09 15:44:01 -07:00
|
|
|
),
|
2022-08-03 14:46:37 -07:00
|
|
|
})
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
console.warn(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
loadRoutes()
|
2022-08-18 13:50:34 -07:00
|
|
|
}, [inputTokenInfo, outputTokenInfo, jupiter, slippage, inputAmount])
|
2022-08-03 14:46:37 -07:00
|
|
|
|
|
|
|
return { jupiter, ...computedInfo }
|
|
|
|
}
|
|
|
|
|
|
|
|
export default useJupiter
|