From 606b779c5e1b6ae46fe358a5041ab9cdc26cc773 Mon Sep 17 00:00:00 2001 From: fuzious Date: Tue, 11 Apr 2023 03:33:18 +0530 Subject: [PATCH 1/2] feat: calldata added --- src/router.ts | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/router.ts b/src/router.ts index ff67428d..90cb4ac9 100644 --- a/src/router.ts +++ b/src/router.ts @@ -622,11 +622,12 @@ export const swapEstimateGas = async (inputCoin: string, outputCoin: string, amo return gas } -export const swap = async (inputCoin: string, outputCoin: string, amount: number | string, slippage = 0.5): Promise => { +export const swap = async (inputCoin: string, outputCoin: string, amount: number | string, slippage = 0.5, retrieveCallDataOnly?: boolean): Promise => { const [inputCoinAddress, outputCoinAddress] = _getCoinAddresses(inputCoin, outputCoin); const [inputCoinDecimals, outputCoinDecimals] = _getCoinDecimals(inputCoinAddress, outputCoinAddress); - - await swapApprove(inputCoin, amount); + if (!retrieveCallDataOnly) { + await swapApprove(inputCoin, amount); + } const { route, output } = await getBestRouteAndOutput(inputCoinAddress, outputCoinAddress, amount); if (route.length === 0) { @@ -640,19 +641,29 @@ export const swap = async (inputCoin: string, outputCoin: string, amount: number const contract = curve.contracts[curve.constants.ALIASES.registry_exchange].contract; const value = isEth(inputCoinAddress) ? _amount : ethers.BigNumber.from(0); + if (!retrieveCallDataOnly) { + await curve.updateFeeData(); + const gasLimit = (await contract.estimateGas.exchange_multiple( + _route, + _swapParams, + _amount, + _minRecvAmount, + _factorySwapAddresses, + { ...curve.constantOptions, value } + )).mul(curve.chainId === 1 ? 130 : 160).div(100); + return await contract.exchange_multiple(_route, _swapParams, _amount, _minRecvAmount, _factorySwapAddresses, { ...curve.options, value, gasLimit }) + } else { + let calldata = contract.interface.encodeFunctionData("exchange_multiple", [_route, _swapParams, _amount, _minRecvAmount, _factorySwapAddresses]) + return { + route: route, + actualQuote: fromBN(BN(output), outputCoinDecimals).toString(), + minReturnAmount: _minRecvAmount.toString(), + targetDex: contract.address, + calldata: calldata + } - await curve.updateFeeData(); - const gasLimit = (await contract.estimateGas.exchange_multiple( - _route, - _swapParams, - _amount, - _minRecvAmount, - _factorySwapAddresses, - { ...curve.constantOptions, value } - )).mul(curve.chainId === 1 ? 130 : 160).div(100); - return await contract.exchange_multiple(_route, _swapParams, _amount, _minRecvAmount, _factorySwapAddresses, { ...curve.options, value, gasLimit }) + } } - export const getSwappedAmount = async (tx: ethers.ContractTransaction, outputCoin: string): Promise => { const [outputCoinAddress] = _getCoinAddresses(outputCoin); const [outputCoinDecimals] = _getCoinDecimals(outputCoinAddress); From 32075ad5f98517aeca7feb6f0df5da9977920e8e Mon Sep 17 00:00:00 2001 From: fuzious Date: Tue, 11 Apr 2023 04:04:41 +0530 Subject: [PATCH 2/2] type fix --- src/interfaces.ts | 2 ++ src/router.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/interfaces.ts b/src/interfaces.ts index a5e007c3..c792aeec 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -157,3 +157,5 @@ export interface IProfit { symbol: string, price: number, } + +export interface ICalldata { route: IRoute, actualQuote: string, minReturnAmount: string, targetDex: string, calldata: string } \ No newline at end of file diff --git a/src/router.ts b/src/router.ts index 90cb4ac9..d057c043 100644 --- a/src/router.ts +++ b/src/router.ts @@ -3,7 +3,7 @@ import memoize from "memoizee"; import BigNumber from "bignumber.js"; import { ethers } from "ethers"; import { curve } from "./curve"; -import { IDict, IRoute, IRouteTvl, IRouteOutputAndCost, IPoolData } from "./interfaces"; +import { IDict, IRoute, IRouteTvl, IRouteOutputAndCost, IPoolData, ICalldata } from "./interfaces"; import { _getCoinAddresses, _getCoinDecimals, @@ -622,7 +622,7 @@ export const swapEstimateGas = async (inputCoin: string, outputCoin: string, amo return gas } -export const swap = async (inputCoin: string, outputCoin: string, amount: number | string, slippage = 0.5, retrieveCallDataOnly?: boolean): Promise => { +export const swap = async (inputCoin: string, outputCoin: string, amount: number | string, slippage = 0.5, retrieveCallDataOnly?: boolean): Promise => { const [inputCoinAddress, outputCoinAddress] = _getCoinAddresses(inputCoin, outputCoin); const [inputCoinDecimals, outputCoinDecimals] = _getCoinDecimals(inputCoinAddress, outputCoinAddress); if (!retrieveCallDataOnly) {