From b1ce90eee8c15a6c8953f811793e6ee3d9b366f4 Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Mon, 27 Apr 2026 18:09:29 +0000 Subject: [PATCH 1/6] backend: convert moonpay buy info handler --- backend/handlers/handlers.go | 22 ++-- frontends/web/src/api/market.ts | 4 + .../web/src/routes/market/moonpay.test.tsx | 110 ++++++++++++++++++ frontends/web/src/routes/market/moonpay.tsx | 10 +- 4 files changed, 135 insertions(+), 11 deletions(-) create mode 100644 frontends/web/src/routes/market/moonpay.test.tsx diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index 3da4d5877a..29818aad93 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -248,7 +248,7 @@ func NewHandlers( getAPIRouterNoError(apiRouter)("/market/btcdirect/info/{action}/{code}", handlers.getMarketBtcDirectInfo).Methods("GET") getAPIRouterNoError(apiRouter)("/swap/quote", handlers.postSwapkitQuote).Methods("POST") getAPIRouterNoError(apiRouter)("/swap/sign", handlers.postSwapSign).Methods("POST") - getAPIRouter(apiRouter)("/market/moonpay/buy-info/{code}", handlers.getMarketMoonpayBuyInfo).Methods("GET") + getAPIRouterNoError(apiRouter)("/market/moonpay/buy-info/{code}", handlers.getMarketMoonpayBuyInfo).Methods("GET") getAPIRouterNoError(apiRouter)("/market/pocket/api-url/{action}", handlers.getMarketPocketURL).Methods("GET") getAPIRouterNoError(apiRouter)("/market/pocket/verify-address", handlers.postPocketWidgetVerifyAddress).Methods("POST") getAPIRouterNoError(apiRouter)("/market/bitrefill/info/{action}/{code}", handlers.getMarketBitrefillInfo).Methods("GET") @@ -1452,10 +1452,17 @@ func (handlers *Handlers) getMarketVendors(r *http.Request) interface{} { return supported } -func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) (interface{}, error) { +func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) interface{} { + type result struct { + Success bool `json:"success"` + ErrorMessage string `json:"errorMessage,omitempty"` + URL string `json:"url,omitempty"` + Address string `json:"address,omitempty"` + } + acct, err := handlers.backend.GetAccountFromCode(accountsTypes.Code(mux.Vars(r)["code"])) if err != nil { - return nil, err + return result{Success: false, ErrorMessage: err.Error()} } lang := handlers.backend.Config().AppConfig().Backend.UserLanguage @@ -1470,16 +1477,13 @@ func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) (interface{}, } buy, err := market.MoonpayInfo(acct, params) if err != nil { - return nil, err + return result{Success: false, ErrorMessage: err.Error()} } - resp := struct { - URL string `json:"url"` - Address string `json:"address"` - }{ + return result{ + Success: true, URL: buy.URL, Address: buy.Address, } - return resp, nil } func (handlers *Handlers) getMarketBtcDirectInfo(r *http.Request) interface{} { diff --git a/frontends/web/src/api/market.ts b/frontends/web/src/api/market.ts index 96831b2e70..9f431b2c72 100644 --- a/frontends/web/src/api/market.ts +++ b/frontends/web/src/api/market.ts @@ -48,8 +48,12 @@ export const getMarketDeals = ( }; export type MoonpayBuyInfo = { + success: true; url: string; address: string; +} | { + success: false; + errorMessage?: string; }; export const getMoonpayBuyInfo = (code: AccountCode) => { diff --git a/frontends/web/src/routes/market/moonpay.test.tsx b/frontends/web/src/routes/market/moonpay.test.tsx new file mode 100644 index 0000000000..284af6c677 --- /dev/null +++ b/frontends/web/src/routes/market/moonpay.test.tsx @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: Apache-2.0 + +import '../../../__mocks__/i18n'; +import type { ReactNode } from 'react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +vi.mock('@/components/layout', () => ({ + Header: ({ title }: { title: ReactNode }) =>
{title}
, +})); +vi.mock('@/components/spinner/Spinner', () => ({ + Spinner: ({ text }: { text?: string }) =>
{text}
, +})); +vi.mock('@/hooks/backbutton', () => ({ + UseDisableBackButton: () => null, +})); +vi.mock('@/hooks/darkmode', () => ({ + useDarkmode: () => ({ isDarkMode: false, toggleDarkmode: vi.fn() }), +})); +vi.mock('@/hooks/vendor-iframe', () => ({ + useVendorIframeResizeHeight: () => ({ + containerRef: { current: null }, + height: 480, + iframeLoaded: false, + onIframeLoad: vi.fn(), + }), + useVendorTerms: () => ({ + agreedTerms: true, + setAgreedTerms: vi.fn(), + }), +})); +vi.mock('./guide', () => ({ + MarketGuide: () => null, +})); +vi.mock('@/api/market', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getMoonpayBuyInfo: vi.fn(), + }; +}); +vi.mock('@/utils/config', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getConfig: vi.fn(), + }; +}); + +import { render, screen } from '@testing-library/react'; +import type { TAccount } from '@/api/account'; +import * as marketApi from '@/api/market'; +import * as config from '@/utils/config'; +import { Moonpay } from './moonpay'; + +const account: TAccount = { + keystore: { + connected: true, + lastConnected: '', + name: 'BitBox02', + rootFingerprint: 'f23ab988', + watchonly: false, + }, + active: true, + blockExplorerTxPrefix: '', + code: 'btc-account', + coinCode: 'btc', + coinName: 'Bitcoin', + coinUnit: 'BTC', + isToken: false, + name: 'Bitcoin Account', +}; + +describe('routes/market/moonpay', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(config.getConfig).mockResolvedValue({ + frontend: { + skipMoonpayDisclaimer: true, + }, + }); + }); + + it('renders the MoonPay iframe on success', async () => { + vi.mocked(marketApi.getMoonpayBuyInfo).mockReturnValue(() => Promise.resolve({ + success: true, + url: 'https://buy.moonpay.com?walletAddress=bc1qexample', + address: 'bc1qexample', + })); + + render(); + + const iframe = await screen.findByTitle('Moonpay'); + expect(iframe).toHaveAttribute( + 'src', + 'https://buy.moonpay.com?walletAddress=bc1qexample&colorCode=%235E94BF&theme=light', + ); + }); + + it('renders an error message on failure', async () => { + vi.mocked(marketApi.getMoonpayBuyInfo).mockReturnValue(() => Promise.resolve({ + success: false, + errorMessage: 'Account is not valid.', + })); + + render(); + + expect(await screen.findByText('Account is not valid.')).toBeInTheDocument(); + expect(screen.queryByTitle('Moonpay')).not.toBeInTheDocument(); + }); +}); diff --git a/frontends/web/src/routes/market/moonpay.tsx b/frontends/web/src/routes/market/moonpay.tsx index fb22077083..e617e712f5 100644 --- a/frontends/web/src/routes/market/moonpay.tsx +++ b/frontends/web/src/routes/market/moonpay.tsx @@ -9,6 +9,7 @@ import { getConfig } from '@/utils/config'; import { getMoonpayBuyInfo } from '@/api/market'; import { MarketGuide } from './guide'; import { Header } from '@/components/layout'; +import { Message } from '@/components/message/message'; import { Spinner } from '@/components/spinner/Spinner'; import { findAccount, isBitcoinOnly } from '@/routes/account/utils'; import { MoonpayTerms } from '@/components/terms/moonpay-terms'; @@ -58,8 +59,8 @@ export const Moonpay = ({ accounts, code }: TProps) => { ) : (
- {!iframeLoaded && } - { moonpay && ( + {(!moonpay || (moonpay.success && !iframeLoaded)) && } + { moonpay?.success && ( )} + { moonpay?.success === false && ( + + {moonpay.errorMessage || t('genericError')} + + )}
)} From 1e4aef306e357a086ddcba70c0b2037b7373d525 Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Mon, 27 Apr 2026 18:11:36 +0000 Subject: [PATCH 2/6] backend: convert balance summary handler --- backend/handlers/handlers.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index 29818aad93..1076905171 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -220,7 +220,7 @@ func NewHandlers( getAPIRouterNoError(apiRouter)("/accounts", handlers.getAccounts).Methods("GET") getAPIRouterNoError(apiRouter)("/swap/accounts", handlers.getSwapAccounts).Methods("GET") getAPIRouterNoError(apiRouter)("/swap/status", handlers.getSwapStatus).Methods("GET") - getAPIRouter(apiRouter)("/accounts/balance-summary", handlers.getAccountsBalanceSummary).Methods("GET") + getAPIRouterNoError(apiRouter)("/accounts/balance-summary", handlers.getAccountsBalanceSummary).Methods("GET") getAPIRouterNoError(apiRouter)("/set-account-active", handlers.postSetAccountActive).Methods("POST") getAPIRouterNoError(apiRouter)("/set-token-active", handlers.postSetTokenActive).Methods("POST") getAPIRouterNoError(apiRouter)("/set-account-receive-script-type", handlers.postSetAccountReceiveScriptType).Methods("POST") @@ -870,7 +870,7 @@ func (handlers *Handlers) postBtcFormatUnit(r *http.Request) interface{} { } // getAccountsBalanceSummary returns the total balance summary of all coins and accounts. -func (handlers *Handlers) getAccountsBalanceSummary(*http.Request) (interface{}, error) { +func (handlers *Handlers) getAccountsBalanceSummary(*http.Request) interface{} { type response struct { Success bool `json:"success"` TotalBalance *backend.AccountsBalanceSummary `json:"accountsBalanceSummary"` @@ -878,9 +878,9 @@ func (handlers *Handlers) getAccountsBalanceSummary(*http.Request) (interface{}, totalBalance, err := handlers.backend.AccountsBalanceSummary() if err != nil { - return response{Success: false}, nil + return response{Success: false} } - return response{Success: true, TotalBalance: totalBalance}, nil + return response{Success: true, TotalBalance: totalBalance} } func (handlers *Handlers) postSetAccountActive(r *http.Request) interface{} { From 0ea5762dea0f607ac1301405d17cf1f9e294abca Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Mon, 27 Apr 2026 19:56:29 +0000 Subject: [PATCH 3/6] backend: convert open handler --- backend/handlers/handlers.go | 16 ++++++++++++---- frontends/web/src/api/system.ts | 9 ++++++++- frontends/web/src/components/anchor/anchor.tsx | 14 +++++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index 1076905171..ce01d71ea9 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -203,7 +203,7 @@ func NewHandlers( getAPIRouter(apiRouter)("/config", handlers.postAppConfig).Methods("POST") getAPIRouterNoError(apiRouter)("/native-locale", handlers.getNativeLocale).Methods("GET") getAPIRouter(apiRouter)("/notify-user", handlers.postNotify).Methods("POST") - getAPIRouter(apiRouter)("/open", handlers.postOpen).Methods("POST") + getAPIRouterNoError(apiRouter)("/open", handlers.postOpen).Methods("POST") getAPIRouterNoError(apiRouter)("/update", handlers.getUpdate).Methods("GET") getAPIRouterNoError(apiRouter)("/banners/{key}", handlers.getBanners).Methods("GET") getAPIRouterNoError(apiRouter)("/using-mobile-data", handlers.getUsingMobileData).Methods("GET") @@ -567,12 +567,20 @@ func (handlers *Handlers) postNotify(r *http.Request) (interface{}, error) { return nil, nil } -func (handlers *Handlers) postOpen(r *http.Request) (interface{}, error) { +func (handlers *Handlers) postOpen(r *http.Request) interface{} { + type response struct { + Success bool `json:"success"` + ErrorMessage string `json:"errorMessage,omitempty"` + } + var url string if err := json.NewDecoder(r.Body).Decode(&url); err != nil { - return nil, errp.WithStack(err) + return response{Success: false, ErrorMessage: err.Error()} } - return nil, handlers.backend.SystemOpen(url) + if err := handlers.backend.SystemOpen(url); err != nil { + return response{Success: false, ErrorMessage: err.Error()} + } + return response{Success: true} } func (handlers *Handlers) getUpdate(*http.Request) interface{} { diff --git a/frontends/web/src/api/system.ts b/frontends/web/src/api/system.ts index 4a4ae0166e..b24347cc43 100644 --- a/frontends/web/src/api/system.ts +++ b/frontends/web/src/api/system.ts @@ -6,6 +6,13 @@ export const notifyUser = (text: string) => { return apiPost('notify-user', { text }); }; -export const open = (href: string) => { +type TOpenResponse = { + success: true; +} | { + success: false; + errorMessage?: string; +}; + +export const open = (href: string): Promise => { return apiPost('open', href); }; diff --git a/frontends/web/src/components/anchor/anchor.tsx b/frontends/web/src/components/anchor/anchor.tsx index 8d5363217e..f3dac6b265 100644 --- a/frontends/web/src/components/anchor/anchor.tsx +++ b/frontends/web/src/components/anchor/anchor.tsx @@ -1,7 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 import { ReactNode, SyntheticEvent } from 'react'; +import { useTranslation } from 'react-i18next'; import { open } from '@/api/system'; +import { alertUser } from '@/components/alert/Alert'; import { runningInIOS } from '@/utils/env'; import style from './anchor.module.css'; @@ -32,6 +34,8 @@ export const A = ({ children, ...props }: TProps) => { + const { t } = useTranslation(); + return ( { e.preventDefault(); - open(href).catch(console.error); + open(href) + .then(response => { + if (!response.success) { + alertUser(response.errorMessage + ? t('unknownError', { errorMessage: response.errorMessage }) + : t('genericError')); + } + }) + .catch(console.error); }} tabIndex={0} {...props}> From 357d0cb332a733837e63c0bdfe93fc7b412c460b Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Mon, 27 Apr 2026 20:22:16 +0000 Subject: [PATCH 4/6] backend: convert app config handler Switch POST /config to getAPIRouterNoError and return an explicit success/failure response from the handler. The old fetch/browser path rejected legacy { error } responses through handleError(), while Qt/mobile transports returned the backend payload directly and setConfig() ignored it. Preserve that split by only throwing on success: false outside Qt/mobile; packaged app transports still clear pendingConfig and resolve as before. --- backend/handlers/handlers.go | 16 ++++++++++++---- frontends/web/src/utils/config.ts | 13 ++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index ce01d71ea9..d9c4024eab 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -200,7 +200,7 @@ func NewHandlers( getAPIRouterNoError(apiRouter)("/qr", handlers.getQRCode).Methods("GET") getAPIRouterNoError(apiRouter)("/config", handlers.getAppConfig).Methods("GET") getAPIRouterNoError(apiRouter)("/config/default", handlers.getDefaultConfig).Methods("GET") - getAPIRouter(apiRouter)("/config", handlers.postAppConfig).Methods("POST") + getAPIRouterNoError(apiRouter)("/config", handlers.postAppConfig).Methods("POST") getAPIRouterNoError(apiRouter)("/native-locale", handlers.getNativeLocale).Methods("GET") getAPIRouter(apiRouter)("/notify-user", handlers.postNotify).Methods("POST") getAPIRouterNoError(apiRouter)("/open", handlers.postOpen).Methods("POST") @@ -541,12 +541,20 @@ func (handlers *Handlers) getDefaultConfig(*http.Request) interface{} { return handlers.backend.DefaultAppConfig() } -func (handlers *Handlers) postAppConfig(r *http.Request) (interface{}, error) { +func (handlers *Handlers) postAppConfig(r *http.Request) interface{} { + type response struct { + Success bool `json:"success"` + ErrorMessage string `json:"errorMessage,omitempty"` + } + appConfig := config.AppConfig{} if err := json.NewDecoder(r.Body).Decode(&appConfig); err != nil { - return nil, errp.WithStack(err) + return response{Success: false, ErrorMessage: err.Error()} } - return nil, handlers.backend.Config().SetAppConfig(appConfig) + if err := handlers.backend.Config().SetAppConfig(appConfig); err != nil { + return response{Success: false, ErrorMessage: err.Error()} + } + return response{Success: true} } // getNativeLocaleHandler returns user preferred UI language as reported diff --git a/frontends/web/src/utils/config.ts b/frontends/web/src/utils/config.ts index 71e2cb2afc..5fb3acedb4 100644 --- a/frontends/web/src/utils/config.ts +++ b/frontends/web/src/utils/config.ts @@ -1,12 +1,20 @@ // SPDX-License-Identifier: Apache-2.0 import { apiGet, apiPost } from '@/utils/request'; +import { runningInQtWebEngine, runningOnMobile } from '@/utils/env'; type TConfig = { backend?: unknown; frontend?: unknown; }; +type TSetConfigResponse = null | undefined | { + success: true; +} | { + success: false; + errorMessage?: string; +}; + let pendingConfig: TConfig = {}; /** @@ -32,7 +40,10 @@ export const setConfig = (object: TConfig) => { }); pendingConfig = nextConfig; return apiPost('config', nextConfig) - .then(() => { + .then((response: TSetConfigResponse) => { + if (response?.success === false && !runningInQtWebEngine() && !runningOnMobile()) { + throw new Error(response.errorMessage || 'Failed to update configuration'); + } pendingConfig = {}; return nextConfig; }); From 546c2dcaed007f765cee014bded20f3d3acaf726 Mon Sep 17 00:00:00 2001 From: Marko Bencun Date: Mon, 27 Apr 2026 21:21:11 +0000 Subject: [PATCH 5/6] backend: log no-error handler failures --- backend/handlers/handlers.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index d9c4024eab..e3475d49e6 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -374,6 +374,14 @@ func writeJSON(w io.Writer, value interface{}) { } } +func logHandlerError(handler string, err error) { + logging.Get(). + WithGroup("handlers"). + WithField("handler", handler). + WithError(err). + Error("handler failed") +} + type apiErrorResponse struct { Error string `json:"error"` } @@ -549,9 +557,11 @@ func (handlers *Handlers) postAppConfig(r *http.Request) interface{} { appConfig := config.AppConfig{} if err := json.NewDecoder(r.Body).Decode(&appConfig); err != nil { + logHandlerError("postAppConfig", err) return response{Success: false, ErrorMessage: err.Error()} } if err := handlers.backend.Config().SetAppConfig(appConfig); err != nil { + logHandlerError("postAppConfig", err) return response{Success: false, ErrorMessage: err.Error()} } return response{Success: true} @@ -583,9 +593,11 @@ func (handlers *Handlers) postOpen(r *http.Request) interface{} { var url string if err := json.NewDecoder(r.Body).Decode(&url); err != nil { + logHandlerError("postOpen", err) return response{Success: false, ErrorMessage: err.Error()} } if err := handlers.backend.SystemOpen(url); err != nil { + logHandlerError("postOpen", err) return response{Success: false, ErrorMessage: err.Error()} } return response{Success: true} @@ -894,6 +906,7 @@ func (handlers *Handlers) getAccountsBalanceSummary(*http.Request) interface{} { totalBalance, err := handlers.backend.AccountsBalanceSummary() if err != nil { + logHandlerError("getAccountsBalanceSummary", err) return response{Success: false} } return response{Success: true, TotalBalance: totalBalance} @@ -1478,6 +1491,7 @@ func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) interface{} { acct, err := handlers.backend.GetAccountFromCode(accountsTypes.Code(mux.Vars(r)["code"])) if err != nil { + logHandlerError("getMarketMoonpayBuyInfo", err) return result{Success: false, ErrorMessage: err.Error()} } @@ -1493,6 +1507,7 @@ func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) interface{} { } buy, err := market.MoonpayInfo(acct, params) if err != nil { + logHandlerError("getMarketMoonpayBuyInfo", err) return result{Success: false, ErrorMessage: err.Error()} } return result{ From 33677f187401aa1659fca763e184c36c13cc0c3f Mon Sep 17 00:00:00 2001 From: Nikolas De Giorgis Date: Tue, 28 Apr 2026 12:17:29 +0100 Subject: [PATCH 6/6] backend: use handlers logger field --- backend/handlers/handlers.go | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/backend/handlers/handlers.go b/backend/handlers/handlers.go index e3475d49e6..2f22e89b16 100644 --- a/backend/handlers/handlers.go +++ b/backend/handlers/handlers.go @@ -171,7 +171,7 @@ func NewHandlers( WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, }, - log: logging.Get().WithGroup("handlers"), + log: log, } getAPIRouter := func(subrouter *mux.Router) func(string, func(*http.Request) (interface{}, error)) *mux.Route { @@ -374,14 +374,6 @@ func writeJSON(w io.Writer, value interface{}) { } } -func logHandlerError(handler string, err error) { - logging.Get(). - WithGroup("handlers"). - WithField("handler", handler). - WithError(err). - Error("handler failed") -} - type apiErrorResponse struct { Error string `json:"error"` } @@ -557,11 +549,11 @@ func (handlers *Handlers) postAppConfig(r *http.Request) interface{} { appConfig := config.AppConfig{} if err := json.NewDecoder(r.Body).Decode(&appConfig); err != nil { - logHandlerError("postAppConfig", err) + handlers.log.WithField("handler", "postAppConfig").WithError(err).Error("handler failed") return response{Success: false, ErrorMessage: err.Error()} } if err := handlers.backend.Config().SetAppConfig(appConfig); err != nil { - logHandlerError("postAppConfig", err) + handlers.log.WithField("handler", "postAppConfig").WithError(err).Error("handler failed") return response{Success: false, ErrorMessage: err.Error()} } return response{Success: true} @@ -593,11 +585,11 @@ func (handlers *Handlers) postOpen(r *http.Request) interface{} { var url string if err := json.NewDecoder(r.Body).Decode(&url); err != nil { - logHandlerError("postOpen", err) + handlers.log.WithField("handler", "postOpen").WithError(err).Error("handler failed") return response{Success: false, ErrorMessage: err.Error()} } if err := handlers.backend.SystemOpen(url); err != nil { - logHandlerError("postOpen", err) + handlers.log.WithField("handler", "postOpen").WithError(err).Error("handler failed") return response{Success: false, ErrorMessage: err.Error()} } return response{Success: true} @@ -906,7 +898,7 @@ func (handlers *Handlers) getAccountsBalanceSummary(*http.Request) interface{} { totalBalance, err := handlers.backend.AccountsBalanceSummary() if err != nil { - logHandlerError("getAccountsBalanceSummary", err) + handlers.log.WithField("handler", "getAccountsBalanceSummary").WithError(err).Error("handler failed") return response{Success: false} } return response{Success: true, TotalBalance: totalBalance} @@ -1491,7 +1483,7 @@ func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) interface{} { acct, err := handlers.backend.GetAccountFromCode(accountsTypes.Code(mux.Vars(r)["code"])) if err != nil { - logHandlerError("getMarketMoonpayBuyInfo", err) + handlers.log.WithField("handler", "getMarketMoonpayBuyInfo").WithError(err).Error("handler failed") return result{Success: false, ErrorMessage: err.Error()} } @@ -1507,7 +1499,7 @@ func (handlers *Handlers) getMarketMoonpayBuyInfo(r *http.Request) interface{} { } buy, err := market.MoonpayInfo(acct, params) if err != nil { - logHandlerError("getMarketMoonpayBuyInfo", err) + handlers.log.WithField("handler", "getMarketMoonpayBuyInfo").WithError(err).Error("handler failed") return result{Success: false, ErrorMessage: err.Error()} } return result{