```\nFile: CurveAdapter.sol\n    function _exactInSingle(Trade memory trade)\n        internal view returns (address target, bytes memory executionCallData)\n    {\n        address sellToken = _getTokenAddress(trade.sellToken);\n        address buyToken = _getTokenAddress(trade.buyToken);\n        ICurvePool pool = ICurvePool(Deployments.CURVE_REGISTRY.find_pool_for_coins(sellToken, buyToken));\n\n        if (address(pool) == address(0)) revert InvalidTrade();\n\n        int128 i = -1;\n        int128 j = -1;\n        for (int128 c = 0; c < MAX_TOKENS; c++) {\n            address coin = pool.coins(uint256(int256(c)));\n            if (coin == sellToken) i = c;\n            if (coin == buyToken) j = c;\n            if (i > -1 && j > -1) break;\n        }\n\n        if (i == -1 || j == -1) revert InvalidTrade();\n\n        return (\n            address(pool),\n            abi.encodeWithSelector(\n                ICurvePool.exchange.selector,\n                i,\n                j,\n                trade.amount,\n                trade.limit\n            )\n        );\n    }\n```\n