@swapnet-xyz/sdk
Version:
TypeScript SDK for SwapNet API.
125 lines (124 loc) • 4.6 kB
JavaScript
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
]);
}
}
};