public async Task <IActionResult> Execute([FromBody] ExchangeModel request)
        {
            try
            {
                ExchangeResult exchangeResult =
                    await _exchangeService.ExecuteAsync(Mapper.Map <ExchangeCommand>(request));

                return(Ok(Mapper.Map <ExchangeResponse>(exchangeResult)));
            }
            catch (AssetNetworkNotDefinedException e)
            {
                _log.ErrorWithDetails(e, new { e.AssetId });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (ExchangeOperationNotSupportedException e)
            {
                _log.ErrorWithDetails(e, request);

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (InvalidOperationException e)
            {
                _log.ErrorWithDetails(e, request);

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (AssetPairUnknownException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.BaseAssetId,
                    e.QuotingAssetId
                });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (InsufficientFundsException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.WalletAddress,
                    e.AssetId
                });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (ExchangeOperationFailedException e)
            {
                _log.ErrorWithDetails(e, new { errors = e.TransferErrors });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (ExchangeRateChangedException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.CurrentRate,
                    request.ExpectedRate
                });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (MultipleDefaultMerchantWalletsException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.AssetId,
                    e.MerchantId,
                    e.PaymentDirection
                });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
            catch (DefaultMerchantWalletNotFoundException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.AssetId,
                    e.MerchantId,
                    e.PaymentDirection
                });

                return(BadRequest(ErrorResponse.Create(e.MerchantId)));
            }
            catch (MerchantWalletOwnershipException e)
            {
                _log.ErrorWithDetails(e, new
                {
                    e.MerchantId,
                    e.WalletAddress
                });

                return(BadRequest(ErrorResponse.Create(e.Message)));
            }
        }