```\nFile: CurveV2Adapter.sol\n    function getExecutionData(address from, Trade calldata trade)\n        internal view returns (\n            address spender,\n            address target,\n            uint256 msgValue,\n            bytes memory executionCallData\n        )\n    {\n        if (trade.tradeType == TradeType.EXACT_IN_SINGLE) {\n            CurveV2SingleData memory data = abi.decode(trade.exchangeData, (CurveV2SingleData));\n            executionCallData = abi.encodeWithSelector(\n                ICurveRouterV2.exchange.selector,\n                data.pool,\n                _getTokenAddress(trade.sellToken),\n                _getTokenAddress(trade.buyToken),\n                trade.amount,\n                trade.limit,\n                address(this)\n            );\n        } else if (trade.tradeType == TradeType.EXACT_IN_BATCH) {\n            CurveV2BatchData memory data = abi.decode(trade.exchangeData, (CurveV2BatchData));\n            // Array of pools for swaps via zap contracts. This parameter is only needed for\n            // Polygon meta-factories underlying swaps.\n            address[4] memory pools;\n            executionCallData = abi.encodeWithSelector(\n                ICurveRouterV2.exchange_multiple.selector,\n                data.route,\n                data.swapParams,\n                trade.amount,\n                trade.limit,\n                pools,\n                address(this)\n            );\n```\n