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))); } }