diff --git a/src/configs/default.settings.json b/src/configs/default.settings.json new file mode 100644 index 00000000..a38cca0b --- /dev/null +++ b/src/configs/default.settings.json @@ -0,0 +1,4 @@ +{ + "maxHops": 1, + "slippageTolerance": 1 +} \ No newline at end of file diff --git a/src/contexts/index.ts b/src/contexts/index.ts index df7b079b..e48d123b 100644 --- a/src/contexts/index.ts +++ b/src/contexts/index.ts @@ -1,5 +1,6 @@ import React from 'react'; import { PlatformType, Protocol } from 'state/routing/types'; +import defaultSettings from 'configs/default.settings.json'; type ConnectWalletModalType = { isConnectWalletModalOpen: boolean; @@ -68,13 +69,13 @@ export const AppContext = React.createContext({ setSnackbarType: () => {}, }, Settings: { - maxHops: 2, + maxHops: defaultSettings.maxHops, setMaxHops: () => {}, protocolsStatus: [], setProtocolsStatus: () => {}, isAggregatorState: false, setAggregatorStatus: () => {}, aggregatorAddress: '', - setAggregatorAddress: () => {} + setAggregatorAddress: () => {}, }, }); diff --git a/src/functions/generateRoute.ts b/src/functions/generateRoute.ts index eddd5d77..4e644a8c 100644 --- a/src/functions/generateRoute.ts +++ b/src/functions/generateRoute.ts @@ -22,6 +22,8 @@ import { getExpectedAmount } from './getExpectedAmount'; import { Networks } from '@stellar/stellar-sdk'; import { getSwapRoute, getSwapSplitRoute } from 'services/soroswapApi'; import { passphraseToBackendNetworkName } from 'services/pairs'; +import { DEFAULT_SLIPPAGE_INPUT_VALUE } from 'components/Settings/MaxSlippageSettings'; +import { useUserSlippageToleranceWithDefault } from 'state/user/hooks'; export interface GenerateRouteProps { amountAsset: AmountAsset; @@ -36,6 +38,8 @@ const shouldUseDirectPath = process.env.NEXT_PUBLIC_DIRECT_PATH_ENABLED === 'tru export const useSoroswapApi = () => { const sorobanContext = useSorobanReact(); const { Settings } = useContext(AppContext); + const allowedSlippage = useUserSlippageToleranceWithDefault(DEFAULT_SLIPPAGE_INPUT_VALUE); + const { factory } = useFactory(sorobanContext); @@ -176,8 +180,9 @@ export const useSoroswapApi = () => { tradeType: tradeType, protocols: getProtocols, parts: 10, - slippageTolerance: '0.01', + slippageTolerance: allowedSlippage.toString(), assetList: ['SOROSWAP'], + maxHops: maxHops, }; try { @@ -194,8 +199,9 @@ export const useSoroswapApi = () => { assetOut: tradeType === TradeType.EXACT_INPUT ? quoteAsset.contract : amountAsset.currency.contract, amount: amount, tradeType: tradeType, - slippageTolerance: '0.01', + slippageTolerance: allowedSlippage.toString(), assetList: ['SOROSWAP'], + maxHops: maxHops, }; try { diff --git a/src/helpers/aggregator/index.ts b/src/helpers/aggregator/index.ts index dccd3785..e9a800b3 100644 --- a/src/helpers/aggregator/index.ts +++ b/src/helpers/aggregator/index.ts @@ -63,8 +63,23 @@ export function poolHashesToScVal(poolHashes?: string[]): xdr.ScVal { } export const dexDistributionParser = (dexDistributionRaw: DexDistribution[]): xdr.ScVal => { + + console.log("🚀 ~ dexDistributionRaw:", dexDistributionRaw) const dexDistributionScVal = dexDistributionRaw.map((distribution) => { + + let protocol_id_num; + if (distribution.protocol_id === 'soroswap') { + protocol_id_num = 0; + } + else if (distribution.protocol_id === 'phoenix') { + protocol_id_num = 1; + } else if (distribution.protocol_id === 'aqua') { + protocol_id_num = 2; + } else { + throw new Error(`Unknown protocol_id: ${distribution.protocol_id}`); + } + return xdr.ScVal.scvMap([ new xdr.ScMapEntry({ key: xdr.ScVal.scvSymbol('bytes'), @@ -80,7 +95,7 @@ export const dexDistributionParser = (dexDistributionRaw: DexDistribution[]): xd }), new xdr.ScMapEntry({ key: xdr.ScVal.scvSymbol('protocol_id'), - val: xdr.ScVal.scvString(distribution.protocol_id), + val: nativeToScVal(protocol_id_num, {type: 'u32'}), }), ]); }); diff --git a/src/hooks/useBestTrade.ts b/src/hooks/useBestTrade.ts index 19ffa9e4..42b7e8dd 100644 --- a/src/hooks/useBestTrade.ts +++ b/src/hooks/useBestTrade.ts @@ -11,7 +11,7 @@ import { ExactOutBuildTradeReturn, ExactOutSplitBuildTradeReturn, InterfaceTrade, - QuoteState, + QuoteState, TradeState, TradeType, } from 'state/routing/types'; @@ -41,6 +41,7 @@ export function useBestTrade( } { const { generateRoute, resetRouterSdkCache, maxHops } = useSoroswapApi(); const { protocolsStatus } = useContext(AppContext).Settings; + /** * Custom hook that fetches the best trade based on the specified amount and trade type. * diff --git a/src/state/routing/types.ts b/src/state/routing/types.ts index 8c45a9f2..ed308777 100644 --- a/src/state/routing/types.ts +++ b/src/state/routing/types.ts @@ -48,6 +48,7 @@ export type SwapRouteRequest = { tradeType: string; slippageTolerance: string; assetList?: string[]; + maxHops?: number; }; export type SwapRouteSplitRequest = { @@ -59,6 +60,7 @@ export type SwapRouteSplitRequest = { parts: number; slippageTolerance: string; assetList?: string[]; + maxHops?: number; }; interface CommonBuildTradeReturnFields {