From 4f1689a921be108f7af22168d5b1840c63577837 Mon Sep 17 00:00:00 2001 From: Jeet Date: Mon, 14 Apr 2025 16:30:13 +1000 Subject: [PATCH 1/5] use separate endpoint for swap --- .../context/crypto-fiat-context/CryptoFiat.ts | 29 ++ .../src/lib/hooks/useCryptoUSDConversion.ts | 32 ++ .../src/widgets/swap/SwapWidget.tsx | 290 +++++++++--------- .../src/widgets/swap/components/SwapForm.tsx | 32 +- .../widgets/swap/functions/swapFees.test.ts | 4 +- .../src/widgets/swap/functions/swapFees.ts | 5 +- 6 files changed, 221 insertions(+), 171 deletions(-) create mode 100644 packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts diff --git a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts index 6e5aaff2ae..0955030e06 100644 --- a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts +++ b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts @@ -1,4 +1,7 @@ +import axios from 'axios'; import { CryptoFiat, CryptoFiatConvertReturn } from '@imtbl/cryptofiat'; +import { IMMUTABLE_API_BASE_URL } from '@imtbl/checkout-sdk'; +import { Environment } from '@imtbl/config'; import { FiatSymbols } from './CryptoFiatContext'; export const updateConversions = ( @@ -39,3 +42,29 @@ export const getCryptoToFiatConversion = async ( return new Map(); } }; + +async function getUSDConversionsForAll(environment: Environment) { + const apiUrl = `${IMMUTABLE_API_BASE_URL[environment]}/checkout/v1/token-prices`; + const response = await axios.get(apiUrl); + + const { data } = response; + + const result: CryptoFiatConvertReturn = {}; + for (const token of data) { + result[token.symbol] = { usd: token.usd_price }; + } + return result; +} + +// returns the conversion for all tokens in +export const getCryptoToUSDConversion = async ( + environment: Environment, +): Promise> => { + try { + const cryptoToFiatResult = await getUSDConversionsForAll(environment); + + return updateConversions(cryptoToFiatResult, FiatSymbols.USD); + } catch (err: any) { + return new Map(); + } +}; diff --git a/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts b/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts new file mode 100644 index 0000000000..ec1d9a3a2c --- /dev/null +++ b/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts @@ -0,0 +1,32 @@ +import { useState, useEffect } from 'react'; +import { Environment } from '@imtbl/config'; +import { getCryptoToUSDConversion } from '../../context/crypto-fiat-context/CryptoFiat'; + +export function useCryptoUSDConversion(environment: Environment | undefined) { + const [conversions, setConversions] = useState>(new Map()); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function fetchConversions() { + if (!environment) return; + + try { + const data = await getCryptoToUSDConversion(environment); + setConversions(data); + setError(null); + } catch (err) { + setError(err instanceof Error ? err : new Error('Failed to fetch conversions')); + } finally { + setLoading(false); + } + } + + fetchConversions(); + const interval = setInterval(fetchConversions, 30000); + + return () => clearInterval(interval); + }, [environment]); + + return { conversions, error, loading }; +} diff --git a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx index 460c5ded46..ed1f8f8b04 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx @@ -33,7 +33,6 @@ import { SwapSuccessView, SwapWidgetViews, } from '../../context/view-context/SwapViewContextTypes'; -import { CryptoFiatProvider } from '../../context/crypto-fiat-context/CryptoFiatProvider'; import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig'; import { DEFAULT_BALANCE_RETRY_POLICY, getL2ChainId } from '../../lib'; import { StatusView } from '../../components/Status/StatusView'; @@ -79,7 +78,6 @@ export default function SwapWidget({ } = useContext(EventTargetContext); const { - environment, theme, isOnRampEnabled, isSwapEnabled, @@ -270,156 +268,156 @@ export default function SwapWidget({ ( - - {viewState.view.type === SharedViews.LOADING_VIEW && ( - - )} - {viewState.view.type === SwapWidgetViews.SWAP && ( - - )} - {viewState.view.type === SwapWidgetViews.IN_PROGRESS && ( - - )} - {viewState.view.type === SwapWidgetViews.APPROVE_ERC20 && ( - - )} - {viewState.view.type === SwapWidgetViews.SUCCESS && ( - { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapSuccess', - extras: { - fromTokenAddress: viewState.view.data?.fromTokenAddress, - fromAmount: viewState.view.data?.fromAmount, - toTokenAddress: viewState.view.data?.toTokenAddress, - toAmount: viewState.view.data?.toAmount, + {/* */} + {viewState.view.type === SharedViews.LOADING_VIEW && ( + + )} + {viewState.view.type === SwapWidgetViews.SWAP && ( + + )} + {viewState.view.type === SwapWidgetViews.IN_PROGRESS && ( + + )} + {viewState.view.type === SwapWidgetViews.APPROVE_ERC20 && ( + + )} + {viewState.view.type === SwapWidgetViews.SUCCESS && ( + { + page({ + userJourney: UserJourney.SWAP, + screen: 'SwapSuccess', + extras: { + fromTokenAddress: viewState.view.data?.fromTokenAddress, + fromAmount: viewState.view.data?.fromAmount, + toTokenAddress: viewState.view.data?.toTokenAddress, + toAmount: viewState.view.data?.toAmount, + }, + }); + sendSwapSuccessEvent( + eventTarget, + (viewState.view as SwapSuccessView).data.transactionHash, + ); + }} + onActionClick={() => sendSwapWidgetCloseEvent(eventTarget)} + statusType={StatusType.SUCCESS} + testId="success-view" + /> + )} + {viewState.view.type === SwapWidgetViews.FAIL && ( + { + page({ + userJourney: UserJourney.SWAP, + screen: 'SwapFailed', + }); + sendSwapFailedEvent(eventTarget, 'Transaction failed'); + }} + onActionClick={() => { + if (viewState.view.type === SwapWidgetViews.FAIL) { + viewDispatch({ + payload: { + type: ViewActions.UPDATE_VIEW, + view: { + type: SwapWidgetViews.SWAP, + data: viewState.view.data, + }, }, }); - sendSwapSuccessEvent( - eventTarget, - (viewState.view as SwapSuccessView).data.transactionHash, - ); - }} - onActionClick={() => sendSwapWidgetCloseEvent(eventTarget)} - statusType={StatusType.SUCCESS} - testId="success-view" - /> - )} - {viewState.view.type === SwapWidgetViews.FAIL && ( - { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapFailed', - }); - sendSwapFailedEvent(eventTarget, 'Transaction failed'); - }} - onActionClick={() => { - if (viewState.view.type === SwapWidgetViews.FAIL) { - viewDispatch({ - payload: { - type: ViewActions.UPDATE_VIEW, - view: { - type: SwapWidgetViews.SWAP, - data: viewState.view.data, - }, + } + }} + statusType={StatusType.FAILURE} + onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} + testId="fail-view" + /> + )} + {viewState.view.type === SwapWidgetViews.PRICE_SURGE && ( + { + page({ + userJourney: UserJourney.SWAP, + screen: 'PriceSurge', + }); + sendSwapRejectedEvent(eventTarget, 'Price surge'); + }} + onActionClick={() => { + if (viewState.view.type === SwapWidgetViews.PRICE_SURGE) { + viewDispatch({ + payload: { + type: ViewActions.UPDATE_VIEW, + view: { + type: SwapWidgetViews.SWAP, + data: viewState.view.data, }, - }); - } - }} - statusType={StatusType.FAILURE} - onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} - testId="fail-view" - /> - )} - {viewState.view.type === SwapWidgetViews.PRICE_SURGE && ( - { - page({ - userJourney: UserJourney.SWAP, - screen: 'PriceSurge', + }, }); - sendSwapRejectedEvent(eventTarget, 'Price surge'); - }} - onActionClick={() => { - if (viewState.view.type === SwapWidgetViews.PRICE_SURGE) { - viewDispatch({ - payload: { - type: ViewActions.UPDATE_VIEW, - view: { - type: SwapWidgetViews.SWAP, - data: viewState.view.data, - }, - }, - }); - } - }} - statusType={StatusType.WARNING} - onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} - testId="price-surge-view" - /> - )} - {viewState.view.type === SharedViews.ERROR_VIEW && ( - { - setErrorViewLoading(true); - const data = viewState.view as ErrorViewType; - - if (!data.tryAgain) { - showSwapView(); - setErrorViewLoading(false); - return; - } - - if (await data.tryAgain()) showSwapView(); + } + }} + statusType={StatusType.WARNING} + onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} + testId="price-surge-view" + /> + )} + {viewState.view.type === SharedViews.ERROR_VIEW && ( + { + setErrorViewLoading(true); + const data = viewState.view as ErrorViewType; + + if (!data.tryAgain) { + showSwapView(); setErrorViewLoading(false); - }} - onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} - errorEventActionLoading={errorViewLoading} - /> - )} - {viewState.view.type === SwapWidgetViews.SERVICE_UNAVAILABLE && ( - sendSwapWidgetCloseEvent(eventTarget)} - onBackButtonClick={() => { - viewDispatch({ - payload: { type: ViewActions.UPDATE_VIEW, view: { type: SwapWidgetViews.SWAP } }, - }); - }} + return; + } + + if (await data.tryAgain()) showSwapView(); + setErrorViewLoading(false); + }} + onCloseClick={() => sendSwapWidgetCloseEvent(eventTarget)} + errorEventActionLoading={errorViewLoading} + /> + )} + {viewState.view.type === SwapWidgetViews.SERVICE_UNAVAILABLE && ( + sendSwapWidgetCloseEvent(eventTarget)} + onBackButtonClick={() => { + viewDispatch({ + payload: { type: ViewActions.UPDATE_VIEW, view: { type: SwapWidgetViews.SWAP } }, + }); + }} + /> + )} + {viewState.view.type === SharedViews.TOP_UP_VIEW && ( + sendSwapWidgetCloseEvent(eventTarget)} /> - )} - {viewState.view.type === SharedViews.TOP_UP_VIEW && ( - sendSwapWidgetCloseEvent(eventTarget)} - /> - )} - + )} + {/* */} ) diff --git a/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx b/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx index 078bc5c9c4..0fcc610e2c 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx @@ -16,7 +16,6 @@ import { UserJourney, useAnalytics } from '../../../context/analytics-provider/S import { NetworkSwitchDrawer } from '../../../components/NetworkSwitchDrawer/NetworkSwitchDrawer'; import { amountInputValidation as textInputValidator } from '../../../lib/validations/amountInputValidations'; import { SwapContext } from '../context/SwapContext'; -import { CryptoFiatActions, CryptoFiatContext } from '../../../context/crypto-fiat-context/CryptoFiatContext'; import { calculateCryptoToFiat, calculateFeesFiat, formatZeroAmount, getDefaultTokenImage, isNativeToken, tokenValueFormat, @@ -54,6 +53,7 @@ import { formatQuoteConversionRate } from '../functions/swapConversionRate'; import { PrefilledSwapForm, SwapWidgetViews } from '../../../context/view-context/SwapViewContextTypes'; import { TransactionRejected } from '../../../components/TransactionRejected/TransactionRejected'; import { Fees } from './Fees'; +import { useCryptoUSDConversion } from '../../../lib/hooks/useCryptoUSDConversion'; enum SwapDirection { FROM = 'FROM', @@ -96,7 +96,8 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { ? NATIVE : `${symbol.toLowerCase()}-${address!.toLowerCase()}`), []); - const { cryptoFiatState, cryptoFiatDispatch } = useContext(CryptoFiatContext); + // const { cryptoFiatState, cryptoFiatDispatch } = useContext(CryptoFiatContext); + const { conversions: usdConversions } = useCryptoUSDConversion(checkout?.config.environment); const { viewDispatch } = useContext(ViewContext); const [direction, setDirection] = useState(SwapDirection.FROM); @@ -128,13 +129,13 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { const feeFiatValue = useMemo(() => { if (!gasFeeToken || !quote || !fromToken) return null; - return calculateFeesFiat(quote, fromToken, gasFeeToken, cryptoFiatState.conversions, gasFeeValue); - }, [quote, cryptoFiatState.conversions, gasFeeToken, gasFeeValue, fromToken]); + return calculateFeesFiat(quote, fromToken, gasFeeToken, usdConversions, gasFeeValue); + }, [quote, usdConversions, gasFeeToken, gasFeeValue, fromToken]); const [tokensOptionsFrom, setTokensOptionsForm] = useState([]); const formattedFees = useMemo( - () => (quote ? formatSwapFees(quote, cryptoFiatState, t) : []), - [quote, cryptoFiatState, t], + () => (quote ? formatSwapFees(quote, usdConversions, t) : []), + [quote, usdConversions, t], ); const [conversionToken, setConversionToken] = useState(null); const [conversionAmount, setConversionAmount] = useState(''); @@ -171,10 +172,10 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { icon: tokenBalance.token.icon, balance: { formattedAmount: tokenValueFormat(tokenBalance.formattedBalance), - formattedFiatAmount: cryptoFiatState.conversions.size === 0 ? formatZeroAmount('') : calculateCryptoToFiat( + formattedFiatAmount: usdConversions.size === 0 ? formatZeroAmount('') : calculateCryptoToFiat( tokenBalance.formattedBalance, tokenBalance.token.symbol || '', - cryptoFiatState.conversions, + usdConversions, ), }, } as CoinSelectorOptionProps), @@ -210,7 +211,7 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { }, [ tokenBalances, allowedTokens, - cryptoFiatState.conversions, + usdConversions, data?.fromTokenAddress, data?.toTokenAddress, setFromToken, @@ -249,15 +250,6 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { } as CoinSelectorOptionProps), ), [allowedTokens, fromToken]); - useEffect(() => { - cryptoFiatDispatch({ - payload: { - type: CryptoFiatActions.SET_TOKEN_SYMBOLS, - tokenSymbols: allowedTokens.map((token) => token.symbol), - }, - }); - }, [cryptoFiatDispatch, allowedTokens]); - // ------------------// // FETCH QUOTES // // ------------------// @@ -540,9 +532,9 @@ export function SwapForm({ data, theme, cancelAutoProceed }: SwapFromProps) { setFromFiatValue(calculateCryptoToFiat( fromAmount, fromToken.symbol, - cryptoFiatState.conversions, + usdConversions, )); - }, [fromAmount, fromToken, cryptoFiatState.conversions]); + }, [fromAmount, fromToken, usdConversions]); const onFromSelectChange = useCallback((value: OptionKey) => { const selected = tokenBalances diff --git a/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.test.ts b/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.test.ts index 4c35cac30b..ce4f94e9e2 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.test.ts +++ b/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.test.ts @@ -42,7 +42,7 @@ describe('formatSwapFees', () => { (calculateCryptoToFiat as jest.Mock).mockReturnValue('FiatValue:1'); (tokenValueFormat as jest.Mock).mockReturnValue('Formatted:1'); - const fees = formatSwapFees(mockGasFeeQuote, cryptoFiatState, mockTranslate); + const fees = formatSwapFees(mockGasFeeQuote, cryptoFiatState.conversions, mockTranslate); expect(fees).toEqual([ { label: 'drawers.feesBreakdown.fees.swapGasFee.label', @@ -90,7 +90,7 @@ describe('formatSwapFees', () => { conversions: {}, } as CryptoFiatState; - const fees = formatSwapFees(mockSecondaryFeeQuote, cryptoFiatState, mockTranslate); + const fees = formatSwapFees(mockSecondaryFeeQuote, cryptoFiatState.conversions, mockTranslate); expect(fees).toEqual([ { label: 'drawers.feesBreakdown.fees.swapSecondaryFee.label', diff --git a/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.ts b/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.ts index 06c7e46c1e..30088d70d9 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.ts +++ b/packages/checkout/widgets-lib/src/widgets/swap/functions/swapFees.ts @@ -2,7 +2,6 @@ import { Amount, Token, TransactionResponse } from '@imtbl/dex-sdk'; import { TFunction } from 'i18next'; import { TokenInfo } from '@imtbl/checkout-sdk'; import { formatUnits } from 'ethers'; -import { CryptoFiatState } from '../../../context/crypto-fiat-context/CryptoFiatContext'; import { calculateCryptoToFiat, tokenValueFormat } from '../../../lib/utils'; export type FormattedFee = { @@ -21,7 +20,7 @@ export type FormattedFee = { */ export const formatSwapFees = ( swapQuote: TransactionResponse, - cryptoFiatState: CryptoFiatState, + conversions: Map, t: TFunction, ): FormattedFee[] => { const fees: FormattedFee[] = []; @@ -36,7 +35,7 @@ export const formatSwapFees = ( fiatAmount: `≈ ${t('drawers.feesBreakdown.fees.fiatPricePrefix')}${calculateCryptoToFiat( formattedFee, estimate.token.symbol || '', - cryptoFiatState.conversions, + conversions, )}`, amount: `${tokenValueFormat(formattedFee)}`, prefix, From 8b423005cf0f3a97c71ba2125a0df5faa5eff330 Mon Sep 17 00:00:00 2001 From: Jeet Date: Tue, 15 Apr 2025 12:03:45 +1000 Subject: [PATCH 2/5] process correctly --- .../context/crypto-fiat-context/CryptoFiat.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts index 0955030e06..681d00489c 100644 --- a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts +++ b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts @@ -43,16 +43,28 @@ export const getCryptoToFiatConversion = async ( } }; +type TokenPriceResponse = { + // eslint-disable-next-line @typescript-eslint/naming-convention + result: { symbol: string; usd_price: string }[]; +}; + async function getUSDConversionsForAll(environment: Environment) { const apiUrl = `${IMMUTABLE_API_BASE_URL[environment]}/checkout/v1/token-prices`; - const response = await axios.get(apiUrl); + const response = await axios.get(apiUrl); const { data } = response; const result: CryptoFiatConvertReturn = {}; - for (const token of data) { - result[token.symbol] = { usd: token.usd_price }; + const tokens = data.result || []; + for (const token of tokens) { + result[token.symbol.toLowerCase()] = { usd: +token.usd_price }; } + + // if the result has wimx, then add imx to the result + if (result.wimx) { + result.imx = result.wimx; + } + return result; } From 8ccaa35c7bca70c07c184d61dd97dd5733a787de Mon Sep 17 00:00:00 2001 From: Jeet Date: Tue, 15 Apr 2025 13:55:28 +1000 Subject: [PATCH 3/5] tests --- .../crypto-fiat-context/CryptoFiat.test.ts | 59 +++++++++++++++++++ .../context/crypto-fiat-context/CryptoFiat.ts | 4 +- 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.test.ts diff --git a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.test.ts b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.test.ts new file mode 100644 index 0000000000..369801f877 --- /dev/null +++ b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.test.ts @@ -0,0 +1,59 @@ +/* eslint @typescript-eslint/naming-convention: off */ + +import axios from 'axios'; +import { Environment } from '@imtbl/config'; +import { getCryptoToUSDConversion, TokenPriceResponse } from './CryptoFiat'; + +jest.mock('axios'); +const mockedAxios = axios as jest.Mocked; + +const conversionsMap = new Map(); + +const mockResponse: TokenPriceResponse = { + result: [ + { + symbol: 'WOMBAT', + token_address: '0x0219d987a75f860e55d936646c60ba9a021e52ac', + usd_price: '0.0001359733469', + }, + { + symbol: 'BZAI', + token_address: '0x0bbb2db8d777c72516a344506fa2130040b48c13', + usd_price: '0.03', + }, + { + symbol: 'WIMX', + token_address: '0x3a0c2ba54d6cbd3121f01b96dfd20e99d1696c9d', + usd_price: '0.89', + }, + ], +}; + +describe('getCryptoToUSDConversion', () => { + beforeEach(() => { + conversionsMap.set('wombat', 0.0001359733469); + conversionsMap.set('bzai', 0.03); + conversionsMap.set('wimx', 0.89); + conversionsMap.set('imx', 0.89); + }); + + afterEach(() => { + conversionsMap.clear(); + jest.clearAllMocks(); + }); + + it('should return the correct conversion for all tokens', async () => { + mockedAxios.get.mockResolvedValue({ data: mockResponse }); + + const conversions = await getCryptoToUSDConversion(Environment.SANDBOX); + expect(conversions.size).toEqual(4); + expect(conversions).toEqual(conversionsMap); + }); + + it('adds IMX to the conversions map', async () => { + mockedAxios.get.mockResolvedValue({ data: mockResponse }); + + const conversions = await getCryptoToUSDConversion(Environment.SANDBOX); + expect(conversions.get('imx')).toEqual(0.89); + }); +}); diff --git a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts index 681d00489c..af21ea08e0 100644 --- a/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts +++ b/packages/checkout/widgets-lib/src/context/crypto-fiat-context/CryptoFiat.ts @@ -43,9 +43,9 @@ export const getCryptoToFiatConversion = async ( } }; -type TokenPriceResponse = { +export type TokenPriceResponse = { // eslint-disable-next-line @typescript-eslint/naming-convention - result: { symbol: string; usd_price: string }[]; + result: { symbol: string; token_address: string; usd_price: string }[]; }; async function getUSDConversionsForAll(environment: Environment) { From 883bbea97930be27c192922648dfbe7aa3fe2735 Mon Sep 17 00:00:00 2001 From: Jeet Date: Tue, 15 Apr 2025 14:09:18 +1000 Subject: [PATCH 4/5] return err too --- .../widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts b/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts index ec1d9a3a2c..15e9387d2d 100644 --- a/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts +++ b/packages/checkout/widgets-lib/src/lib/hooks/useCryptoUSDConversion.ts @@ -16,7 +16,7 @@ export function useCryptoUSDConversion(environment: Environment | undefined) { setConversions(data); setError(null); } catch (err) { - setError(err instanceof Error ? err : new Error('Failed to fetch conversions')); + setError(err instanceof Error ? err : new Error(`Failed to fetch conversions: ${err}`)); } finally { setLoading(false); } From 347e6604e2eab58fd344d19903936e39cf16ee0f Mon Sep 17 00:00:00 2001 From: Jeet Date: Tue, 15 Apr 2025 14:30:03 +1000 Subject: [PATCH 5/5] remove commented code --- packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx index ed1f8f8b04..13e89ab9bf 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx @@ -268,7 +268,6 @@ export default function SwapWidget({ ( - {/* */} {viewState.view.type === SharedViews.LOADING_VIEW && ( )} @@ -417,7 +416,6 @@ export default function SwapWidget({ onCloseButtonClick={() => sendSwapWidgetCloseEvent(eventTarget)} /> )} - {/* */} )