```\n    function externalSwap(\n        address fromToken,\n        address toToken,\n        address approveTarget,\n        address swapTarget,\n        uint256 fromTokenAmount,\n        uint256 minReturnAmount,\n        bytes memory feeData,\n        bytes memory callDataConcat,\n        uint256 deadLine\n    ) external payable judgeExpired(deadLine) returns (uint256 receiveAmount) {      \n        require(isWhiteListedContract[swapTarget], "DODORouteProxy: Not Whitelist Contract");  \n        require(isApproveWhiteListedContract[approveTarget], "DODORouteProxy: Not Whitelist Appprove Contract");  \n\n        // transfer in fromToken\n        if (fromToken != _ETH_ADDRESS_) {\n            // approve if needed\n            if (approveTarget != address(0)) {\n                IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount);\n            }\n\n            IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(\n                fromToken,\n                msg.sender,\n                address(this),\n                fromTokenAmount\n            );\n        }\n\n        // swap\n        uint256 toTokenOriginBalance;\n        if(toToken != _ETH_ADDRESS_) {\n            toTokenOriginBalance = IERC20(toToken).universalBalanceOf(address(this));\n        } else {\n            toTokenOriginBalance = IERC20(_WETH_).universalBalanceOf(address(this));\n        }\n```\n