@uniswap/v4-sdk
Version:
⚒️ An SDK for building applications on top of Uniswap V4
193 lines • 7.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.V4BaseActionsParser = void 0;
const ethers_1 = require("ethers");
const v4Planner_1 = require("./v4Planner");
// Parses V4Router actions
class V4BaseActionsParser {
static parseCalldata(calldata, urVersion = v4Planner_1.URVersion.V2_0) {
const [actions, inputs] = ethers_1.ethers.utils.defaultAbiCoder.decode(['bytes', 'bytes[]'], calldata);
const actionTypes = V4BaseActionsParser.getActions(actions);
return {
actions: actionTypes.map((actionType, i) => {
// Use V2.1.1 ABI for swap actions if V2.1.1, otherwise use base ABI (V2.0)
const abiDef = (0, v4Planner_1.isAtLeastV2_1_1)(urVersion) && actionType in v4Planner_1.V4_SWAP_ACTIONS_V2_1_1
? v4Planner_1.V4_SWAP_ACTIONS_V2_1_1[actionType]
: v4Planner_1.V4_BASE_ACTIONS_ABI_DEFINITION[actionType];
const rawParams = ethers_1.ethers.utils.defaultAbiCoder.decode(abiDef.map((command) => command.type), inputs[i]);
const params = rawParams.map((param, j) => {
switch (abiDef[j].subparser) {
case v4Planner_1.Subparser.V4SwapExactInSingle:
return {
name: abiDef[j].name,
value: parseV4ExactInSingle(param, urVersion),
};
case v4Planner_1.Subparser.V4SwapExactIn:
return {
name: abiDef[j].name,
value: parseV4ExactIn(param, urVersion),
};
case v4Planner_1.Subparser.V4SwapExactOutSingle:
return {
name: abiDef[j].name,
value: parseV4ExactOutSingle(param, urVersion),
};
case v4Planner_1.Subparser.V4SwapExactOut:
return {
name: abiDef[j].name,
value: parseV4ExactOut(param, urVersion),
};
case v4Planner_1.Subparser.PoolKey:
return {
name: abiDef[j].name,
value: parsePoolKey(param),
};
default:
return {
name: abiDef[j].name,
value: param,
};
}
});
return {
actionName: v4Planner_1.Actions[actionType],
actionType,
params,
};
}),
};
}
// parse command types from bytes string
static getActions(actions) {
const actionTypes = [];
for (let i = 2; i < actions.length; i += 2) {
const byte = actions.substring(i, i + 2);
actionTypes.push(parseInt(byte, 16));
}
return actionTypes;
}
}
exports.V4BaseActionsParser = V4BaseActionsParser;
function parsePoolKey(data) {
const [currency0, currency1, fee, tickSpacing, hooks] = data;
return {
currency0,
currency1,
fee: parseInt(fee),
tickSpacing: parseInt(tickSpacing),
hooks,
};
}
function parsePathKey(data) {
const [intermediateCurrency, fee, tickSpacing, hooks, hookData] = data;
return {
intermediateCurrency,
fee: parseInt(fee),
tickSpacing: parseInt(tickSpacing),
hooks,
hookData,
};
}
function parseV4ExactInSingle(data, urVersion) {
const [currency0, currency1, fee, tickSpacing, hooks] = data[0];
const poolKey = { currency0, currency1, fee, tickSpacing, hooks };
if (urVersion === v4Planner_1.URVersion.V2_0) {
// V2.0: [poolKey, zeroForOne, amountIn, amountOutMinimum, hookData]
const [, zeroForOne, amountIn, amountOutMinimum, hookData] = data;
return {
poolKey,
zeroForOne,
amountIn,
amountOutMinimum,
hookData,
};
}
else {
// V2.1.1: [poolKey, zeroForOne, amountIn, amountOutMinimum, minHopPriceX36, hookData]
const [, zeroForOne, amountIn, amountOutMinimum, minHopPriceX36, hookData] = data;
return {
poolKey,
zeroForOne,
amountIn,
amountOutMinimum,
minHopPriceX36,
hookData,
};
}
}
function parseV4ExactIn(data, urVersion) {
const paths = data[1].map((pathKey) => parsePathKey(pathKey));
if (urVersion === v4Planner_1.URVersion.V2_0) {
// V2.0: [currencyIn, path, amountIn, amountOutMinimum]
const [currencyIn, , amountIn, amountOutMinimum] = data;
return {
currencyIn,
path: paths,
amountIn,
amountOutMinimum,
};
}
else {
// V2.1.1: [currencyIn, path, minHopPriceX36, amountIn, amountOutMinimum]
const [currencyIn, , minHopPriceX36, amountIn, amountOutMinimum] = data;
return {
currencyIn,
path: paths,
minHopPriceX36,
amountIn,
amountOutMinimum,
};
}
}
function parseV4ExactOutSingle(data, urVersion) {
const [currency0, currency1, fee, tickSpacing, hooks] = data[0];
const poolKey = { currency0, currency1, fee, tickSpacing, hooks };
if (urVersion === v4Planner_1.URVersion.V2_0) {
// V2.0: [poolKey, zeroForOne, amountOut, amountInMaximum, hookData]
const [, zeroForOne, amountOut, amountInMaximum, hookData] = data;
return {
poolKey,
zeroForOne,
amountOut,
amountInMaximum,
hookData,
};
}
else {
// V2.1.1: [poolKey, zeroForOne, amountOut, amountInMaximum, minHopPriceX36, hookData]
const [, zeroForOne, amountOut, amountInMaximum, minHopPriceX36, hookData] = data;
return {
poolKey,
zeroForOne,
amountOut,
amountInMaximum,
minHopPriceX36,
hookData,
};
}
}
function parseV4ExactOut(data, urVersion) {
const paths = data[1].map((pathKey) => parsePathKey(pathKey));
if (urVersion === v4Planner_1.URVersion.V2_0) {
// V2.0: [currencyOut, path, amountOut, amountInMaximum]
const [currencyOut, , amountOut, amountInMaximum] = data;
return {
currencyOut,
path: paths,
amountOut,
amountInMaximum,
};
}
else {
// V2.1.1: [currencyOut, path, minHopPriceX36, amountOut, amountInMaximum]
const [currencyOut, , minHopPriceX36, amountOut, amountInMaximum] = data;
return {
currencyOut,
path: paths,
minHopPriceX36,
amountOut,
amountInMaximum,
};
}
}
//# sourceMappingURL=v4BaseActionsParser.js.map