Skip to content

Commit fbf58d8

Browse files
mchappellprzemyslaw-wlodekvetalcore
authored
fix: handle coingecko API errors [LW-8256] (#1996)
* fix: token display if pricing data not available * fix: display assets price data expired banner * fix: activity display if pricing data not available * fix: show empty dash for cardano data when balance information unavailable * fix: btc wallet display if pricing data not available * fix: dapp-related amount transformers fallback * fix: token detail drawer when no token pricing available * fix: hide fiat amount when failed to fetch the price (BTC Send Flow) * fix: hide fiat amount when failed to fetch the price (ADA Send Flow) * chore: fix lint/format and unit test --------- Co-authored-by: Przemysław Włodek <[email protected]> Co-authored-by: vetalcore <[email protected]>
1 parent 4ca9c64 commit fbf58d8

File tree

18 files changed

+70
-43
lines changed

18 files changed

+70
-43
lines changed

apps/browser-extension-wallet/src/hooks/useWalletActivities.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export const useWalletActivities = ({
2929

3030
const fetchWalletActivities = useCallback(async () => {
3131
fiatCurrency &&
32-
cardanoFiatPrice &&
3332
getWalletActivities({
3433
fiatCurrency,
3534
cardanoFiatPrice,
@@ -141,7 +140,7 @@ export const useWalletActivitiesPaginated = ({
141140

142141
useEffect(() => {
143142
(async () => {
144-
if (loadedHistory?.transactions === undefined || !fiatCurrency || !cardanoFiatPrice) return;
143+
if (loadedHistory?.transactions === undefined || !fiatCurrency) return;
145144

146145
handleUpdateWalletActivities(loadedHistory.transactions.slice(0, currentPage * pageSize));
147146
})();

apps/browser-extension-wallet/src/lib/scripts/background/services/utilityServices.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,19 @@ const fetchAdaPrice = (coinPrices: CoinPrices) => {
180180
`https://coingecko.live-mainnet.eks.lw.iog.io/api/v3/simple/price?ids=cardano&vs_currencies=${vsCurrencies}&include_24hr_change=true`
181181
)
182182
.then(async (response) => {
183-
const { cardano: prices } = await response.json();
183+
// Check if the response is successful
184+
if (!response.ok) {
185+
throw new Error(`Failed to fetch ADA price: HTTP ${response.status}`);
186+
}
187+
188+
const responseData = await response.json();
189+
190+
// Check if we have valid cardano price data
191+
if (!responseData.cardano) {
192+
throw new Error('Invalid ADA price response: missing cardano data');
193+
}
194+
195+
const { cardano: prices } = responseData;
184196
// save the last fetched ada price in background storage
185197
await setBackgroundStorage({
186198
fiatPrices: {
@@ -222,8 +234,20 @@ const fetchBitcoinPrice = (coinPrices: CoinPrices) => {
222234
`https://coingecko.live-mainnet.eks.lw.iog.io/api/v3/simple/price?ids=bitcoin&vs_currencies=${vsCurrencies}&include_24hr_change=true`
223235
)
224236
.then(async (response) => {
225-
const { bitcoin: prices } = await response.json();
226-
// save the last fetched ada price in background storage
237+
// Check if the response is successful
238+
if (!response.ok) {
239+
throw new Error(`Failed to fetch Bitcoin price: HTTP ${response.status}`);
240+
}
241+
242+
const responseData = await response.json();
243+
244+
// Check if we have valid bitcoin price data
245+
if (!responseData.bitcoin) {
246+
throw new Error('Invalid Bitcoin price response: missing bitcoin data');
247+
}
248+
249+
const { bitcoin: prices } = responseData;
250+
// save the last fetched bitcoin price in background storage
227251
await setBackgroundStorage({
228252
fiatBitcoinPrices: {
229253
prices,

apps/browser-extension-wallet/src/utils/__tests__/assets-transformers.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ describe('Testing assets transformers', () => {
131131
balance: 'balance',
132132
price: 'formattedPrice',
133133
variation: 'variationParserResult',
134-
fiatBalance: `- ${params.fiatCode}`
134+
fiatBalance: '-'
135135
});
136136
expect(formatNumberSpy).toBeCalledWith(params.fiatPrice?.price.toString(), 3);
137137
expect(walletBalanceTransformerSpy).toBeCalledWith(params.total.coins.toString(), params.fiatPrice?.price);
@@ -189,7 +189,7 @@ describe('Testing assets transformers', () => {
189189
const isNumericSpy = jest.spyOn(formatNumber, 'isNumeric');
190190
isNumericSpy.mockReturnValue(false);
191191

192-
expect(assetsTransformers.cardanoTransformer(params).fiatBalance).toEqual(`? ${params.fiatCode}`);
192+
expect(assetsTransformers.cardanoTransformer(params).fiatBalance).toEqual('-');
193193
expect(isNumericSpy).toBeCalledWith(walletBalanceTransformerResult.fiatBalance);
194194

195195
isNumericSpy.mockRestore();

apps/browser-extension-wallet/src/utils/assets-transformers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ export const cardanoTransformer = (params: {
3232
balance.fiatBalance === '-'
3333
? balance.fiatBalance
3434
: isNumeric(balance.fiatBalance)
35-
? formatLocaleNumber(balance.fiatBalance)
36-
: '?';
35+
? `${formatLocaleNumber(balance.fiatBalance)} ${fiatCode}`
36+
: '-';
3737

3838
return {
3939
id: cardanoCoin.id,
@@ -44,7 +44,7 @@ export const cardanoTransformer = (params: {
4444
price: isNumber(fiatPrice?.price) ? formatLocaleNumber(fiatPrice.price.toString(), 3) : '-',
4545
variation: fiatPrice?.priceVariationPercentage24h ? variationParser(fiatPrice.priceVariationPercentage24h) : '-',
4646
balance: areBalancesVisible ? formatLocaleNumber(balance.coinBalance) : balancesPlaceholder,
47-
fiatBalance: areBalancesVisible ? `${fiatBalance} ${fiatCode}` : balancesPlaceholder
47+
fiatBalance: areBalancesVisible ? fiatBalance : balancesPlaceholder
4848
};
4949
};
5050

apps/browser-extension-wallet/src/views/bitcoin-mode/features/activity/components/ActivityLayout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ export const ActivityLayout = (): React.ReactElement => {
169169
? 'PENDING'
170170
: formattedTimestamp(new Date(transaction.timestamp * 1000)),
171171
amount: `${new BigNumber(net.toString()).dividedBy(100_000_000).toFixed(8, BigNumber.ROUND_HALF_UP)} BTC`,
172-
fiatAmount: `${computeBalance(Number(net) / SATS_IN_BTC, fiatCurrency.code, bitcoinPrice)} ${
173-
fiatCurrency.code === 'ADA' ? 'BTC' : fiatCurrency.code
174-
}`,
172+
fiatAmount: `${
173+
bitcoinPrice ? computeBalance(Number(net) / SATS_IN_BTC, fiatCurrency.code, bitcoinPrice) : '-'
174+
} ${fiatCurrency.code === 'ADA' ? 'BTC' : fiatCurrency.code}`,
175175
status:
176176
transaction.status === Bitcoin.TransactionStatus.Pending ? ActivityStatus.PENDING : ActivityStatus.SUCCESS,
177177
type,

apps/browser-extension-wallet/src/views/bitcoin-mode/features/assets/components/Assets.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export const Assets = ({ topSection }: AssetsProps): React.ReactElement => {
9696
variation: currencyCode === 'BTC' ? '-' : `${bitcoinPriceVariation.toFixed(2)}`,
9797
balance: areBalancesVisible ? (Number(balance) / SATS_IN_BTC).toString() : hiddenBalancePlaceholder,
9898
fiatBalance: areBalancesVisible
99-
? `${computeBalance(totalBalance, fiatCurrency.code, 1)} ${currencyCode}`
99+
? `${bitcoinPrice ? computeBalance(totalBalance, fiatCurrency.code, 1) : '-'} ${currencyCode}`
100100
: hiddenBalancePlaceholder
101101
}
102102
]

apps/browser-extension-wallet/src/views/bitcoin-mode/features/assets/components/AssetsPortfolio/AssetsPortfolio.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,11 @@ export const AssetsPortfolio = ({
8585
redirectToSend({ params: { id: '1' } });
8686
};
8787

88-
// Display banner after 3 minutes since last coin price save
88+
// Display banner after 3 minutes since last coin price save or when there's an error
8989
const isPriceOutdated = useMemo(
9090
() =>
91-
// If there is no timestamp, that means that we never saved a previous price, so we just check if it has an error
92-
coinPrice.status === 'error' && coinPrice.timestamp
93-
? dayjs().diff(coinPrice.timestamp, 'minutes') >= MINUTES_UNTIL_WARNING_BANNER
94-
: coinPrice.status === 'error',
91+
coinPrice.status === 'error' ||
92+
(coinPrice.timestamp && dayjs().diff(coinPrice.timestamp, 'minutes') >= MINUTES_UNTIL_WARNING_BANNER),
9593
[coinPrice]
9694
);
9795

apps/browser-extension-wallet/src/views/bitcoin-mode/features/send/components/ReviewTransaction.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export const ReviewTransaction: React.FC<ReviewTransactionProps> = ({
7070
weight={isPopupView ? '$medium' : '$semibold'}
7171
data-testid="output-summary-amount-fiat"
7272
>
73-
{Number.parseFloat(usdValue.toFixed(2))} USD
73+
{btcToUsdRate ? `${Number.parseFloat(usdValue.toFixed(2))} USD` : ''}
7474
</Text.Body.Normal>
7575
</Flex>
7676
</RowContainer>

apps/browser-extension-wallet/src/views/bitcoin-mode/features/send/components/SendStepOne.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ export const SendStepOne: React.FC<SendStepOneProps> = ({
188188
balance: `${t('browserView.transaction.btc.send.balance')}: ${(availableBalance / SATS_IN_BTC).toFixed(8)}`
189189
};
190190

191-
const fiatValue = `≈ ${new BigNumber(enteredAmount.toString()).toFixed(2, BigNumber.ROUND_HALF_UP)} USD`;
191+
const fiatValue = bitcoinPrice
192+
? `≈ ${new BigNumber(enteredAmount.toString()).toFixed(2, BigNumber.ROUND_HALF_UP)} USD`
193+
: '';
192194

193195
const isAddressInputInvalidHandle =
194196
isAdaHandleEnabled &&
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@import '../../../../../../../packages/common/src/ui/styles/theme.scss';
22

33
.warningBanner {
4-
margin: size_unit(3) 0 -#{size_unit(3)} 0;
4+
margin-top: size_unit(3);
55
}

0 commit comments

Comments
 (0)