diff --git a/src/domain/shared/MoneyAmount.ts b/src/domain/shared/MoneyAmount.ts index 6b89ab13e..48797f45a 100644 --- a/src/domain/shared/MoneyAmount.ts +++ b/src/domain/shared/MoneyAmount.ts @@ -146,7 +146,13 @@ export class JMDAmount extends MoneyAmount { static dollars(d: number): JMDAmount | BigIntConversionError { try { - return new JMDAmount(BigInt(d) * 100n) + // Mirror USDAmount.dollars: use the Money lib for a decimal-safe conversion. + // BigInt(d) throws on any fractional rate (e.g. an NCB rate of 155.5), which + // is what the exchange-rate value virtually always is. + const dollarAmt = new Money(d.toString(), "JMDollars", Round.HALF_TO_EVEN) + const cents = JMDAmount.cents("100") + if (cents instanceof BigIntConversionError) return cents // should never happen + return new JMDAmount(cents.money.multiply(dollarAmt).toFixed(2)) } catch (error) { return new BigIntConversionError( error instanceof Error ? error.message : String(error), diff --git a/src/graphql/error-map.ts b/src/graphql/error-map.ts index 1905dfd8c..67b752890 100644 --- a/src/graphql/error-map.ts +++ b/src/graphql/error-map.ts @@ -921,6 +921,11 @@ export const mapError = (error: ApplicationError): CustomApolloError => { message = "No upgrade request found for this account" return new NotFoundError({ message, logger: baseLogger }) + case "ExchangeRateQueryError": + message = + "Cashout is temporarily unavailable while we refresh the exchange rate. Please try again shortly." + return new UnexpectedClientError({ message, logger: baseLogger }) + case "InvalidLnurlError": return new InvalidLnurlError({ message: error.message, logger: baseLogger })