export * from './typechain'; export * from './config'; export * from './OpenSwapClient'; // export async function bathRun( // fn: (list: U[]) => Promise, // list: U[], // max: number // ): Promise { // const promiseList: Promise[] = []; // for (let start = 0; start < list.length; start += max) { // promiseList.push(fn(list.slice(start, Math.min(start + max, list.length)))); // } // return await Promise.all(promiseList); // } // export async function getPathsSwapAmountOuts( // multicall4: Multicall4, // pathSwap: PathSwap, // from: string, // paths: PathSwap.PoolStruct[][], // isFeeTokenIn: boolean, // amountIn: bigint, // to: string, // multicallGasLimit: bigint, // blockNumber?: number // ) { // return ( // await multicall4.tryAggregate.staticCall( // false, // multicallGasLimit, // paths.map((path) => { // return { // target: pathSwap.target, // callData: pathSwap.interface.encodeFunctionData('trySwap', [ // from, // path, // isFeeTokenIn, // amountIn, // to, // ]), // }; // }), // { // blockTag: blockNumber ?? 'latest', // } // ) // ) // .map((pathData, i) => { // if (!pathData.success) { // return null; // } // const [amountOut, gasUsed] = pathSwap.interface.decodeFunctionResult( // 'trySwap', // pathData.returnData // ) as bigint[]; // if (amountOut == 0n) { // return null; // } // return { // amountOut, // gasUsed, // path: paths[i], // }; // }) // .filter((pathData) => pathData != null) // .sort((a, b) => Number(b.amountOut - a.amountOut)); // } // export async function getPathsSwapMaxAmountOutTransaction( // multicall4: Multicall4, // pathSwap: PathSwap, // from: string, // paths: PathSwap.PoolStruct[][], // isFeeTokenIn: boolean, // amountIn: bigint, // to: string, // gasPrice: bigint, // multicallGasLimit: bigint, // _multicallMax?: number // ) { // const gasLeft = await multicall4!.getGasLeft(); // let multicallMax = Number((gasLeft * 4n) / multicallGasLimit / 5n); // if (_multicallMax && _multicallMax < multicallMax) { // multicallMax = _multicallMax; // } // if (multicallMax == 0) { // multicallMax = 1; // } // const pathDatas: { path: PathSwap.PoolStruct[]; amountOut: bigint; gasUsed: bigint }[] = []; // pathDatas.push( // ...( // await bathRun( // (_paths) => // getPathsSwapAmountOuts( // multicall4, // pathSwap, // from, // _paths, // isFeeTokenIn, // amountIn, // to, // multicallGasLimit // ), // paths, // multicallMax // ) // ).flat() // ); // const { amountOut, path } = pathDatas.sort((a, b) => Number(b.amountOut - a.amountOut))[0]; // const gasLimit = // ((await pathSwap.swap.estimateGas(from, path, isFeeTokenIn, amountIn, amountOut, to, { // from, // })) * // 11n) / // 10n; // return { // transaction: await pathSwap.swap.populateTransaction( // from, // path, // isFeeTokenIn, // amountIn, // amountOut, // to, // { // gasLimit, // gasPrice, // } // ), // amountOut, // gasLimit, // path, // }; // } // export async function getPathsAmountOuts( // multicall4: Multicall4, // pathSwap: PathSwap, // paths: PathSwap.PoolStruct[][], // amountIn: bigint, // multicallGasLimit: bigint // ) { // return ( // await multicall4.tryAggregate.staticCall( // false, // multicallGasLimit, // paths.map((path) => { // return { // target: pathSwap.target, // callData: pathSwap.interface.encodeFunctionData('quoterAmountOut', [path, amountIn]), // }; // }) // ) // ) // .map((data, i) => { // if (!data.success) { // return null; // } // const amountOut = BigInt(data.returnData); // if (amountOut == 0n) { // return null; // } // return { // amountOut, // path: paths[i], // }; // }) // .filter((data) => data != null) // .sort((a, b) => Number(b.amountOut - a.amountOut)); // }