From 521d325f8cadb998a0072cee3d12823728f32fd9 Mon Sep 17 00:00:00 2001 From: Fabien Date: Mon, 23 Feb 2026 23:28:24 +0100 Subject: [PATCH 1/3] Convert SimplifiedTransaction[] to Transaction[] type in getAddressDetails The API is likely to keep evolving and maintaining the types in sync is brittle as demonstrated here. Apply a proper conversion function to ensure the format is as expected. Test Plan: yarn test Check payment detection still works on mobile. --- react/lib/util/api-client.ts | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/react/lib/util/api-client.ts b/react/lib/util/api-client.ts index ab271df0..b7398ea7 100644 --- a/react/lib/util/api-client.ts +++ b/react/lib/util/api-client.ts @@ -17,7 +17,50 @@ export const getAddressDetails = async ( rootUrl = config.apiBaseUrl, ): Promise => { const res = await fetch(`${rootUrl}/address/transactions/${address}`); - return res.json(); + + if (!res.ok) { + console.warn(`Received invalid response from ${rootUrl}/address/transactions/${address}`); + return []; + } + + let apiTransactions; + try { + apiTransactions = await res.json(); + } catch (error) { + console.warn(`Failed to fetch address transactions from ${rootUrl}/address/transactions/${address}`, error); + return []; + } + + if (!Array.isArray(apiTransactions)) { + console.warn(`Received invalid data from ${rootUrl}/address/transactions/${address}`, apiTransactions); + return []; + } + + const transactions: Transaction[] = []; + // apiTransaction type is SimplifiedTransaction from paybutton-server/ws-service/types.ts + apiTransactions.forEach((apiTransaction: any) => { + const opReturn = { + rawMessage: apiTransaction.rawMessage, + message: apiTransaction.message, + paymentId: apiTransaction.paymentId, + }; + const transaction: Transaction = { + hash: apiTransaction.hash, + amount: apiTransaction.amount, + paymentId: apiTransaction.paymentId, + confirmed: apiTransaction.confirmed, + message: apiTransaction.message, + timestamp: apiTransaction.timestamp, + address: apiTransaction.address, + rawMessage: apiTransaction.rawMessage, + // Only keep the address string, drop the amount + inputAddresses: Array.isArray(apiTransaction.inputAddresses) ? apiTransaction.inputAddresses.map((input: { address: string, amount: string }) => input.address) : [], + opReturn: JSON.stringify(opReturn), + }; + transactions.push(transaction); + }); + + return transactions; }; export const getAddressBalance = async ( From e18dfeba6861604ab5683b311c3b04e1a2125568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Tue, 24 Feb 2026 14:52:08 -0300 Subject: [PATCH 2/3] fix: remove any, add type --- react/lib/util/api-client.ts | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/react/lib/util/api-client.ts b/react/lib/util/api-client.ts index b7398ea7..1cdac76e 100644 --- a/react/lib/util/api-client.ts +++ b/react/lib/util/api-client.ts @@ -11,6 +11,32 @@ import { } from './types'; import { isFiat } from './currency'; import { CURRENCY_TYPES_MAP, DECIMALS } from './constants'; +import Decimal from 'decimal.js'; + +interface SimplifiedTransaction { + hash: string + amount: Decimal + paymentId: string + confirmed?: boolean + message: string + timestamp: number + address: string + rawMessage: string + inputAddresses: Array<{ + address: string + amount: Decimal + }> + outputAddresses: Array<{ + address: string + amount: Decimal + }> + prices: Array<{ + price: { + value: Decimal + quoteId: number + } + }> +} export const getAddressDetails = async ( address: string, @@ -37,8 +63,7 @@ export const getAddressDetails = async ( } const transactions: Transaction[] = []; - // apiTransaction type is SimplifiedTransaction from paybutton-server/ws-service/types.ts - apiTransactions.forEach((apiTransaction: any) => { + apiTransactions.forEach((apiTransaction: SimplifiedTransaction) => { const opReturn = { rawMessage: apiTransaction.rawMessage, message: apiTransaction.message, @@ -46,7 +71,7 @@ export const getAddressDetails = async ( }; const transaction: Transaction = { hash: apiTransaction.hash, - amount: apiTransaction.amount, + amount: apiTransaction.amount.toString(), paymentId: apiTransaction.paymentId, confirmed: apiTransaction.confirmed, message: apiTransaction.message, From 8bc93903266ad63509a6408d377675ad24819eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o?= Date: Wed, 25 Feb 2026 08:20:43 -0300 Subject: [PATCH 3/3] fix: wrong type --- react/lib/util/api-client.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/react/lib/util/api-client.ts b/react/lib/util/api-client.ts index 1cdac76e..56d3d80c 100644 --- a/react/lib/util/api-client.ts +++ b/react/lib/util/api-client.ts @@ -11,11 +11,10 @@ import { } from './types'; import { isFiat } from './currency'; import { CURRENCY_TYPES_MAP, DECIMALS } from './constants'; -import Decimal from 'decimal.js'; interface SimplifiedTransaction { hash: string - amount: Decimal + amount: string paymentId: string confirmed?: boolean message: string @@ -24,15 +23,15 @@ interface SimplifiedTransaction { rawMessage: string inputAddresses: Array<{ address: string - amount: Decimal + amount: string }> outputAddresses: Array<{ address: string - amount: Decimal + amount: string }> prices: Array<{ price: { - value: Decimal + value: string quoteId: number } }> @@ -71,7 +70,7 @@ export const getAddressDetails = async ( }; const transaction: Transaction = { hash: apiTransaction.hash, - amount: apiTransaction.amount.toString(), + amount: apiTransaction.amount, paymentId: apiTransaction.paymentId, confirmed: apiTransaction.confirmed, message: apiTransaction.message,