UNPKG

@swapnet-xyz/sdk

Version:
125 lines (124 loc) 4.6 kB
import { solidityPacked } from "ethers"; import { LiquiditySourceUname } from "../common/unames.js"; import { CommandType, ROUTER_AS_RECIPIENT, UniswapV2ForkNames, UniswapV3ForkNames } from "../routers/universalRouter/routerCommands.js"; const buildForUniswapV2Like = (v2ForkName)=>{ return function(fromTokenAddress, toTokenAddress, amountIn, liquidityInfo, planner) { let path = [ fromTokenAddress, toTokenAddress ]; if (liquidityInfo.source === LiquiditySourceUname.RingswapV2) { const { fromFewWrappedTokenAddress, toFewWrappedTokenAddress } = liquidityInfo; path = [ fromFewWrappedTokenAddress, toFewWrappedTokenAddress ]; planner.addCommand(CommandType.WRAP_UNWRAP_FEW_TOKEN, [ fromTokenAddress, ROUTER_AS_RECIPIENT, amountIn, true ]); } planner.addCommand(CommandType.V2_SWAP_EXACT_IN, [ ROUTER_AS_RECIPIENT, amountIn, 0n, path, false, v2ForkName ]); if (liquidityInfo.source === LiquiditySourceUname.RingswapV2) { const { toFewWrappedTokenAddress } = liquidityInfo; planner.addCommand(CommandType.WRAP_UNWRAP_FEW_TOKEN, [ toFewWrappedTokenAddress, ROUTER_AS_RECIPIENT, 0n, false ]); } }; }; const encodeV3RouteToPath = (inputTokenAddress, outputTokenAddress, feeAmount)=>{ const types = [ 'address', 'uint24', 'address' ]; const path = [ inputTokenAddress, feeAmount, outputTokenAddress ]; return solidityPacked(types, path); }; const buildForUniswapV3Like = (v3ForkName)=>{ return function(fromTokenAddress, toTokenAddress, amountIn, liquidityInfo, planner) { let path; // if (liquidityInfo.source === LiquiditySourceUname.RingswapV3) { // const fewWrappedFromToken = getFewWrappedTokenAddress(fromTokenAddress); // const fewWrappedToToken = getFewWrappedTokenAddress(toTokenAddress); // path = encodeV3RouteToPath(fewWrappedFromToken, fewWrappedToToken, Number((liquidityInfo as UniswapV3Info).fee)); // planner.addCommand(CommandType.WRAP_UNWRAP_FEW_TOKEN, [ // fromTokenAddress, // ROUTER_AS_RECIPIENT, // amountIn, // true, // ]); // } // else { path = encodeV3RouteToPath(fromTokenAddress, toTokenAddress, Number(liquidityInfo.fee)); // } planner.addCommand(CommandType.V3_SWAP_EXACT_IN, [ ROUTER_AS_RECIPIENT, amountIn, 0n, path, false, v3ForkName ]); // if (liquidityInfo.source === LiquiditySourceUname.RingswapV3) { // const fewWrappedToToken = getFewWrappedTokenAddress(toTokenAddress); // planner.addCommand(CommandType.WRAP_UNWRAP_FEW_TOKEN, [ // fewWrappedToToken, // ROUTER_AS_RECIPIENT, // 0n, // minAmountOut // false, // ]); // } }; }; export const universalRouterPluginByLiquiditySourceUname = { [LiquiditySourceUname.UniswapV2]: { addToPlanner: buildForUniswapV2Like(UniswapV2ForkNames.Uniswap) }, [LiquiditySourceUname.ThrusterV2_3k]: { addToPlanner: buildForUniswapV2Like(UniswapV2ForkNames.Thruster3k) }, [LiquiditySourceUname.ThrusterV2_10k]: { addToPlanner: buildForUniswapV2Like(UniswapV2ForkNames.Thruster10k) }, [LiquiditySourceUname.RingswapV2]: { addToPlanner: buildForUniswapV2Like(UniswapV2ForkNames.Ringswap) }, [LiquiditySourceUname.UniswapV3]: { addToPlanner: buildForUniswapV3Like(UniswapV3ForkNames.Uniswap) }, [LiquiditySourceUname.ThrusterV3]: { addToPlanner: buildForUniswapV3Like(UniswapV3ForkNames.Thruster) }, // [LiquiditySourceUname.RingswapV3]: { // addToPlanner: buildForUniswapV3Like(UniswapV3ForkNames.Ringswap), // }, [LiquiditySourceUname.CurveV1]: { addToPlanner: (fromTokenAddress, toTokenAddress, amountIn, liquidityInfo, planner)=>{ planner.addCommand(CommandType.CURVE_V1, [ liquidityInfo.address, fromTokenAddress, toTokenAddress, amountIn, 0n ]); } } };