diff --git a/packages/swapper/src/swappers/CetusSwapper/endpoints.ts b/packages/swapper/src/swappers/CetusSwapper/endpoints.ts index 286f249aeb0..74abaa62c16 100644 --- a/packages/swapper/src/swappers/CetusSwapper/endpoints.ts +++ b/packages/swapper/src/swappers/CetusSwapper/endpoints.ts @@ -1,3 +1,4 @@ +import { getProvidersExcluding } from '@cetusprotocol/aggregator-sdk' import { Transaction } from '@cetusprotocol/aggregator-sdk/node_modules/@mysten/sui/transactions' import { TxStatus } from '@shapeshiftoss/unchained-client' import { bnOrZero } from '@shapeshiftoss/utils' @@ -19,6 +20,7 @@ import { SwapperName } from '../../types' import { checkSuiSwapStatus, getExecutableTradeStep, isExecutableTradeQuote } from '../../utils' import { getTradeQuote } from './swapperApi/getTradeQuote' import { getTradeRate } from './swapperApi/getTradeRate' +import { PYTH_DEPENDENT_PROVIDERS } from './utils/constants' import { findBestRoute, getAggregatorClient, getCoinType, getSuiClient } from './utils/helpers' export const cetusApi: SwapperApi = { @@ -58,11 +60,15 @@ export const cetusApi: SwapperApi = { const sellCoinType = getCoinType(sellAsset) const buyCoinType = getCoinType(buyAsset) + // Exclude Pyth-dependent providers to avoid oracle failures + const providersWithoutPyth = getProvidersExcluding(PYTH_DEPENDENT_PROVIDERS) + const routerData = await findBestRoute( client, sellCoinType, buyCoinType, sellAmountIncludingProtocolFeesCryptoBaseUnit, + providersWithoutPyth, ) if (!routerData) { diff --git a/packages/swapper/src/swappers/CetusSwapper/swapperApi/getCetusTradeData.ts b/packages/swapper/src/swappers/CetusSwapper/swapperApi/getCetusTradeData.ts index 951dc8474ae..d2811dffe84 100644 --- a/packages/swapper/src/swappers/CetusSwapper/swapperApi/getCetusTradeData.ts +++ b/packages/swapper/src/swappers/CetusSwapper/swapperApi/getCetusTradeData.ts @@ -1,4 +1,5 @@ import type { RouterDataV3 } from '@cetusprotocol/aggregator-sdk' +import { getProvidersExcluding } from '@cetusprotocol/aggregator-sdk' import type { AssetId } from '@shapeshiftoss/caip' import { suiAssetId } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' @@ -8,7 +9,7 @@ import { Err, Ok } from '@sniptt/monads' import type { ProtocolFee, SwapErrorRight, SwapperDeps } from '../../../types' import { TradeQuoteError } from '../../../types' import { getInputOutputRate, makeSwapErrorRight } from '../../../utils' -import { isSupportedChainId } from '../utils/constants' +import { isSupportedChainId, PYTH_DEPENDENT_PROVIDERS } from '../utils/constants' import { findBestRoute, getAggregatorClient, getCoinType } from '../utils/helpers' type CetusTradeDataInput = { @@ -78,11 +79,15 @@ export const getCetusTradeData = async ( const sellCoinType = getCoinType(sellAsset) const buyCoinType = getCoinType(buyAsset) + // Exclude Pyth-dependent providers to avoid oracle failures + const providersWithoutPyth = getProvidersExcluding(PYTH_DEPENDENT_PROVIDERS) + const routerData = await findBestRoute( client, sellCoinType, buyCoinType, sellAmountIncludingProtocolFeesCryptoBaseUnit, + providersWithoutPyth, ) if (!routerData) { diff --git a/packages/swapper/src/swappers/CetusSwapper/utils/constants.ts b/packages/swapper/src/swappers/CetusSwapper/utils/constants.ts index 3dd00cc023d..e51404bf228 100644 --- a/packages/swapper/src/swappers/CetusSwapper/utils/constants.ts +++ b/packages/swapper/src/swappers/CetusSwapper/utils/constants.ts @@ -8,3 +8,5 @@ export const isSupportedChainId = ( ): chainId is (typeof SUPPORTED_CETUS_CHAIN_IDS)[number] => { return SUPPORTED_CETUS_CHAIN_IDS.includes(chainId) } + +export const PYTH_DEPENDENT_PROVIDERS = ['HAEDALPMM', 'HAEDALHMMV2', 'METASTABLE'] diff --git a/packages/swapper/src/swappers/CetusSwapper/utils/helpers.ts b/packages/swapper/src/swappers/CetusSwapper/utils/helpers.ts index a3156b4f835..48d521b36cd 100644 --- a/packages/swapper/src/swappers/CetusSwapper/utils/helpers.ts +++ b/packages/swapper/src/swappers/CetusSwapper/utils/helpers.ts @@ -46,12 +46,14 @@ export const findBestRoute = async ( sellCoinType: string, buyCoinType: string, sellAmountCryptoBaseUnit: string, + providers?: string[], ): Promise => { const routerData = await client.findRouters({ from: sellCoinType, target: buyCoinType, amount: sellAmountCryptoBaseUnit, byAmountIn: true, + ...(providers && { providers }), }) if (!routerData) {