{"version":3,"file":"swap-403979e4.js","sources":["../../src/components/cards/PairPriceGraph/PairPriceGraph.vue","../../src/composables/swap/useSwapAssets.ts","../../src/components/_global/icons/ArrowDownIcon.vue","../../src/components/cards/SwapCard/SwapRoute.vue","../../src/lib/utils/balancer/wrapper.ts","../../src/components/modals/SwapPreviewModal.vue","../../src/composables/swap/useCowswap.ts","../../src/lib/utils/balancer/helpers/sor/sorManager.ts","../../src/services/contracts/lido-relayer.service.ts","../../src/services/swap/swap.service.ts","../../src/composables/useSwapper.ts","../../src/composables/swap/useSor.ts","../../src/composables/swap/useJoinExit.ts","../../src/composables/swap/useSwapping.ts","../../src/composables/swap/useValidation.ts","../../src/components/cards/SwapCard/SwapPairToggle.vue","../../src/components/cards/SwapCard/SwapPair.vue","../../src/components/cards/SwapCard/SwapCard.vue","../../src/components/links/BridgeLink.vue","../../src/pages/swap.vue"],"sourcesContent":["\n\n\n\n\n","import { networkId } from '@/composables/useNetwork';\nimport { lsGet, lsSet } from '@/lib/utils';\nimport { configService } from '@/services/config/config.service';\n\nconst inputAsset = ref(\n lsGet(\n `inputAsset.${networkId.value}`,\n configService.network.tokens.InitialSwapTokens.input\n )\n);\nconst outputAsset = ref(\n lsGet(\n `outputAsset.${networkId.value}`,\n configService.network.tokens.InitialSwapTokens.output\n )\n);\n\nfunction setInputAsset(asset: string): void {\n inputAsset.value = asset;\n lsSet(`inputAsset.${networkId.value}`, asset);\n}\n\nfunction setOutputAsset(asset: string): void {\n outputAsset.value = asset;\n lsSet(`outputAsset.${networkId.value}`, asset);\n}\n\nexport function useSwapAssets() {\n return {\n inputAsset,\n outputAsset,\n setInputAsset,\n setOutputAsset,\n };\n}\n","\n","\n\n\n\n\n\n\n","import { TransactionResponse } from '@ethersproject/providers';\nimport { BigNumber } from 'ethers';\n\nimport configs from '@/lib/config';\nimport { configService } from '@/services/config/config.service';\n\nimport { convertStEthWrap } from './lido';\nimport { TransactionBuilder } from '@/services/web3/transactions/transaction.builder';\nimport { WalletProvider } from '@/dependencies/wallets/Web3Provider';\n\nexport enum WrapType {\n NonWrap = 0,\n Wrap,\n Unwrap,\n}\n\nexport const isNativeAssetWrap = (\n tokenIn: string,\n tokenOut: string\n): boolean => {\n console.log(tokenIn, tokenOut);\n const nativeAddress = configService.network.tokens.Addresses.nativeAsset;\n const wNativeAddress = configService.network.tokens.Addresses.wNativeAsset;\n return tokenIn === nativeAddress && tokenOut === wNativeAddress;\n};\n\nexport const getWrapAction = (tokenIn: string, tokenOut: string): WrapType => {\n const nativeAddress = configService.network.tokens.Addresses.nativeAsset;\n const wNativeAddress = configService.network.tokens.Addresses.wNativeAsset;\n const { stETH, wstETH } = configService.network.tokens.Addresses;\n\n if (tokenIn === nativeAddress && tokenOut === wNativeAddress)\n return WrapType.Wrap;\n if (tokenIn === stETH && tokenOut === wstETH) return WrapType.Wrap;\n\n if (tokenOut === nativeAddress && tokenIn === wNativeAddress)\n return WrapType.Unwrap;\n if (tokenOut === stETH && tokenIn === wstETH) return WrapType.Unwrap;\n\n return WrapType.NonWrap;\n};\n\nexport const getWrapOutput = async (\n wrapper: string,\n wrapType: WrapType,\n wrapAmount: BigNumber\n): Promise => {\n if (wrapType === WrapType.NonWrap) throw new Error('Invalid wrap type');\n const wNativeAddress = configService.network.tokens.Addresses.wNativeAsset;\n const { wstETH } = configService.network.tokens.Addresses;\n\n if (wrapper === wNativeAddress) return BigNumber.from(wrapAmount);\n if (wrapper === wstETH) {\n return convertStEthWrap({\n amount: wrapAmount,\n isWrap: wrapType === WrapType.Wrap,\n });\n }\n throw new Error('Unknown wrapper');\n};\n\nexport async function wrap(\n network: string,\n web3: WalletProvider,\n wrapper: string,\n amount: BigNumber\n): Promise {\n try {\n if (wrapper === configs[network].tokens.Addresses.wNativeAsset) {\n return wrapNative(network, web3, amount);\n } else if (wrapper === configs[network].tokens.Addresses.wstETH) {\n return wrapLido(network, web3, amount);\n }\n throw new Error('Unrecognised wrapper contract');\n } catch (e) {\n console.log('[Wrapper] Wrap error:', e);\n return Promise.reject(e);\n }\n}\n\nexport async function unwrap(\n network: string,\n web3: WalletProvider,\n wrapper: string,\n amount: BigNumber\n): Promise {\n try {\n if (wrapper === configs[network].tokens.Addresses.wNativeAsset) {\n return unwrapNative(network, web3, amount);\n } else if (wrapper === configs[network].tokens.Addresses.wstETH) {\n return unwrapLido(network, web3, amount);\n }\n throw new Error('Unrecognised wrapper contract');\n } catch (e) {\n console.log('[Wrapper] Unwrap error:', e);\n return Promise.reject(e);\n }\n}\n\nconst wrapNative = async (\n network: string,\n web3: WalletProvider,\n amount: BigNumber\n): Promise => {\n const txBuilder = new TransactionBuilder(web3.getSigner());\n return await txBuilder.contract.sendTransaction({\n contractAddress: configs[network].tokens.Addresses.wNativeAsset,\n abi: ['function deposit() payable'],\n action: 'deposit',\n options: { value: amount },\n });\n};\n\nconst unwrapNative = async (\n network: string,\n web3: WalletProvider,\n amount: BigNumber\n): Promise => {\n const txBuilder = new TransactionBuilder(web3.getSigner());\n return await txBuilder.contract.sendTransaction({\n contractAddress: configs[network].tokens.Addresses.wNativeAsset,\n abi: ['function withdraw(uint256 wad)'],\n action: 'withdraw',\n params: [amount],\n });\n};\n\nconst wrapLido = async (\n network: string,\n web3: WalletProvider,\n amount: BigNumber\n): Promise => {\n const txBuilder = new TransactionBuilder(web3.getSigner());\n return await txBuilder.contract.sendTransaction({\n contractAddress: configs[network].tokens.Addresses.wstETH,\n abi: ['function wrap(uint256 _stETHAmount) returns (uint256)'],\n action: 'wrap',\n params: [amount],\n });\n};\n\nconst unwrapLido = async (\n network: string,\n web3: WalletProvider,\n amount: BigNumber\n): Promise => {\n const txBuilder = new TransactionBuilder(web3.getSigner());\n return await txBuilder.contract.sendTransaction({\n contractAddress: configs[network].tokens.Addresses.wstETH,\n abi: ['function unwrap(uint256 _wstETHAmount) returns (uint256)'],\n action: 'unwrap',\n params: [amount],\n });\n};\n","\n\n\n\n\n","import { BigNumber, parseFixed } from '@ethersproject/bignumber';\nimport { WeiPerEther as ONE } from '@ethersproject/constants';\nimport { AddressZero } from '@ethersproject/constants';\nimport { formatUnits } from '@ethersproject/units';\nimport { OrderBalance, OrderKind } from '@cowprotocol/contracts';\nimport OldBigNumber from 'bignumber.js';\n\nimport { bnum } from '@/lib/utils';\nimport { ApiErrorCodes } from '@/services/cowswap/errors/OperatorError';\nimport { cowswapProtocolService } from '@/services/cowswap/cowswapProtocol.service';\nimport { signOrder, UnsignedOrder } from '@/services/cowswap/signing';\nimport { OrderMetaData, PriceQuoteParams } from '@/services/cowswap/types';\nimport { calculateValidTo } from '@/services/cowswap/utils';\nimport useWeb3 from '@/services/web3/useWeb3';\nimport { Token } from '@/types';\nimport { TokenInfo } from '@/types/TokenList';\n\nimport useNumbers, { FNumFormats } from '../useNumbers';\nimport { useTokens } from '@/providers/tokens.provider';\nimport useTransactions from '../useTransactions';\nimport { SwapQuote } from './types';\nimport { Goals, trackGoal } from '../useFathom';\nimport { useI18n } from 'vue-i18n';\nimport { useApp } from '@/composables/useApp';\nimport { captureBalancerException, isUserError } from '@/lib/utils/errors';\n\nconst HIGH_FEE_THRESHOLD = parseFixed('0.2', 18);\nconst APP_DATA =\n import.meta.env.VITE_GNOSIS_APP_DATA ??\n '0xE9F29AE547955463ED535162AEFEE525D8D309571A2B18BC26086C8C35D781EB';\n\ntype State = {\n warnings: {\n highFees: boolean;\n };\n validationError: null | string;\n submissionError: null | string;\n};\n\nconst state = reactive({\n warnings: {\n highFees: false,\n },\n validationError: null,\n submissionError: null,\n});\n\nexport type CowswapTransactionDetails = {\n tokenIn: Token;\n tokenOut: Token;\n tokenInAddress: string;\n tokenOutAddress: string;\n tokenInAmount: string;\n tokenOutAmount: string;\n exactIn: boolean;\n quote: SwapQuote;\n slippageBufferRate: number;\n order: {\n validTo: OrderMetaData['validTo'];\n partiallyFillable: OrderMetaData['partiallyFillable'];\n };\n};\n\ntype Props = {\n exactIn: Ref;\n tokenInAddressInput: Ref;\n tokenInAmountInput: Ref;\n tokenOutAddressInput: Ref;\n tokenOutAmountInput: Ref;\n tokenInAmountScaled: ComputedRef;\n tokenOutAmountScaled: ComputedRef;\n tokenIn: ComputedRef;\n tokenOut: ComputedRef;\n slippageBufferRate: ComputedRef;\n};\n\nexport default function useCowswap({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n tokenIn,\n tokenOut,\n slippageBufferRate,\n}: Props) {\n // COMPOSABLES\n const { transactionDeadline } = useApp();\n const { account, getSigner } = useWeb3();\n const { addTransaction } = useTransactions();\n const { fNum } = useNumbers();\n const { balanceFor } = useTokens();\n const { t } = useI18n();\n\n // DATA\n const updatingQuotes = ref(false);\n const confirming = ref(false);\n const feeQuote = ref(null);\n const latestQuoteIdx = ref(0);\n\n // COMPUTED\n const hasValidationError = computed(() => state.validationError != null);\n\n // METHODS\n function getFeeAmount() {\n const feeAmountInToken = feeQuote.value ?? '0';\n const feeAmountOutToken = tokenInAmountScaled.value.isZero()\n ? '0'\n : tokenOutAmountScaled.value\n .mul(feeAmountInToken)\n .div(tokenInAmountScaled.value)\n .toString();\n\n return {\n feeAmountInToken,\n feeAmountOutToken,\n };\n }\n\n function getQuote(): SwapQuote {\n const { feeAmountInToken, feeAmountOutToken } = getFeeAmount();\n\n const maximumInAmount = tokenInAmountScaled.value\n .add(feeAmountInToken)\n .mul(parseFixed(String(1 + slippageBufferRate.value), 18))\n .div(ONE);\n\n const minimumOutAmount = tokenOutAmountScaled.value\n .sub(feeAmountOutToken)\n .mul(ONE)\n .div(parseFixed(String(1 + slippageBufferRate.value), 18));\n\n return {\n feeAmountInToken,\n feeAmountOutToken,\n maximumInAmount,\n minimumOutAmount,\n };\n }\n\n async function swap(successCallback?: () => void) {\n let quote;\n try {\n confirming.value = true;\n state.submissionError = null;\n\n quote = getQuote();\n\n const unsignedOrder: UnsignedOrder = {\n sellToken: tokenInAddressInput.value,\n buyToken: tokenOutAddressInput.value,\n sellAmount: (exactIn.value\n ? tokenInAmountScaled.value\n : quote.maximumInAmount\n )\n .sub(quote.feeAmountInToken)\n .toString(),\n buyAmount: exactIn.value\n ? quote.minimumOutAmount.toString()\n : tokenOutAmountScaled.value.toString(),\n validTo: calculateValidTo(transactionDeadline.value),\n appData: APP_DATA,\n feeAmount: quote.feeAmountInToken,\n kind: exactIn.value ? OrderKind.SELL : OrderKind.BUY,\n receiver: account.value,\n partiallyFillable: false, // Always fill or kill,\n sellTokenBalance: OrderBalance.EXTERNAL,\n };\n\n const { signature, signingScheme } = await signOrder(\n unsignedOrder,\n getSigner()\n );\n\n const orderId = await cowswapProtocolService.sendSignedOrder({\n order: {\n ...unsignedOrder,\n signature,\n receiver: account.value,\n signingScheme,\n },\n owner: account.value,\n });\n\n const sellAmount = exactIn.value\n ? tokenInAmountInput.value\n : formatUnits(quote.maximumInAmount, tokenIn.value.decimals).toString();\n\n const buyAmount = exactIn.value\n ? formatUnits(\n quote.minimumOutAmount,\n tokenOut.value.decimals\n ).toString()\n : tokenOutAmountInput.value;\n\n const tokenInAmountEst = exactIn.value ? '' : '~';\n const tokenOutAmountEst = exactIn.value ? '~' : '';\n\n const summary = `${tokenInAmountEst}${fNum(\n sellAmount,\n FNumFormats.token\n )} ${tokenIn.value.symbol} -> ${tokenOutAmountEst}${fNum(\n buyAmount,\n FNumFormats.token\n )} ${tokenOut.value.symbol}`;\n\n const { validTo, partiallyFillable } = unsignedOrder;\n\n addTransaction({\n id: orderId,\n type: 'order',\n action: 'swap',\n summary,\n details: {\n tokenIn: tokenIn.value,\n tokenOut: tokenOut.value,\n tokenInAddress: tokenInAddressInput.value,\n tokenOutAddress: tokenOutAddressInput.value,\n tokenInAmount: tokenInAmountInput.value,\n tokenOutAmount: tokenOutAmountInput.value,\n exactIn: exactIn.value,\n quote,\n slippageBufferRate: slippageBufferRate.value,\n order: {\n validTo,\n partiallyFillable,\n },\n },\n });\n\n if (successCallback != null) {\n successCallback();\n }\n confirming.value = false;\n trackGoal(Goals.CowswapSwap);\n } catch (error) {\n const msg = t('swapException', ['Cowswap']);\n\n captureBalancerException({\n error,\n action: 'swap',\n msgPrefix: msg,\n context: {\n level: 'fatal',\n extra: {\n sender: account.value,\n tokenIn: tokenIn.value,\n tokenOut: tokenOut.value,\n tokenInAmount: tokenInAmountInput.value,\n tokenOutAmount: tokenOutAmountInput.value,\n quote,\n },\n },\n });\n\n if (!isUserError(error)) {\n state.submissionError = msg;\n }\n\n confirming.value = false;\n throw error;\n }\n }\n\n function resetState(shouldResetFees = true) {\n state.warnings.highFees = false;\n state.validationError = null;\n state.submissionError = null;\n\n if (shouldResetFees) {\n feeQuote.value = null;\n }\n }\n\n async function handleAmountChange() {\n // Prevent quering undefined input amounts\n if (\n (exactIn.value && !tokenInAmountInput.value) ||\n (!exactIn.value && !tokenOutAmountInput.value)\n ) {\n return;\n }\n\n const amountToExchange = exactIn.value\n ? tokenInAmountScaled.value\n : tokenOutAmountScaled.value;\n\n if (amountToExchange === undefined) {\n return;\n }\n\n if (amountToExchange.isZero()) {\n exactIn.value\n ? (tokenOutAmountInput.value = '0')\n : (tokenInAmountInput.value = '0');\n return;\n }\n updatingQuotes.value = true;\n state.validationError = null;\n latestQuoteIdx.value += 1;\n const currentQuoteIdx = latestQuoteIdx.value;\n\n try {\n const priceQuoteParams: PriceQuoteParams = {\n sellToken: tokenInAddressInput.value,\n buyToken: tokenOutAddressInput.value,\n kind: exactIn.value ? OrderKind.SELL : OrderKind.BUY,\n fromDecimals: tokenIn.value.decimals,\n toDecimals: tokenOut.value.decimals,\n from: account.value || AddressZero,\n receiver: account.value || AddressZero,\n [exactIn.value ? 'sellAmountAfterFee' : 'buyAmountAfterFee']:\n amountToExchange.toString(),\n partiallyFillable: false, // Always fill or kill,\n };\n\n const priceQuote = await cowswapProtocolService.getPriceQuote(\n priceQuoteParams\n );\n\n // When user clears the input while fee is fetching we won't be able to get the quote\n if (\n (exactIn.value && !tokenInAmountInput.value) ||\n (!exactIn.value && !tokenOutAmountInput.value)\n ) {\n updatingQuotes.value = false;\n return;\n }\n\n // If there are multiple requests in flight, only use the last one\n if (priceQuote && currentQuoteIdx === latestQuoteIdx.value) {\n feeQuote.value = priceQuote.feeAmount;\n\n if (exactIn.value) {\n tokenOutAmountInput.value = bnum(\n formatUnits(priceQuote.buyAmount ?? '0', tokenOut.value.decimals)\n ).toFixed(6, OldBigNumber.ROUND_DOWN);\n\n const { feeAmountInToken } = getQuote();\n\n state.warnings.highFees = BigNumber.from(feeAmountInToken).gt(\n amountToExchange.mul(HIGH_FEE_THRESHOLD).div(ONE)\n );\n } else {\n tokenInAmountInput.value = bnum(\n formatUnits(priceQuote.sellAmount ?? '0', tokenIn.value.decimals)\n ).toFixed(6, OldBigNumber.ROUND_DOWN);\n\n const { feeAmountOutToken, maximumInAmount } = getQuote();\n\n state.warnings.highFees = BigNumber.from(feeAmountOutToken).gt(\n amountToExchange.mul(HIGH_FEE_THRESHOLD).div(ONE)\n );\n\n if (account.value) {\n const priceExceedsBalance = bnum(\n formatUnits(maximumInAmount, tokenIn.value.decimals)\n ).gt(balanceFor(tokenIn.value.address));\n\n if (priceExceedsBalance) {\n state.validationError = ApiErrorCodes.PriceExceedsBalance;\n }\n }\n }\n }\n } catch (e) {\n console.log('[CoWswap Quotes] Failed to update quotes', e);\n }\n\n updatingQuotes.value = false;\n }\n\n return {\n // methods\n swap,\n handleAmountChange,\n resetState,\n\n // computed\n ...toRefs(state),\n feeQuote,\n updatingQuotes,\n hasValidationError,\n confirming,\n getQuote,\n };\n}\n","import {\n PoolFilter,\n SOR as SORV2,\n SubgraphPoolBase,\n SwapInfo,\n SwapOptions,\n SwapTypes,\n} from '@symmetric-v3/sdk';\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { AddressZero } from '@ethersproject/constants';\nimport { Provider } from '@ethersproject/providers';\n\nimport {\n NATIVE_ASSET_ADDRESS,\n WRAPPED_NATIVE_ASSET_ADDRESS,\n} from '@/constants/tokens';\nimport { getBalancerSDK } from '@/dependencies/balancer-sdk';\nimport { captureBalancerException } from '@/lib/utils/errors';\n\nconst SWAP_COST = import.meta.env.VITE_SWAP_COST || '100000';\n\nexport interface SorReturn {\n tokenIn: string;\n tokenOut: string;\n returnDecimals: number;\n hasSwaps: boolean;\n returnAmount: BigNumber;\n marketSpNormalised: string;\n result: SwapInfo;\n}\n\ninterface FetchStatus {\n v2finishedFetch: boolean;\n v2success: boolean;\n}\n\n/*\nAims to manage liquidity using SOR.\n*/\nexport class SorManager {\n private sorV2: SORV2;\n private fetchStatus: FetchStatus = {\n v2finishedFetch: false,\n v2success: false,\n };\n private isFetching: boolean;\n maxPools: number;\n gasPrice: BigNumber;\n selectedPools: SubgraphPoolBase[] = [];\n\n constructor(provider: Provider, gasPrice: BigNumber, maxPools: number) {\n this.sorV2 = getBalancerSDK().sor;\n this.gasPrice = gasPrice;\n this.maxPools = maxPools;\n this.isFetching = false;\n }\n\n // Uses SOR V2 to retrieve the cost\n // If previously called the cached value will be used.\n async setCostOutputToken(\n tokenAddr: string,\n tokenDecimals: number,\n manualCost: string | null = null\n ): Promise {\n tokenAddr =\n tokenAddr === NATIVE_ASSET_ADDRESS\n ? WRAPPED_NATIVE_ASSET_ADDRESS\n : tokenAddr;\n\n if (manualCost) {\n await this.sorV2.swapCostCalculator.setNativeAssetPriceInToken(\n tokenAddr,\n manualCost\n );\n }\n\n const cost = await this.sorV2.getCostOfSwapInToken(\n tokenAddr,\n tokenDecimals,\n this.gasPrice,\n BigNumber.from(SWAP_COST)\n );\n\n console.log(`[SorManager] Cost for token ${tokenAddr}: ${cost.toString()}`);\n\n return cost;\n }\n\n // This fetches ALL pool with onchain info.\n async fetchPools(): Promise {\n if (this.isFetching) {\n return;\n }\n this.isFetching = true;\n\n // This will catch any error fetching Subgraph or onChain data with V2\n console.time('[SorManager] fetchPools');\n try {\n // Fetch of all pools from V2 subgraph and pull onchain data\n const v2result = await this.sorV2.fetchPools({\n first: 4,\n skip: 0,\n orderBy: 'totalLiquidity',\n orderDirection: 'desc',\n });\n console.log('v2Result: ', v2result);\n this.fetchStatus.v2finishedFetch = true;\n this.fetchStatus.v2success = v2result;\n\n if (!v2result) {\n captureBalancerException({\n error: new Error('SOR Fetch pools failed'),\n context: {\n level: 'fatal',\n },\n });\n }\n } catch (err) {\n console.log(\n `[SorManager] V2 fetchPools issue: ${(err as Error).message}`\n );\n this.fetchStatus.v2finishedFetch = true;\n this.fetchStatus.v2success = false;\n\n captureBalancerException({\n error: err,\n msgPrefix: 'SORFetchPools',\n context: { level: 'fatal' },\n });\n }\n console.log(\n `[SorManager] V2 fetchPools result: ${this.fetchStatus.v2success}`\n );\n console.timeEnd(`[SorManager] V2 fetchPools`);\n\n this.selectedPools = this.sorV2.getPools();\n this.isFetching = false;\n }\n // Format best swap result\n async getBestSwap(\n tokenIn: string,\n tokenOut: string,\n tokenInDecimals: number,\n tokenOutDecimals: number,\n swapType: SwapTypes,\n amountScaled: BigNumber\n ): Promise {\n const v2TokenIn = tokenIn === NATIVE_ASSET_ADDRESS ? AddressZero : tokenIn;\n const v2TokenOut =\n tokenOut === NATIVE_ASSET_ADDRESS ? AddressZero : tokenOut;\n\n const timestampSeconds = Math.floor(Date.now() / 1000);\n\n // The poolTypeFilter can be used to filter to different pool types. Useful for debug/testing.\n const swapOptions: SwapOptions = {\n maxPools: this.maxPools,\n gasPrice: this.gasPrice,\n swapGas: BigNumber.from(SWAP_COST),\n poolTypeFilter: PoolFilter.All,\n timestamp: timestampSeconds,\n forceRefresh: true,\n };\n\n const swapInfoV2: SwapInfo = await this.sorV2.getSwaps(\n v2TokenIn.toLowerCase(),\n v2TokenOut.toLowerCase(),\n swapType,\n amountScaled,\n swapOptions\n );\n\n // Both are scaled amounts\n console.log(\n `[SorManager] ${swapInfoV2.returnAmount.toString()}: V2 return amount`\n );\n console.log(\n `[SorManager] ${swapInfoV2.returnAmountConsideringFees.toString()}: V2 return amount with fees`\n );\n\n return {\n tokenIn,\n tokenOut,\n returnDecimals:\n swapType === SwapTypes.SwapExactIn ? tokenOutDecimals : tokenInDecimals,\n hasSwaps: swapInfoV2.swaps.length > 0,\n returnAmount: swapInfoV2.returnAmount,\n result: swapInfoV2,\n marketSpNormalised: swapInfoV2.marketSp,\n };\n }\n\n // Check if pool info fetch\n hasPoolData(): boolean {\n if (this.fetchStatus.v2finishedFetch) {\n // TO DO - This could be used to provide more info to UI?\n if (this.fetchStatus.v2success === false) {\n console.log(\n `[SorManager] Error Fetching V2 Pools - No Liquidity Sources.`\n );\n return false;\n }\n\n return true;\n } else {\n console.log(`[SorManager] Not finished fetching pools.`);\n return false;\n }\n }\n}\n","import { LidoRelayer__factory } from '@balancer-labs/typechain';\n\nimport VaultService from '@/services/contracts/vault.service';\n\nexport default class LidoRelayerService extends VaultService {\n constructor() {\n super();\n this.abi = LidoRelayer__factory.abi;\n }\n\n get address() {\n return this.config.network.addresses.lidoRelayer;\n }\n}\n\nexport const lidoRelayerService = new LidoRelayerService();\n","import {\n BatchSwapStep,\n FundManagement,\n SingleSwap,\n SwapType,\n SwapV2,\n} from '@symmetric-v3/sdk';\nimport { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { AddressZero } from '@ethersproject/constants';\n\nimport { isSameAddress } from '@/lib/utils';\nimport {\n getWstETHByStETH,\n isStETH,\n isStEthAddress,\n} from '@/lib/utils/balancer/lido';\nimport ConfigService, { configService } from '@/services/config/config.service';\nimport { lidoRelayerService } from '@/services/contracts/lido-relayer.service';\nimport { vaultService } from '@/services/contracts/vault.service';\n\nimport { walletService as walletServiceInstance } from '@/services/web3/wallet.service';\n\nexport type Address = string;\n\nexport enum SwapTokenType {\n fixed,\n min,\n max,\n}\n\nexport interface SwapToken {\n address: Address;\n amount: BigNumber;\n type: SwapTokenType;\n}\n\nexport class SwapService {\n constructor(\n private readonly transactionDeadline: Ref,\n private readonly config: ConfigService = configService,\n private readonly walletService = walletServiceInstance\n ) {}\n\n public async batchSwapV2(\n tokenIn: SwapToken,\n tokenOut: SwapToken,\n swaps: SwapV2[],\n tokenAddresses: string[]\n ): Promise {\n if (isStETH(tokenIn.address, tokenOut.address)) {\n return this.lidoBatchSwap(tokenIn, tokenOut, swaps, tokenAddresses);\n }\n console.log('[Swap Service] batchSwapV2');\n const overrides: any = {};\n\n if (isSameAddress(tokenIn.address, AddressZero)) {\n overrides.value = tokenIn.amount;\n }\n\n const swapKind =\n tokenOut.type === SwapTokenType.min\n ? SwapType.SwapExactIn\n : SwapType.SwapExactOut;\n\n const funds = await this.getFundManagement();\n\n try {\n if (swaps.length == 1) {\n const single: SingleSwap = {\n poolId: swaps[0].poolId,\n kind: swapKind,\n assetIn: tokenAddresses[swaps[0].assetInIndex],\n assetOut: tokenAddresses[swaps[0].assetOutIndex],\n amount: swaps[0].amount,\n userData: swaps[0].userData,\n };\n\n /*\n See docs in iVault:\n If the swap is 'given in' (the number of tokens to send to the Pool is known), it returns the amount of tokens\n taken from the Pool, which must be greater than or equal to `limit`.\n If the swap is 'given out' (the number of tokens to take from the Pool is known), it returns the amount of tokens\n sent to the Pool, which must be less than or equal to `limit`.\n */\n const limit =\n swapKind === SwapType.SwapExactIn\n ? tokenOut.amount.toString()\n : tokenIn.amount.toString();\n\n return vaultService.swap(\n single,\n funds,\n limit,\n this.transactionDeadline.value,\n overrides\n );\n }\n\n const limits: string[] = this.calculateLimits(\n [tokenIn],\n [tokenOut],\n tokenAddresses\n );\n\n return vaultService.batchSwap(\n swapKind,\n swaps,\n tokenAddresses,\n funds,\n limits,\n this.transactionDeadline.value,\n overrides\n );\n } catch (e) {\n console.log('[Swapper] batchSwapV2 Error:', e);\n return Promise.reject(e);\n }\n }\n\n public async lidoBatchSwap(\n tokenIn: SwapToken,\n tokenOut: SwapToken,\n swaps: SwapV2[],\n tokenAddresses: string[]\n ): Promise {\n console.log('[Swapper] lidoBatchSwap');\n const overrides: any = {};\n\n if (isSameAddress(tokenIn.address, AddressZero)) {\n overrides.value = tokenIn.amount;\n }\n\n // Convert tokenIn/tokenOut so that it matches what's in tokenAddresses\n const wstETH = this.config.network.tokens.Addresses.wstETH || '';\n if (isStEthAddress(tokenIn.address)) {\n tokenIn = {\n address: wstETH.toLowerCase(),\n amount: await getWstETHByStETH(tokenIn.amount),\n type: tokenIn.type,\n };\n } else if (isStEthAddress(tokenOut.address)) {\n tokenOut = {\n address: wstETH.toLowerCase(),\n amount: await getWstETHByStETH(tokenOut.amount),\n type: tokenOut.type,\n };\n }\n\n const swapKind =\n tokenOut.type === SwapTokenType.min\n ? SwapType.SwapExactIn\n : SwapType.SwapExactOut;\n\n const funds = await this.getFundManagement();\n\n try {\n if (swaps.length == 1) {\n const single: SingleSwap = {\n poolId: swaps[0].poolId,\n kind: swapKind,\n assetIn: tokenAddresses[swaps[0].assetInIndex],\n assetOut: tokenAddresses[swaps[0].assetOutIndex],\n amount: swaps[0].amount,\n userData: swaps[0].userData,\n };\n\n return lidoRelayerService.swap(\n single,\n funds,\n tokenOut.amount.toString(),\n this.transactionDeadline.value,\n overrides\n );\n }\n\n const limits = this.calculateLimits(\n [tokenIn],\n [tokenOut],\n tokenAddresses\n );\n\n return lidoRelayerService.batchSwap(\n swapKind,\n swaps,\n tokenAddresses,\n funds,\n limits,\n this.transactionDeadline.value,\n overrides\n );\n } catch (e) {\n console.log('[Swapper] lidoBatchSwap Error:', e);\n return Promise.reject(e);\n }\n }\n\n /**\n * Join a Boosted Pool (StablePhantom) using a batch swap\n */\n public async boostedJoinBatchSwap(\n tokensIn: SwapToken[],\n tokenOut: SwapToken,\n swaps: SwapV2[],\n tokenAddresses: string[]\n ) {\n try {\n const overrides: any = {};\n const funds = await this.getFundManagement();\n\n const limits: string[] = this.calculateLimits(\n tokensIn,\n [tokenOut],\n tokenAddresses\n );\n\n return vaultService.batchSwap(\n SwapType.SwapExactIn,\n swaps,\n tokenAddresses,\n funds,\n limits,\n this.transactionDeadline.value,\n overrides\n );\n } catch (error) {\n console.log('[Swapper] batchSwapGivenInV2 Error:', error);\n throw error;\n }\n }\n\n /**\n * Exit a Boosted Pool (StablePhantom) using a batch swap\n */\n public async boostedExitBatchSwap(\n tokenIn: SwapToken,\n tokensOut: SwapToken[],\n swaps: BatchSwapStep[],\n tokenAddresses: string[],\n swapKind: SwapType\n ): Promise {\n try {\n const overrides: any = {};\n const funds = await this.getFundManagement();\n\n const limits: string[] = this.calculateLimits(\n [tokenIn],\n tokensOut,\n tokenAddresses\n );\n\n console.log('limits', limits);\n\n return vaultService.batchSwap(\n swapKind,\n swaps,\n tokenAddresses,\n funds,\n limits,\n this.transactionDeadline.value,\n overrides\n );\n } catch (error) {\n console.log('[Swapper] batchSwapGivenInV2 Error:', error);\n throw error;\n }\n }\n\n private async getFundManagement(): Promise {\n const userAddress = await this.walletService.getUserAddress();\n const funds: FundManagement = {\n sender: userAddress,\n recipient: userAddress,\n fromInternalBalance: false,\n toInternalBalance: false,\n };\n return funds;\n }\n\n public calculateLimits(\n tokensIn: SwapToken[],\n tokensOut: SwapToken[],\n tokenAddresses: string[]\n ): string[] {\n const limits: string[] = [];\n\n tokenAddresses.forEach((token, i) => {\n const tokenIn = tokensIn.find(\n swapToken => token.toLowerCase() === swapToken.address.toLowerCase()\n );\n const tokenOut = tokensOut.find(\n swapToken => token.toLowerCase() === swapToken.address.toLowerCase()\n );\n if (tokenIn) {\n limits[i] = tokenIn.amount.toString();\n } else if (tokenOut) {\n limits[i] = tokenOut.amount.mul(-1).toString();\n } else {\n limits[i] = '0';\n }\n });\n\n console.log('Limits', limits);\n return limits;\n }\n}\n","import { BatchSwapStep, SwapType, SwapV2 } from '@symmetric-v3/sdk';\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { TransactionResponse } from '@ethersproject/providers';\n\nimport { SorReturn } from '@/lib/utils/balancer/helpers/sor/sorManager';\nimport {\n SwapService,\n SwapToken,\n SwapTokenType,\n} from '@/services/swap/swap.service';\nimport { useApp } from './useApp';\n\nexport function useSwapper() {\n /**\n * COMPOSABLES\n */\n const { transactionDeadline } = useApp();\n\n /**\n * SERVICES\n */\n const swapService = new SwapService(transactionDeadline);\n\n /**\n * METHODS\n */\n async function swapIn(\n sorReturn: SorReturn,\n tokenInAmount: BigNumber,\n tokenOutAmountMin: BigNumber\n ): Promise {\n const tokenInAddress = sorReturn.result.tokenIn;\n const tokenOutAddress = sorReturn.result.tokenOut;\n\n const tokenIn: SwapToken = {\n address: tokenInAddress,\n amount: tokenInAmount,\n type: SwapTokenType.fixed,\n };\n\n const tokenOut: SwapToken = {\n address: tokenOutAddress,\n amount: tokenOutAmountMin,\n type: SwapTokenType.min,\n };\n\n console.log('PERFORM SWAP');\n return swapService.batchSwapV2(\n tokenIn,\n tokenOut,\n sorReturn.result.swaps,\n sorReturn.result.tokenAddresses\n );\n }\n\n async function swapOut(\n sorReturn: SorReturn,\n tokenInAmountMax: BigNumber,\n tokenOutAmount: BigNumber\n ): Promise {\n const tokenInAddress = sorReturn.result.tokenIn;\n const tokenOutAddress = sorReturn.result.tokenOut;\n\n const tokenIn: SwapToken = {\n address: tokenInAddress,\n amount: tokenInAmountMax,\n type: SwapTokenType.max,\n };\n\n const tokenOut: SwapToken = {\n address: tokenOutAddress,\n amount: tokenOutAmount,\n type: SwapTokenType.fixed,\n };\n\n return swapService.batchSwapV2(\n tokenIn,\n tokenOut,\n sorReturn.result.swaps,\n sorReturn.result.tokenAddresses\n );\n }\n\n async function boostedJoinBatchSwap(\n swaps: SwapV2[],\n tokenAddresses: string[],\n tokenOutAddress: string,\n amountsInMap: Record,\n amountOutMin: BigNumber\n ) {\n const tokensIn: SwapToken[] = Object.entries(amountsInMap).map(\n ([address, amount]) => {\n return {\n address,\n amount,\n type: SwapTokenType.fixed,\n };\n }\n );\n const tokenOut: SwapToken = {\n address: tokenOutAddress,\n amount: amountOutMin,\n type: SwapTokenType.min,\n };\n return swapService.boostedJoinBatchSwap(\n tokensIn,\n tokenOut,\n swaps,\n tokenAddresses\n );\n }\n\n async function boostedExitBatchSwap(\n swaps: BatchSwapStep[],\n tokenAddresses: string[],\n tokenInAddress: string,\n amountIn: string,\n amountsOutMap: Record,\n swapKind: SwapType = SwapType.SwapExactIn\n ): Promise {\n const tokenIn: SwapToken = {\n address: tokenInAddress,\n amount: BigNumber.from(amountIn),\n type: SwapTokenType.min,\n };\n\n const tokensOut: SwapToken[] = Object.entries(amountsOutMap).map(\n ([address, amount]) => {\n return {\n address,\n amount: BigNumber.from(amount),\n type: SwapTokenType.fixed,\n };\n }\n );\n return swapService.boostedExitBatchSwap(\n tokenIn,\n tokensOut,\n swaps,\n tokenAddresses,\n swapKind\n );\n }\n\n return { swapIn, swapOut, boostedJoinBatchSwap, boostedExitBatchSwap };\n}\n","import {\n SubgraphPoolBase,\n SwapType,\n SwapTypes,\n parseFixed,\n} from '@symmetric-v3/sdk';\nimport { BigNumber, formatFixed } from '@ethersproject/bignumber';\nimport {\n AddressZero,\n WeiPerEther as ONE,\n Zero,\n} from '@ethersproject/constants';\nimport { TransactionResponse } from '@ethersproject/providers';\nimport { formatUnits, parseUnits } from '@ethersproject/units';\nimport { useI18n } from 'vue-i18n';\n\nimport { NATIVE_ASSET_ADDRESS } from '@/constants/tokens';\nimport { getBalancerSDK } from '@/dependencies/balancer-sdk';\nimport { bnum } from '@/lib/utils';\nimport {\n SorManager,\n SorReturn,\n} from '@/lib/utils/balancer/helpers/sor/sorManager';\nimport { convertStEthWrap, isStEthAddress } from '@/lib/utils/balancer/lido';\nimport { useSwapper } from '@/composables/useSwapper';\nimport {\n getWrapOutput,\n unwrap,\n wrap,\n WrapType,\n} from '@/lib/utils/balancer/wrapper';\nimport { configService } from '@/services/config/config.service';\nimport { rpcProviderService } from '@/services/rpc-provider/rpc-provider.service';\nimport useWeb3 from '@/services/web3/useWeb3';\nimport { TokenInfo } from '@/types/TokenList';\n\nimport useEthers from '../useEthers';\nimport useFathom from '../useFathom';\nimport useNumbers, { FNumFormats } from '../useNumbers';\nimport { isMainnet } from '../useNetwork';\nimport { useTokens } from '@/providers/tokens.provider';\nimport useTransactions, { TransactionAction } from '../useTransactions';\nimport { SwapQuote } from './types';\nimport { overflowProtected } from '@/components/_global/BalTextInput/helpers';\nimport { captureBalancerException, isUserError } from '@/lib/utils/errors';\n\ntype SorState = {\n validationErrors: {\n highPriceImpact: boolean;\n noSwaps: boolean;\n };\n submissionError: string | null;\n};\n\nconst GAS_PRICE = import.meta.env.VITE_GAS_PRICE || '100000000000';\nconst MAX_POOLS = import.meta.env.VITE_MAX_POOLS || '4';\nconst MIN_PRICE_IMPACT = 0.0001;\nconst HIGH_PRICE_IMPACT_THRESHOLD = 0.05;\nconst state = reactive({\n validationErrors: {\n highPriceImpact: false,\n noSwaps: false,\n },\n submissionError: null,\n});\n\ntype Props = {\n exactIn: Ref;\n tokenInAddressInput: Ref;\n tokenInAmountInput: Ref;\n tokenOutAddressInput: Ref;\n tokenOutAmountInput: Ref;\n wrapType: Ref;\n tokenInAmountScaled?: ComputedRef;\n tokenOutAmountScaled?: ComputedRef;\n sorConfig?: {\n handleAmountsOnFetchPools: boolean;\n };\n tokenIn: ComputedRef;\n tokenOut: ComputedRef;\n slippageBufferRate: ComputedRef;\n isCowswapSwap: ComputedRef;\n};\n\nexport type UseSor = ReturnType;\n\n/**\n * Calculates the difference between the price the user is receiving\n * and the market price of the token.\n * The variable token is the token has it's amount calculated by SOR\n * - If the swap type is ExactIn, this is the output token\n * - If the swap type is ExactOut, this is the input token\n * The fixed token is the token that has a fixed amount the user set.\n * This is the opposite of the variable token.\n * @param sellTokenAmount - The amount of the token being sold in native amounts (so 25 USDC = 25000000)\n * @param sellTokenDecimals - The number of decimals the sell token has\n * @param buyTokenAmount - The amount of the token being bought in native amounts (so 25 USDC = 25000000)\n * @param buyTokenDecimals - The number of decimals the buy token has\n * @param swapType - The type of swap we are doing\n * @param marketSp - The market spot price of the token pair\n * @returns\n */\nexport function calcPriceImpact(\n sellTokenAmount: BigNumber,\n sellTokenDecimals: number,\n buyTokenAmount: BigNumber,\n buyTokenDecimals: number,\n swapType: SwapType,\n marketSp: string\n): BigNumber {\n // Scale the sellToken by the buyToken decimals and vice versa so they are both the same scale\n const sellTokenScaled = parseFixed(\n sellTokenAmount.toString(),\n buyTokenDecimals\n );\n const buyTokenScaled = parseFixed(\n buyTokenAmount.toString(),\n sellTokenDecimals\n );\n\n const SCALE = 18;\n const scalingFactor = BigNumber.from(10).pow(SCALE);\n\n const effectivePrice = sellTokenScaled.mul(scalingFactor).div(buyTokenScaled);\n const marketSpScaled = parseFixed(marketSp, SCALE);\n\n let priceRatio;\n if (swapType == SwapType.SwapExactIn) {\n // If we are swapping exact in the buy token is the variable one so we need\n // to divide the market spot price by it to get the ratio of expectedPrice:actualPrice\n priceRatio = marketSpScaled.mul(scalingFactor).div(effectivePrice);\n } else {\n // If we are swapping exact out the sell token is the variable one so we need\n // to divide it by the market spot price to get the ratio of expectedPrice:actualPrice\n priceRatio = effectivePrice.mul(scalingFactor).div(marketSpScaled);\n }\n\n // We don't care about > 4 decimal places for price impacts and sometimes\n // there are rounding errors with repeating numbers so we round to 4 decimal places\n const maxDecimalPlaces = 4;\n const priceRatioRounded = Math.round(\n priceRatio.div(BigNumber.from(10).pow(SCALE - maxDecimalPlaces))\n );\n priceRatio = BigNumber.from(priceRatioRounded).mul(\n BigNumber.from(10).pow(SCALE - maxDecimalPlaces)\n );\n\n const priceImpact = ONE.sub(priceRatio);\n return priceImpact;\n}\n\nexport default function useSor({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n wrapType,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n sorConfig = {\n handleAmountsOnFetchPools: true,\n },\n tokenIn,\n tokenOut,\n slippageBufferRate,\n isCowswapSwap,\n}: Props) {\n let sorManager: SorManager | undefined = undefined;\n const pools = ref([]);\n const sorReturn = ref({\n hasSwaps: false,\n tokenIn: '',\n tokenOut: '',\n returnDecimals: 18,\n returnAmount: Zero,\n marketSpNormalised: '0',\n result: {\n tokenAddresses: [],\n swaps: [],\n swapAmount: Zero,\n returnAmount: Zero,\n returnAmountConsideringFees: Zero,\n tokenIn: '',\n tokenOut: '',\n marketSp: '0',\n swapAmountForSwaps: Zero,\n returnAmountFromSwaps: Zero,\n },\n });\n const swapping = ref(false);\n const confirming = ref(false);\n const priceImpact = ref(0);\n const latestTxHash = ref('');\n const poolsLoading = ref(true);\n\n // COMPOSABLES\n const { account, getProvider: getWeb3Provider, appNetworkConfig } = useWeb3();\n const provider = computed(() => getWeb3Provider());\n const { trackGoal, Goals } = useFathom();\n const { txListener } = useEthers();\n const { addTransaction } = useTransactions();\n const { fNum, toFiat } = useNumbers();\n const { t } = useI18n();\n const { injectTokens, priceFor, getToken } = useTokens();\n const { swapIn, swapOut } = useSwapper();\n\n onMounted(async () => {\n const unknownAssets: string[] = [];\n if (tokenInAddressInput.value && !getToken(tokenInAddressInput.value)) {\n unknownAssets.push(tokenInAddressInput.value);\n }\n if (tokenOutAddressInput.value && !getToken(tokenOutAddressInput.value)) {\n unknownAssets.push(tokenOutAddressInput.value);\n }\n await injectTokens(unknownAssets);\n await initSor();\n await handleAmountChange();\n });\n\n function resetState() {\n state.validationErrors.highPriceImpact = false;\n state.validationErrors.noSwaps = false;\n\n state.submissionError = null;\n }\n\n async function initSor(): Promise {\n sorManager = new SorManager(\n rpcProviderService.jsonProvider,\n BigNumber.from(GAS_PRICE),\n Number(MAX_POOLS)\n );\n\n fetchPools();\n }\n\n async function fetchPools(): Promise {\n if (!sorManager) {\n return;\n }\n\n console.time('[SOR] fetchPools');\n await sorManager.fetchPools();\n console.timeEnd('[SOR] fetchPools');\n poolsLoading.value = false;\n // Updates any swaps with up to date pools/balances\n if (sorConfig.handleAmountsOnFetchPools) {\n handleAmountChange();\n }\n }\n\n function trackSwapEvent() {\n trackGoal(Goals.BalancerSwap);\n if (isMainnet.value) trackGoal(Goals.BalancerSwapMainnet);\n }\n\n async function updateSwapAmounts(): Promise {\n if (!sorManager) {\n return;\n }\n if (sorReturn.value.hasSwaps && !confirming.value) {\n const { result } = sorReturn.value;\n\n const swapType: SwapType = exactIn.value\n ? SwapType.SwapExactIn\n : SwapType.SwapExactOut;\n\n const deltas = await getBalancerSDK().swaps.queryBatchSwap({\n kind: swapType,\n swaps: result.swaps,\n assets: result.tokenAddresses,\n });\n\n if (result !== sorReturn.value.result) {\n // sorReturn was updated while we were querying, abort to not show stale data.\n return;\n }\n\n if (deltas.length >= 2) {\n const tokenInDecimals = getTokenDecimals(tokenInAddressInput.value);\n const tokenOutDecimals = getTokenDecimals(tokenOutAddressInput.value);\n\n let tokenInAddress =\n tokenInAddressInput.value === NATIVE_ASSET_ADDRESS\n ? AddressZero\n : tokenInAddressInput.value;\n let tokenOutAddress =\n tokenOutAddressInput.value === NATIVE_ASSET_ADDRESS\n ? AddressZero\n : tokenOutAddressInput.value;\n\n // If the token in/out is stETH then finding the token position\n // below doesn't work because result.tokenAddresses only includes\n // wstETH. This is a crude hack to replace token in/out address\n // with wstETH so the index mapping works.\n if (isStEthAddress(tokenInAddressInput.value))\n tokenInAddress = configService.network.tokens.Addresses.wstETH || '';\n if (isStEthAddress(tokenOutAddressInput.value))\n tokenOutAddress = configService.network.tokens.Addresses.wstETH || '';\n\n const tokenInPosition = result.tokenAddresses.indexOf(\n tokenInAddress.toLowerCase()\n );\n const tokenOutPosition = result.tokenAddresses.indexOf(\n tokenOutAddress.toLowerCase()\n );\n\n if (swapType === SwapType.SwapExactOut) {\n let tokenInAmount = deltas[tokenInPosition]\n ? BigNumber.from(deltas[tokenInPosition]).abs()\n : BigNumber.from(0);\n tokenInAmount = await mutateAmount({\n amount: tokenInAmount,\n address: tokenInAddressInput.value,\n isInputToken: false,\n });\n\n tokenInAmountInput.value = tokenInAmount.gt(0)\n ? formatAmount(formatUnits(tokenInAmount, tokenInDecimals))\n : '';\n }\n\n if (swapType === SwapType.SwapExactIn) {\n let tokenOutAmount = deltas[tokenOutPosition]\n ? BigNumber.from(deltas[tokenOutPosition]).abs()\n : BigNumber.from(0);\n tokenOutAmount = await mutateAmount({\n amount: tokenOutAmount,\n address: tokenOutAddressInput.value,\n isInputToken: false,\n });\n\n tokenOutAmountInput.value = tokenOutAmount.gt(0)\n ? formatAmount(formatUnits(tokenOutAmount, tokenOutDecimals))\n : '';\n }\n }\n }\n }\n\n function resetInputAmounts(amount: string): void {\n if (exactIn.value && bnum(amount).isZero()) {\n tokenOutAmountInput.value = '';\n } else if (!exactIn.value && bnum(amount).isZero()) {\n tokenInAmountInput.value = '';\n } else {\n tokenInAmountInput.value = amount;\n tokenOutAmountInput.value = amount;\n }\n\n priceImpact.value = 0;\n sorReturn.value.hasSwaps = false;\n sorReturn.value.returnAmount = Zero;\n }\n\n async function handleAmountChange(): Promise {\n if (isCowswapSwap.value) {\n return;\n }\n\n let amount = exactIn.value\n ? tokenInAmountInput.value\n : tokenOutAmountInput.value;\n // Avoid using SOR if querying a zero value or (un)wrapping swap\n const zeroValueSwap = amount === '' || bnum(amount).isZero();\n if (zeroValueSwap) {\n resetInputAmounts(amount);\n return;\n }\n\n const tokenInAddress = tokenInAddressInput.value;\n const tokenOutAddress = tokenOutAddressInput.value;\n\n if (!tokenInAddress || !tokenOutAddress) {\n if (exactIn.value) tokenOutAmountInput.value = '';\n else tokenInAmountInput.value = '';\n return;\n }\n\n const tokenInDecimals = getTokenDecimals(tokenInAddressInput.value);\n const tokenOutDecimals = getTokenDecimals(tokenOutAddressInput.value);\n\n const inputAmountDecimals = exactIn.value\n ? tokenInDecimals\n : tokenOutDecimals;\n amount = overflowProtected(amount, inputAmountDecimals);\n\n if (wrapType.value !== WrapType.NonWrap) {\n const wrapper =\n wrapType.value === WrapType.Wrap ? tokenOutAddress : tokenInAddress;\n\n if (exactIn.value) {\n tokenInAmountInput.value = amount;\n\n const outputAmount = await getWrapOutput(\n wrapper,\n wrapType.value,\n parseFixed(amount, tokenInDecimals)\n );\n tokenOutAmountInput.value = formatFixed(outputAmount, tokenInDecimals);\n } else {\n tokenOutAmountInput.value = amount;\n\n const inputAmount = await getWrapOutput(\n wrapper,\n wrapType.value === WrapType.Wrap ? WrapType.Unwrap : WrapType.Wrap,\n parseFixed(amount, tokenOutDecimals)\n );\n tokenInAmountInput.value = formatFixed(inputAmount, tokenOutDecimals);\n }\n\n sorReturn.value.hasSwaps = false;\n priceImpact.value = 0;\n return;\n }\n\n if (!sorManager || !sorManager.hasPoolData()) {\n if (exactIn.value) tokenOutAmountInput.value = '';\n else tokenInAmountInput.value = '';\n return;\n }\n\n if (exactIn.value) {\n await setSwapCost(\n tokenOutAddressInput.value,\n tokenOutDecimals,\n sorManager\n );\n\n let tokenInAmountScaled = parseUnits(amount, tokenInDecimals);\n\n console.log('[SOR Manager] swapExactIn');\n\n const swapReturn: SorReturn = await sorManager.getBestSwap(\n tokenInAddress,\n tokenOutAddress,\n tokenInDecimals,\n tokenOutDecimals,\n SwapTypes.SwapExactIn,\n tokenInAmountScaled\n );\n\n sorReturn.value = swapReturn;\n let tokenOutAmount = swapReturn.returnAmount;\n\n tokenOutAmountInput.value = tokenOutAmount.gt(0)\n ? formatAmount(formatUnits(tokenOutAmount, tokenOutDecimals))\n : '';\n\n if (!sorReturn.value.hasSwaps) {\n priceImpact.value = 0;\n state.validationErrors.noSwaps = true;\n } else {\n // If either in/out address is stETH we should mutate the value for the\n // priceImpact calculation.\n tokenInAmountScaled = await mutateAmount({\n amount: tokenInAmountScaled,\n address: tokenInAddress,\n isInputToken: true,\n });\n tokenOutAmount = await mutateAmount({\n amount: tokenOutAmount,\n address: tokenOutAddress,\n isInputToken: false,\n });\n const priceImpactCalc = calcPriceImpact(\n tokenInAmountScaled,\n tokenInDecimals,\n tokenOutAmount,\n tokenOutDecimals,\n SwapType.SwapExactIn,\n swapReturn.marketSpNormalised\n );\n\n priceImpact.value = Math.max(\n Number(formatUnits(priceImpactCalc)),\n MIN_PRICE_IMPACT\n );\n }\n } else {\n // Notice that outputToken is tokenOut if swapType == 'swapExactIn' and tokenIn if swapType == 'swapExactOut'\n await setSwapCost(tokenInAddressInput.value, tokenInDecimals, sorManager);\n\n let tokenOutAmountScaled = parseUnits(amount, tokenOutDecimals);\n\n console.log('[SOR Manager] swapExactOut');\n\n const swapReturn: SorReturn = await sorManager.getBestSwap(\n tokenInAddress,\n tokenOutAddress,\n tokenInDecimals,\n tokenOutDecimals,\n SwapTypes.SwapExactOut,\n tokenOutAmountScaled\n );\n\n sorReturn.value = swapReturn; // TO DO - is it needed?\n\n let tokenInAmount = swapReturn.returnAmount;\n tokenInAmountInput.value = tokenInAmount.gt(0)\n ? formatAmount(formatUnits(tokenInAmount, tokenInDecimals))\n : '';\n\n if (!sorReturn.value.hasSwaps) {\n priceImpact.value = 0;\n state.validationErrors.noSwaps = true;\n } else {\n // If either in/out address is stETH we should mutate the value for the\n // priceImpact calculation.\n tokenOutAmountScaled = await mutateAmount({\n amount: tokenOutAmountScaled,\n address: tokenOutAddress,\n isInputToken: true,\n });\n tokenInAmount = await mutateAmount({\n amount: tokenInAmount,\n address: tokenInAddress,\n isInputToken: false,\n });\n const priceImpactCalc = calcPriceImpact(\n tokenInAmount,\n tokenInDecimals,\n tokenOutAmountScaled,\n tokenOutDecimals,\n SwapType.SwapExactIn,\n swapReturn.marketSpNormalised\n );\n\n priceImpact.value = Math.max(\n Number(formatUnits(priceImpactCalc)),\n MIN_PRICE_IMPACT\n );\n }\n }\n\n pools.value = sorManager.selectedPools;\n\n state.validationErrors.highPriceImpact =\n priceImpact.value >= HIGH_PRICE_IMPACT_THRESHOLD;\n }\n\n function txHandler(tx: TransactionResponse, action: TransactionAction): void {\n confirming.value = false;\n\n let summary = '';\n const tokenInAmountFormatted = fNum(tokenInAmountInput.value, {\n ...FNumFormats.token,\n maximumSignificantDigits: 6,\n });\n const tokenOutAmountFormatted = fNum(tokenOutAmountInput.value, {\n ...FNumFormats.token,\n maximumSignificantDigits: 6,\n });\n\n const tokenInSymbol = tokenIn.value.symbol;\n const tokenOutSymbol = tokenOut.value.symbol;\n\n if (['wrap', 'unwrap'].includes(action)) {\n summary = t('transactionSummary.wrapUnwrap', [\n tokenInAmountFormatted,\n tokenInSymbol,\n tokenOutSymbol,\n ]);\n } else {\n summary = `${tokenInAmountFormatted} ${tokenInSymbol} -> ${tokenOutAmountFormatted} ${tokenOutSymbol}`;\n }\n\n addTransaction({\n id: tx.hash,\n type: 'tx',\n action,\n summary,\n details: {\n tokenIn: tokenIn.value,\n tokenOut: tokenOut.value,\n tokenInAddress: tokenInAddressInput.value,\n tokenOutAddress: tokenOutAddressInput.value,\n tokenInAmount: tokenInAmountInput.value,\n tokenOutAmount: tokenOutAmountInput.value,\n exactIn: exactIn.value,\n quote: getQuote(),\n priceImpact: priceImpact.value,\n slippageBufferRate: slippageBufferRate.value,\n },\n });\n\n const swapUSDValue =\n toFiat(tokenInAmountInput.value, tokenInAddressInput.value) || '0';\n\n txListener(tx, {\n onTxConfirmed: async () => {\n trackGoal(Goals.Swapped, bnum(swapUSDValue).times(100).toNumber() || 0);\n swapping.value = false;\n latestTxHash.value = tx.hash;\n },\n onTxFailed: () => {\n swapping.value = false;\n },\n });\n }\n\n async function swap(successCallback?: () => void) {\n trackGoal(Goals.ClickSwap);\n swapping.value = true;\n confirming.value = true;\n state.submissionError = null;\n\n const tokenInAddress = tokenInAddressInput.value;\n const tokenOutAddress = tokenOutAddressInput.value;\n const tokenInDecimals = getToken(tokenInAddress).decimals;\n const tokenOutDecimals = getToken(tokenOutAddress).decimals;\n const tokenInAmountScaled = parseFixed(\n tokenInAmountInput.value,\n tokenInDecimals\n );\n\n if (wrapType.value == WrapType.Wrap) {\n try {\n const tx = await wrap(\n appNetworkConfig.key,\n provider.value as any,\n tokenOutAddress,\n tokenInAmountScaled\n );\n console.log('Wrap tx', tx);\n\n txHandler(tx, 'wrap');\n\n if (successCallback != null) {\n successCallback();\n }\n trackSwapEvent();\n } catch (error) {\n handleSwapException(error as Error, tokenInAddress, tokenOutAddress);\n }\n return;\n } else if (wrapType.value == WrapType.Unwrap) {\n try {\n const tx = await unwrap(\n appNetworkConfig.key,\n provider.value as any,\n tokenInAddress,\n tokenInAmountScaled\n );\n console.log('Unwrap tx', tx);\n\n txHandler(tx, 'unwrap');\n\n if (successCallback != null) {\n successCallback();\n }\n trackSwapEvent();\n } catch (error) {\n handleSwapException(error as Error, tokenInAddress, tokenOutAddress);\n }\n return;\n }\n\n if (exactIn.value) {\n const tokenOutAmount = parseFixed(\n tokenOutAmountInput.value,\n tokenOutDecimals\n );\n const minAmount = getMinOut(tokenOutAmount);\n const sr: SorReturn = sorReturn.value as SorReturn;\n\n try {\n const tx = await swapIn(sr, tokenInAmountScaled, minAmount);\n console.log('Swap in tx', tx);\n\n txHandler(tx, 'swap');\n\n if (successCallback != null) {\n successCallback();\n }\n trackSwapEvent();\n } catch (error) {\n handleSwapException(error as Error, tokenInAddress, tokenOutAddress);\n }\n } else {\n const tokenInAmountMax = getMaxIn(tokenInAmountScaled);\n const sr: SorReturn = sorReturn.value as SorReturn;\n const tokenOutAmountScaled = parseFixed(\n tokenOutAmountInput.value,\n tokenOutDecimals\n );\n\n try {\n const tx = await swapOut(sr, tokenInAmountMax, tokenOutAmountScaled);\n console.log('Swap out tx', tx);\n\n txHandler(tx, 'swap');\n\n if (successCallback != null) {\n successCallback();\n }\n trackSwapEvent();\n } catch (error) {\n handleSwapException(error as Error, tokenInAddress, tokenOutAddress);\n }\n }\n }\n\n // Uses stored market prices to calculate price of native asset in terms of token\n function calculateEthPriceInToken(tokenAddress: string): number {\n const ethPriceFiat = priceFor(appNetworkConfig.nativeAsset.address);\n const tokenPriceFiat = priceFor(tokenAddress);\n if (tokenPriceFiat === 0) return 0;\n const ethPriceToken = ethPriceFiat / tokenPriceFiat;\n return ethPriceToken;\n }\n\n // Sets SOR swap cost for more efficient routing\n async function setSwapCost(\n tokenAddress: string,\n tokenDecimals: number,\n sorManager: SorManager\n ): Promise {\n await sorManager.setCostOutputToken(\n tokenAddress,\n tokenDecimals,\n calculateEthPriceInToken(tokenAddress).toString()\n );\n }\n\n function getMaxIn(amount: BigNumber) {\n return amount\n .mul(parseFixed(String(1 + slippageBufferRate.value), 18))\n .div(ONE);\n }\n\n function getMinOut(amount: BigNumber) {\n return amount\n .mul(ONE)\n .div(parseFixed(String(1 + slippageBufferRate.value), 18));\n }\n\n function getQuote(): SwapQuote {\n const maximumInAmount =\n tokenInAmountScaled != null ? getMaxIn(tokenInAmountScaled.value) : Zero;\n\n const minimumOutAmount =\n tokenOutAmountScaled != null\n ? getMinOut(tokenOutAmountScaled.value)\n : Zero;\n\n return {\n feeAmountInToken: '0',\n feeAmountOutToken: '0',\n maximumInAmount,\n minimumOutAmount,\n };\n }\n\n function formatAmount(amount: string) {\n return fNum(amount, {\n maximumSignificantDigits: 6,\n useGrouping: false,\n fixedFormat: true,\n });\n }\n\n function getTokenDecimals(tokenAddress: string) {\n return getToken(tokenAddress)?.decimals;\n }\n\n /**\n * mutateAmount\n *\n * Handles any conditions where the token in or out needs to be mutated for\n * display purposes. The only case we have so far is if the token in or out\n * is stETH, the actual return amount from the SOR is wstETH. So we need to\n * convert the wstETH amount to stETH using the exchange rate.\n *\n * @param {BigNumber} amount - Amount to parse (could be tokenIn or tokenOut amount).\n * @param {string} address - Token address for amount.\n * @param {boolean} isInputToken - Is this the token being specified?\n * @returns {BigNumber} A new amount if conditions are met or the same amount\n * as passed in.\n */\n async function mutateAmount({\n amount,\n address,\n isInputToken,\n }: {\n amount: BigNumber;\n address: string;\n isInputToken: boolean;\n }): Promise {\n if (isStEthAddress(address) && isMainnet.value) {\n return convertStEthWrap({ amount, isWrap: isInputToken });\n }\n return amount;\n }\n\n function handleSwapException(\n error: Error,\n tokenIn: string,\n tokenOut: string\n ) {\n if (!isUserError(error)) {\n console.trace(error);\n state.submissionError = t('swapException', ['Symmetric']);\n\n captureBalancerException({\n error,\n action: 'swap',\n msgPrefix: state.submissionError,\n context: {\n extra: {\n sender: account.value,\n tokenIn,\n tokenOut,\n },\n tags: {\n swapType: 'balancer',\n },\n },\n });\n }\n swapping.value = false;\n confirming.value = false;\n throw error;\n }\n\n return {\n ...toRefs(state),\n sorManager,\n sorReturn,\n pools,\n initSor,\n handleAmountChange,\n exactIn,\n swap,\n swapping,\n priceImpact,\n latestTxHash,\n fetchPools,\n poolsLoading,\n getQuote,\n resetState,\n confirming,\n updateSwapAmounts,\n resetInputAmounts,\n // For Tests\n setSwapCost,\n };\n}\n","import {\n buildRelayerCalls,\n SubgraphPoolBase,\n SwapInfo,\n SwapTypes,\n} from '@symmetric-v3/sdk';\nimport { BigNumber, parseFixed } from '@ethersproject/bignumber';\nimport OldBigNumber from 'bignumber.js';\nimport { formatUnits } from '@ethersproject/units';\nimport { WeiPerEther as ONE, Zero } from '@ethersproject/constants';\nimport { bnum } from '@/lib/utils';\n\nimport { getBalancerSDK } from '@/dependencies/balancer-sdk';\nimport useWeb3 from '@/services/web3/useWeb3';\nimport { TokenInfo } from '@/types/TokenList';\n\nimport { useTokens } from '@/providers/tokens.provider';\nimport useTransactions from '../useTransactions';\nimport useRelayerApproval, {\n RelayerType,\n} from '@/composables/approvals/useRelayerApproval';\nimport { configService } from '@/services/config/config.service';\n\nimport { SwapQuote } from './types';\nimport useNumbers, { FNumFormats } from '../useNumbers';\nimport useEthers from '../useEthers';\nimport useRelayerApprovalQuery from '@/composables/queries/useRelayerApprovalQuery';\nimport { TransactionBuilder } from '@/services/web3/transactions/transaction.builder';\nimport BatchRelayerAbi from '@/lib/abi/BatchRelayer.json';\nimport { useI18n } from 'vue-i18n';\nimport { captureBalancerException, isUserError } from '@/lib/utils/errors';\n\ntype JoinExitState = {\n validationErrors: {\n highPriceImpact: boolean;\n };\n submissionError: string | null;\n};\n\nconst state = reactive({\n validationErrors: {\n highPriceImpact: false,\n },\n submissionError: null,\n});\n\ntype Props = {\n exactIn: Ref;\n tokenInAddressInput: Ref;\n tokenInAmountInput: Ref;\n tokenOutAddressInput: Ref;\n tokenOutAmountInput: Ref;\n tokenInAmountScaled: ComputedRef;\n tokenOutAmountScaled: ComputedRef;\n tokenIn: ComputedRef;\n tokenOut: ComputedRef;\n slippageBufferRate: ComputedRef;\n pools: Ref;\n};\n\nexport type useJoinExit = ReturnType;\n\nexport default function useJoinExit({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n tokenIn,\n tokenOut,\n slippageBufferRate,\n pools,\n}: Props) {\n const swapInfo = ref(null);\n const swapping = ref(false);\n const confirming = ref(false);\n const priceImpact = ref(0);\n const latestTxHash = ref('');\n const swapInfoLoading = ref(false);\n\n // COMPOSABLES\n const { account, getSigner } = useWeb3();\n const { injectTokens, getToken } = useTokens();\n const { relayerSignature } = useRelayerApproval(RelayerType.BATCH);\n const relayerApprovalQuery = useRelayerApprovalQuery(\n ref(configService.network.addresses.batchRelayer)\n );\n const { addTransaction } = useTransactions();\n const { txListener } = useEthers();\n const { fNum } = useNumbers();\n const { t } = useI18n();\n\n const hasValidationError = computed(\n () => state.validationErrors.highPriceImpact != false\n );\n\n function resetState() {\n state.validationErrors.highPriceImpact = false;\n\n state.submissionError = null;\n }\n\n function resetInputAmounts(amount: string): void {\n tokenInAmountInput.value = amount;\n tokenOutAmountInput.value = amount;\n priceImpact.value = 0;\n }\n\n async function getSwapInfo(): Promise {\n swapInfoLoading.value = true;\n swapInfo.value = await getBalancerSDK().sor.getSwaps(\n tokenInAddressInput.value,\n tokenOutAddressInput.value,\n exactIn.value ? SwapTypes.SwapExactIn : SwapTypes.SwapExactOut,\n parseFixed(\n tokenInAmountInput.value || tokenOutAmountInput.value || '0',\n 18\n ),\n undefined,\n true\n );\n swapInfoLoading.value = false;\n }\n\n async function handleAmountChange(): Promise {\n // Prevent quering undefined input amounts\n if (\n (exactIn.value && !tokenInAmountInput.value) ||\n (!exactIn.value && !tokenOutAmountInput.value)\n ) {\n return;\n }\n\n if (pools.value.length === 0) return;\n\n const amountToExchange = exactIn.value\n ? tokenInAmountScaled.value\n : tokenOutAmountScaled.value;\n\n if (amountToExchange === undefined) {\n return;\n }\n\n await getSwapInfo();\n\n const tokenInDecimals = getTokenDecimals(tokenInAddressInput.value);\n const tokenOutDecimals = getTokenDecimals(tokenOutAddressInput.value);\n\n const returnAmount = swapInfo.value?.returnAmount || BigNumber.from('0');\n\n if (returnAmount.isZero()) return;\n\n if (exactIn.value) {\n tokenOutAmountInput.value = bnum(\n formatUnits(returnAmount, tokenOutDecimals)\n ).toFixed(6, OldBigNumber.ROUND_DOWN);\n } else {\n tokenInAmountInput.value = bnum(\n formatUnits(returnAmount, tokenInDecimals)\n ).toFixed(6, OldBigNumber.ROUND_DOWN);\n }\n }\n\n async function swap(successCallback?: () => void) {\n const balancer = getBalancerSDK();\n let tx;\n try {\n confirming.value = true;\n state.submissionError = null;\n\n if (!swapInfo.value) {\n return;\n }\n\n const relayerCallData = buildRelayerCalls(\n swapInfo.value,\n pools.value,\n account.value,\n balancer.contracts.relayer?.address ?? '',\n balancer.networkConfig.addresses.tokens.wrappedNativeAsset,\n String(slippageBufferRate.value * 1e4),\n relayerSignature.value || undefined\n );\n\n const txBuilder = new TransactionBuilder(getSigner());\n tx = await txBuilder.contract.sendTransaction({\n contractAddress: balancer.contracts.relayer?.address ?? '',\n abi: BatchRelayerAbi,\n action: 'multicall',\n params: [relayerCallData.rawCalls],\n });\n console.log(tx);\n\n const tokenInAmountFormatted = fNum(tokenInAmountInput.value, {\n ...FNumFormats.token,\n maximumSignificantDigits: 6,\n });\n const tokenOutAmountFormatted = fNum(tokenOutAmountInput.value, {\n ...FNumFormats.token,\n maximumSignificantDigits: 6,\n });\n\n addTransaction({\n id: tx.hash,\n type: 'tx',\n action: 'swap',\n summary: `${tokenInAmountFormatted} ${tokenIn.value.symbol} -> ${tokenOutAmountFormatted} ${tokenOut.value.symbol}`,\n details: {\n tokenIn: tokenIn.value,\n tokenOut: tokenOut.value,\n tokenInAddress: tokenInAddressInput.value,\n tokenOutAddress: tokenOutAddressInput.value,\n tokenInAmount: tokenInAmountInput.value,\n tokenOutAmount: tokenOutAmountInput.value,\n exactIn: exactIn.value,\n quote: getQuote(),\n priceImpact: priceImpact.value,\n slippageBufferRate: slippageBufferRate.value,\n },\n });\n\n if (successCallback != null) {\n successCallback();\n }\n\n await txListener(tx, {\n onTxConfirmed: async () => {\n confirming.value = false;\n relayerApprovalQuery.refetch();\n },\n onTxFailed: () => {\n confirming.value = false;\n },\n });\n } catch (error) {\n const msg = t('swapException', ['Relayer']);\n\n captureBalancerException({\n error,\n action: 'swap',\n msgPrefix: msg,\n context: {\n level: 'fatal',\n extra: {\n sender: account.value,\n swapInfo: swapInfo.value,\n tx,\n },\n },\n });\n\n if (!isUserError(error)) {\n state.submissionError = t('swapException', ['Relayer']);\n }\n\n swapping.value = false;\n confirming.value = false;\n throw error;\n }\n }\n\n function getMaxIn(amount: BigNumber) {\n return amount\n .mul(parseFixed(String(1 + slippageBufferRate.value), 18))\n .div(ONE);\n }\n\n function getMinOut(amount: BigNumber) {\n return amount\n .mul(ONE)\n .div(parseFixed(String(1 + slippageBufferRate.value), 18));\n }\n\n function getQuote(): SwapQuote {\n const maximumInAmount =\n tokenInAmountScaled != null ? getMaxIn(tokenInAmountScaled.value) : Zero;\n\n const minimumOutAmount =\n tokenOutAmountScaled != null\n ? getMinOut(tokenOutAmountScaled.value)\n : Zero;\n\n return {\n feeAmountInToken: '0',\n feeAmountOutToken: '0',\n maximumInAmount,\n minimumOutAmount,\n };\n }\n\n function getTokenDecimals(tokenAddress: string) {\n return getToken(tokenAddress)?.decimals;\n }\n\n // LIFECYCLE\n onMounted(async () => {\n const unknownAssets: string[] = [];\n if (tokenInAddressInput.value && !getToken(tokenInAddressInput.value)) {\n unknownAssets.push(tokenInAddressInput.value);\n }\n if (tokenOutAddressInput.value && !getToken(tokenOutAddressInput.value)) {\n unknownAssets.push(tokenOutAddressInput.value);\n }\n await injectTokens(unknownAssets);\n });\n\n watch(pools, () => {\n handleAmountChange();\n });\n\n return {\n ...toRefs(state),\n pools,\n hasValidationError,\n handleAmountChange,\n exactIn,\n swap,\n swapInfo,\n swapping,\n priceImpact,\n latestTxHash,\n getQuote,\n resetState,\n confirming,\n swapInfoLoading,\n resetInputAmounts,\n };\n}\n","import { useSwapAssets } from '@/composables/swap/useSwapAssets';\nimport { parseFixed } from '@ethersproject/bignumber';\n\nimport LS_KEYS from '@/constants/local-storage.keys';\nimport { NATIVE_ASSET_ADDRESS } from '@/constants/tokens';\nimport { bnum, lsGet, lsSet } from '@/lib/utils';\nimport { getWrapAction, WrapType } from '@/lib/utils/balancer/wrapper';\nimport { COW_SUPPORTED_NETWORKS } from '@/services/cowswap/constants';\nimport {\n canUseJoinExit,\n someJoinExit,\n SubgraphPoolBase,\n SwapTypes,\n} from '@symmetric-v3/sdk';\n\nimport useWeb3 from '@/services/web3/useWeb3';\nimport { networkId } from '../useNetwork';\nimport useNumbers, { FNumFormats } from '../useNumbers';\nimport { useTokens } from '@/providers/tokens.provider';\nimport { useUserSettings } from '@/providers/user-settings.provider';\nimport useCowswap from './useCowswap';\nimport useSor from './useSor';\nimport useJoinExit from './useJoinExit';\n\nexport type SwapRoute = 'wrapUnwrap' | 'balancer' | 'cowswap' | 'joinExit';\n\nexport type UseSwapping = ReturnType;\n\nexport const swapGasless = ref(\n lsGet(LS_KEYS.Swap.Gasless, true)\n);\n\nexport default function useSwapping(\n exactIn: Ref,\n tokenInAddressInput: Ref,\n tokenInAmountInput: Ref,\n tokenOutAddressInput: Ref,\n tokenOutAmountInput: Ref\n) {\n // COMPOSABLES\n const { fNum } = useNumbers();\n const { getToken, tokens } = useTokens();\n const { blockNumber } = useWeb3();\n const { slippage } = useUserSettings();\n const { setInputAsset, setOutputAsset } = useSwapAssets();\n\n // COMPUTED\n const slippageBufferRate = computed(() => parseFloat(slippage.value));\n\n const wrapType = computed(() =>\n getWrapAction(tokenInAddressInput.value, tokenOutAddressInput.value)\n );\n const isWrap = computed(() => wrapType.value === WrapType.Wrap);\n const isUnwrap = computed(() => wrapType.value === WrapType.Unwrap);\n\n const tokenIn = computed(() => getToken(tokenInAddressInput.value));\n\n const tokenOut = computed(() => getToken(tokenOutAddressInput.value));\n\n const isNativeAssetSwap = computed(\n () => tokenInAddressInput.value === NATIVE_ASSET_ADDRESS\n );\n\n const tokenInAmountScaled = computed(() =>\n parseFixed(tokenInAmountInput.value || '0', tokenIn.value.decimals)\n );\n\n const tokenOutAmountScaled = computed(() =>\n parseFixed(tokenOutAmountInput.value || '0', tokenOut.value.decimals)\n );\n\n const requiresTokenApproval = computed(() => {\n if (wrapType.value === WrapType.Unwrap || isNativeAssetSwap.value) {\n return false;\n }\n return true;\n });\n\n const effectivePriceMessage = computed(() => {\n const tokenInAmount = parseFloat(tokenInAmountInput.value);\n const tokenOutAmount = parseFloat(tokenOutAmountInput.value);\n\n if (tokenInAmount > 0 && tokenOutAmount > 0) {\n return {\n tokenIn: `1 ${tokenIn.value?.symbol} = ${fNum(\n bnum(tokenOutAmount).div(tokenInAmount).toString(),\n FNumFormats.token\n )} ${tokenOut.value?.symbol}`,\n tokenOut: `1 ${tokenOut.value?.symbol} = ${fNum(\n bnum(tokenInAmount).div(tokenOutAmount).toString(),\n FNumFormats.token\n )} ${tokenIn.value?.symbol}`,\n };\n }\n return {\n tokenIn: '',\n tokenOut: '',\n };\n });\n\n const isCowswapSupportedOnNetwork = computed(() =>\n COW_SUPPORTED_NETWORKS.includes(networkId.value)\n );\n\n const swapRoute = computed(() => {\n if (wrapType.value !== WrapType.NonWrap) {\n return 'wrapUnwrap';\n } else if (isNativeAssetSwap.value) {\n return 'balancer';\n }\n\n if (swapGasless.value && isCowswapSupportedOnNetwork.value) {\n return 'cowswap';\n } else {\n const swapInfoAvailable =\n joinExit.swapInfo.value?.returnAmount &&\n !joinExit.swapInfo.value?.returnAmount.isZero();\n\n const joinExitSwapAvailable = swapInfoAvailable\n ? canUseJoinExit(\n exactIn.value ? SwapTypes.SwapExactIn : SwapTypes.SwapExactOut,\n tokenInAddressInput.value,\n tokenOutAddressInput.value\n )\n : false;\n\n const joinExitSwapPresent = joinExitSwapAvailable\n ? someJoinExit(\n sor.pools.value as SubgraphPoolBase[],\n joinExit.swapInfo.value?.swaps ?? [],\n joinExit.swapInfo.value?.tokenAddresses ?? []\n )\n : false;\n // Currently joinExit swap is only suitable for ExactIn and non-eth swaps\n return joinExitSwapPresent ? 'joinExit' : 'balancer';\n }\n });\n\n const isCowswapSwap = computed(() => swapRoute.value === 'cowswap');\n\n const isBalancerSwap = computed(() => swapRoute.value === 'balancer');\n\n const isJoinExitSwap = computed(() => swapRoute.value === 'joinExit');\n\n const isWrapUnwrapSwap = computed(() => swapRoute.value === 'wrapUnwrap');\n\n const isGaslessSwappingDisabled = computed(\n () => isNativeAssetSwap.value || isWrapUnwrapSwap.value\n );\n\n const hasSwapQuote = computed(\n () =>\n parseFloat(tokenInAmountInput.value) > 0 &&\n parseFloat(tokenOutAmountInput.value) > 0\n );\n\n const sor = useSor({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n wrapType,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n sorConfig: {\n handleAmountsOnFetchPools: true,\n },\n tokenIn,\n tokenOut,\n slippageBufferRate,\n isCowswapSwap,\n });\n\n const cowswap = useCowswap({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n tokenIn,\n tokenOut,\n slippageBufferRate,\n });\n\n const joinExit = useJoinExit({\n exactIn,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n tokenIn,\n tokenOut,\n slippageBufferRate,\n pools: sor.pools as Ref,\n });\n\n const isLoading = computed(() => {\n if (hasSwapQuote.value || isWrapUnwrapSwap.value) {\n return false;\n }\n\n if (isCowswapSwap.value) {\n return cowswap.updatingQuotes.value;\n }\n\n return joinExit.swapInfoLoading.value || sor.poolsLoading.value;\n });\n\n const isConfirming = computed(\n () =>\n sor.confirming.value ||\n cowswap.confirming.value ||\n joinExit.confirming.value\n );\n\n const submissionError = computed(\n () =>\n sor.submissionError.value ||\n cowswap.submissionError.value ||\n joinExit.submissionError.value\n );\n\n // METHODS\n async function swap(successCallback?: () => void) {\n if (isCowswapSwap.value) {\n return cowswap.swap(() => {\n if (successCallback) {\n successCallback();\n }\n\n cowswap.resetState();\n });\n } else if (isJoinExitSwap.value) {\n return joinExit.swap(() => {\n if (successCallback) {\n successCallback();\n }\n\n joinExit.resetState();\n });\n } else {\n // handles both Balancer and Wrap/Unwrap swaps\n return sor.swap(() => {\n if (successCallback) {\n successCallback();\n }\n\n sor.resetState();\n });\n }\n }\n\n function resetSubmissionError() {\n sor.submissionError.value = null;\n cowswap.submissionError.value = null;\n joinExit.submissionError.value = null;\n }\n\n function setSwapGasless(flag: boolean) {\n swapGasless.value = flag;\n\n lsSet(LS_KEYS.Swap.Gasless, swapGasless.value);\n }\n\n function toggleSwapGasless() {\n setSwapGasless(!swapGasless.value);\n\n handleAmountChange();\n }\n\n function getQuote() {\n if (isCowswapSwap.value) {\n return cowswap.getQuote();\n }\n if (isJoinExitSwap.value) {\n return joinExit.getQuote();\n }\n return sor.getQuote();\n }\n\n function resetAmounts() {\n sor.resetInputAmounts('');\n }\n\n async function handleAmountChange() {\n if (exactIn.value) {\n tokenOutAmountInput.value = '';\n } else {\n tokenInAmountInput.value = '';\n }\n\n cowswap.resetState(false);\n sor.resetState();\n joinExit.resetState();\n\n if (isCowswapSwap.value) {\n cowswap.handleAmountChange();\n } else {\n await sor.handleAmountChange();\n await joinExit.handleAmountChange();\n }\n }\n\n // WATCHERS\n watch(tokenInAddressInput, async () => {\n setInputAsset(tokenInAddressInput.value);\n\n handleAmountChange();\n });\n\n watch(tokenOutAddressInput, () => {\n setOutputAsset(tokenOutAddressInput.value);\n\n handleAmountChange();\n });\n\n onMounted(() => {\n const gaslessDisabled = window.location.href.includes('gasless=false');\n\n if (gaslessDisabled) {\n setSwapGasless(false);\n }\n });\n\n watch(blockNumber, () => {\n if (isCowswapSwap.value) {\n if (!cowswap.hasValidationError.value) {\n cowswap.handleAmountChange();\n }\n } else if (isJoinExitSwap.value) {\n if (!joinExit.hasValidationError.value) {\n joinExit.handleAmountChange();\n }\n } else if (isBalancerSwap.value) {\n sor.updateSwapAmounts();\n }\n });\n\n watch(slippageBufferRate, () => {\n handleAmountChange();\n });\n\n return {\n // computed\n isWrap,\n isUnwrap,\n isNativeAssetSwap,\n tokenIn,\n tokenOut,\n tokenInAmountScaled,\n tokenOutAmountScaled,\n tokens,\n requiresTokenApproval,\n effectivePriceMessage,\n swapRoute,\n exactIn,\n isLoading,\n cowswap,\n sor,\n joinExit,\n isCowswapSwap,\n isBalancerSwap,\n isJoinExitSwap,\n wrapType,\n isWrapUnwrapSwap,\n tokenInAddressInput,\n tokenInAmountInput,\n tokenOutAddressInput,\n tokenOutAmountInput,\n slippageBufferRate,\n isConfirming,\n submissionError,\n resetSubmissionError,\n swapGasless,\n toggleSwapGasless,\n isGaslessSwappingDisabled,\n isCowswapSupportedOnNetwork,\n resetAmounts,\n // methods\n getQuote,\n swap,\n handleAmountChange,\n };\n}\n","import { computed, Ref } from 'vue';\n\nimport { bnum } from '@/lib/utils';\nimport useWeb3 from '@/services/web3/useWeb3';\n\nimport { useTokens } from '@/providers/tokens.provider';\n\nexport enum SwapValidation {\n VALID,\n NO_ACCOUNT,\n EMPTY,\n NO_NATIVE_ASSET,\n NO_BALANCE,\n NO_LIQUIDITY,\n}\n\nexport default function useValidation(\n tokenInAddress: Ref,\n tokenInAmount: Ref,\n tokenOutAddress: Ref,\n tokenOutAmount: Ref\n) {\n const { isWalletReady } = useWeb3();\n const { balances } = useTokens();\n\n const noAmounts = computed(\n () =>\n !isValidTokenAmount(tokenInAmount.value) &&\n !isValidTokenAmount(tokenOutAmount.value)\n );\n\n const missingToken = computed(\n () => !tokenInAddress.value || !tokenOutAddress.value\n );\n\n const exceedsBalance = computed(\n () =>\n !balances.value[tokenInAddress.value] ||\n bnum(balances.value[tokenInAddress.value]).lt(tokenInAmount.value)\n );\n\n const validationStatus = computed(() => {\n if (noAmounts.value || missingToken.value) return SwapValidation.EMPTY;\n\n if (isWalletReady.value && exceedsBalance.value)\n return SwapValidation.NO_BALANCE;\n\n return SwapValidation.VALID;\n });\n\n function isValidTokenAmount(tokenAmount: string) {\n return bnum(tokenAmount).gt(0) && tokenAmount.trim() !== '';\n }\n\n const errorMessage = computed(() => validationStatus.value);\n\n return {\n validationStatus,\n errorMessage,\n isValidTokenAmount,\n };\n}\n","\n\n\n\n","\n\n\n","\n\n\n\n","\n\n\n","\n\n\n\n\n"],"names":["getPairPriceData","inputAsset","outputAsset","nativeAsset2","wrappedNativeAsset2","days","inverse","_inputAsset","_outputAsset","aggregateBy","getInputAssetData","coingeckoService","getOutputAssetData","inputAssetData","outputAssetData","calculatedPricing","mapValues","value","timestamp","calculatedPricingNoNulls","pickBy","formatTimestamps","mapKeys","_","format","fromUnixTime","toPairs","chartTimespans","upToLargeBreakpoint","useBreakpoints","t","useI18n","getToken","wrappedNativeAsset","nativeAsset","useTokens","tokenInAddress","tokenOutAddress","initialized","useSwapState","tailwind","useTailwind","userNetworkId","appNetworkConfig","useWeb3","chartHeight","ref","activeTimespan","inputSym","computed","_a","outputSym","isLoadingPriceData","priceData","failedToLoadPriceData","useQuery","QUERY_KEYS","reactive","equivalentTokenPairs","allChartValuesEqual","pair","chartData","chartBlankText","isNegativeTrend","_priceData","chartColors","color","chartGrid","lsGet","networkId","configService","setInputAsset","asset","lsSet","setOutputAsset","useSwapAssets","_hoisted_1","_hoisted_2","_createElementVNode","_sfc_render","_ctx","_cache","fNum","useNumbers","visible","toggleVisibility","input","symbol","props","output","routes","sorReturn","pools","swaps","addresses","addressIn","addressOut","getV2Routes","NATIVE_ASSET_ADDRESS","WRAPPED_NATIVE_ASSET_ADDRESS","getAddress","totalSwapAmount","total","rawHops","BigNumber","routes2","allHops","i","swap","rawPool","pool","tokenIn","AddressZero","tokenOut","isDirectSwap","hop","token","a","b","isSameAddress","_token","index","tokens","route","formatShare","share","FNumFormats","WrapType","WrapType2","getWrapAction","nativeAddress","wNativeAddress","stETH","wstETH","getWrapOutput","wrapper","wrapType","wrapAmount","convertStEthWrap","wrap","network","web3","amount","configs","wrapNative","wrapLido","e","unwrap","unwrapNative","unwrapLido","TransactionBuilder","PRICE_UPDATE_THRESHOLD","toFiat","balanceFor","blockNumber","account","startConnectWithInjectedProvider","slippage","useUserSettings","networkConfig","useNetwork","lastQuote","priceUpdated","priceUpdateAccepted","showSummaryInFiat","loadingApprovals","slippageRatePercent","tokenInFiatValue","tokenOutFiatValue","showSwapRoute","zeroFee","exceedsBalance","bnum","disableSubmitButton","summary","summaryItems","exactIn","tokenInAmountInput","tokenOutAmountInput","quote","formatUnits","itemValue","labels","isStETHSwap","isStETH","getTokenApprovalActions","useTokenApprovalActions","tokenApprovalActions","batchRelayerSignature","batchRelayerApprovalAction","useRelayerApproval","RelayerType","batchRelayerApproval","useRelayerApprovalTx","cowswapRelayerApproval","lidoRelayerApproval","requiresBatchRelayerApproval","requiresCowswapRelayerApproval","requiresLidoRelayerApproval","showBatchRelayerApprovalStep","showCowswapRelayerApprovalStep","showLidoRelayerApprovalStep","requiresApproval","showPriceUpdateError","actions","actions2","emit","onClose","cofirmPriceUpdate","handlePriceUpdate","newQuote","lastQuoteMin","newQuoteMin","bnumZero","priceDiff","lastQuoteMax","newQuoteMax","tokenApprovalSpender","watch","onBeforeMount","ApprovalAction","HIGH_FEE_THRESHOLD","parseFixed","APP_DATA","state","useCowswap","tokenInAddressInput","tokenOutAddressInput","tokenInAmountScaled","tokenOutAmountScaled","slippageBufferRate","transactionDeadline","useApp","getSigner","addTransaction","useTransactions","updatingQuotes","confirming","feeQuote","latestQuoteIdx","hasValidationError","getFeeAmount","feeAmountInToken","feeAmountOutToken","getQuote","maximumInAmount","ONE","minimumOutAmount","successCallback","unsignedOrder","calculateValidTo","OrderKind","OrderBalance","signature","signingScheme","signOrder","orderId","cowswapProtocolService","sellAmount","buyAmount","tokenInAmountEst","tokenOutAmountEst","validTo","partiallyFillable","trackGoal","Goals","error","msg","captureBalancerException","isUserError","resetState","shouldResetFees","handleAmountChange","amountToExchange","currentQuoteIdx","priceQuoteParams","priceQuote","OldBigNumber","ApiErrorCodes","toRefs","SWAP_COST","SorManager","provider","gasPrice","maxPools","__publicField","getBalancerSDK","tokenAddr","tokenDecimals","manualCost","cost","v2result","err","tokenInDecimals","tokenOutDecimals","swapType","amountScaled","v2TokenIn","v2TokenOut","timestampSeconds","swapOptions","PoolFilter","swapInfoV2","SwapTypes","LidoRelayerService","VaultService","LidoRelayer__factory","lidoRelayerService","SwapTokenType","SwapTokenType2","SwapService","config","walletService","walletServiceInstance","tokenAddresses","overrides","swapKind","SwapType","funds","single","limit","vaultService","limits","isStEthAddress","getWstETHByStETH","tokensIn","tokensOut","userAddress","swapToken","useSwapper","swapService","swapIn","tokenInAmount","tokenOutAmountMin","swapOut","tokenInAmountMax","tokenOutAmount","boostedJoinBatchSwap","amountsInMap","amountOutMin","address","boostedExitBatchSwap","amountIn","amountsOutMap","GAS_PRICE","MAX_POOLS","MIN_PRICE_IMPACT","HIGH_PRICE_IMPACT_THRESHOLD","calcPriceImpact","sellTokenAmount","sellTokenDecimals","buyTokenAmount","buyTokenDecimals","marketSp","sellTokenScaled","buyTokenScaled","SCALE","scalingFactor","effectivePrice","marketSpScaled","priceRatio","maxDecimalPlaces","priceRatioRounded","useSor","sorConfig","isCowswapSwap","sorManager","Zero","swapping","priceImpact","latestTxHash","poolsLoading","getWeb3Provider","useFathom","txListener","useEthers","injectTokens","priceFor","onMounted","unknownAssets","initSor","rpcProviderService","fetchPools","trackSwapEvent","isMainnet","updateSwapAmounts","result","deltas","getTokenDecimals","tokenInPosition","tokenOutPosition","mutateAmount","formatAmount","resetInputAmounts","inputAmountDecimals","overflowProtected","outputAmount","formatFixed","inputAmount","setSwapCost","tokenInAmountScaled2","parseUnits","swapReturn","priceImpactCalc","tokenOutAmountScaled2","txHandler","tx","action","tokenInAmountFormatted","tokenOutAmountFormatted","tokenInSymbol","tokenOutSymbol","swapUSDValue","handleSwapException","minAmount","getMinOut","sr","getMaxIn","calculateEthPriceInToken","tokenAddress","ethPriceFiat","tokenPriceFiat","sorManager2","isInputToken","tokenIn2","tokenOut2","useJoinExit","swapInfo","swapInfoLoading","relayerSignature","relayerApprovalQuery","useRelayerApprovalQuery","getSwapInfo","returnAmount","balancer","relayerCallData","buildRelayerCalls","_b","BatchRelayerAbi","swapGasless","LS_KEYS","useSwapping","isWrap","isUnwrap","isNativeAssetSwap","requiresTokenApproval","effectivePriceMessage","_c","_d","isCowswapSupportedOnNetwork","COW_SUPPORTED_NETWORKS","swapRoute","joinExit","canUseJoinExit","someJoinExit","sor","isBalancerSwap","isJoinExitSwap","isWrapUnwrapSwap","isGaslessSwappingDisabled","hasSwapQuote","cowswap","isLoading","isConfirming","submissionError","resetSubmissionError","setSwapGasless","flag","toggleSwapGasless","resetAmounts","useValidation","isWalletReady","balances","noAmounts","isValidTokenAmount","missingToken","validationStatus","tokenAmount","errorMessage","_sfc_main$4","defineComponent","_props","isRotated","toggle","_withScopeId","n","_pushScopeId","_popScopeId","veBalTokenInfo","useVeBal","_tokenInAmount","_tokenInAddress","_tokenOutAmount","_tokenOutAddress","isInRate","typingTimeout","missingAmount","rateLabel","rate","inSymbol","outSymbol","preventUpdatesOnTyping","callback","handleInAmountChange","handleOutAmountChange","handleTokenSwitch","handleInputTokenChange","newTokenIn","handleOutputTokenChange","newTokenOut","watchEffect","_sfc_main$2","SwapPair","SwapPreviewModal","SwapRoute","SwapSettingsPopover","router","useRouter","bp","isMismatchedNetwork","setTokenInAddress","setTokenOutAddress","setTokenInAmount","setTokenOutAmount","setInitialized","modalSwapPreviewIsOpen","dismissedErrors","alwaysShowRoutes","swapCardShadow","isHighPriceImpact","swapDisabled","hasMismatchedNetwork","hasAmountsError","hasCowswapErrors","hasBalancerErrors","title","validationError","warning","handleErrorButtonClick","isNativeAssetIdentifier","assetParam","getFirstValidAddress","assets","isAddress","populateInitialTokens","assetIn","assetOut","assetInAmount","assetOutAmount","handlePreviewButton","handlePreviewModalClose","TOKENS","SwapSettingsContext","isRequired","_openBlock","_createElementBlock","_Fragment","_createVNode","_component_BalCard","_withCtx","_toDisplayString","_component_SwapSettingsPopover","_component_SwapPair","$event","_createBlock","_component_BalAlert","_component_BalBtn","_withModifiers","_Transition","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_10","_component_BalTooltip","_component_BalToggle","_hoisted_12","_hoisted_13","_component_BalIcon","_createCommentVNode","_component_SwapRoute","_Teleport","_component_SwapPreviewModal","bridgeUrl","label","provideUserTokens","setSelectedTokens","usePoolFilters","sections","sections2","hasBridge"],"mappings":"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"}