From 2fc08657eb8acc4a42b21e4266a0bac86dec4c79 Mon Sep 17 00:00:00 2001 From: Louis Paquet Date: Tue, 21 May 2024 09:53:56 +0200 Subject: [PATCH] feat(LIVE-9638): change provider info from static object to API call (#6853) * feat(LIVE-9638): change provider info from static object to API call * feat(LIVE-9638): tests files and changeset * feat(LIVE-9638): change tests for provider fetch * feat(LIVE-9638): mock test change * feat(LIVE-9638): remove useless cache and static swap providers * feat(LIVE-9638): add feature flag provider management --- .changeset/cool-pots-film.md | 7 ++ .../src/screens/Swap/Form/index.tsx | 11 ++- .../src/exchange/platform/startExchange.ts | 2 +- .../src/exchange/providers/swap.ts | 80 ++++++++++++++++++- .../api/v5/__tests__/fetchCurrencyAll.spec.ts | 6 +- .../v5/__tests__/fetchCurrencyFrom.spec.ts | 3 +- .../api/v5/__tests__/fetchCurrencyTo.spec.ts | 4 +- .../exchange/swap/api/v5/fetchCurrencyAll.ts | 6 +- .../exchange/swap/api/v5/fetchCurrencyFrom.ts | 11 +-- .../exchange/swap/api/v5/fetchCurrencyTo.ts | 10 +-- .../src/exchange/swap/api/v5/fetchRates.ts | 12 ++- .../src/exchange/swap/completeExchange.ts | 2 +- .../src/exchange/swap/getExchangeRates.ts | 4 +- .../src/exchange/swap/getProviders.ts | 39 --------- .../swap/hooks/v5/useFetchCurrencyAll.ts | 3 +- .../swap/hooks/v5/useFetchCurrencyFrom.ts | 3 +- .../swap/hooks/v5/useFetchCurrencyTo.ts | 4 +- .../exchange/swap/hooks/v5/useFetchRates.ts | 7 +- .../src/exchange/swap/index.ts | 2 - .../src/exchange/swap/initSwap.ts | 2 +- .../src/exchange/swap/utils/index.ts | 4 +- 21 files changed, 130 insertions(+), 92 deletions(-) create mode 100644 .changeset/cool-pots-film.md delete mode 100644 libs/ledger-live-common/src/exchange/swap/getProviders.ts diff --git a/.changeset/cool-pots-film.md b/.changeset/cool-pots-film.md new file mode 100644 index 000000000000..4b7b6dd239cc --- /dev/null +++ b/.changeset/cool-pots-film.md @@ -0,0 +1,7 @@ +--- +"ledger-live-desktop": patch +"live-mobile": patch +"@ledgerhq/live-common": patch +--- + +Replace static provider info to API diff --git a/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx b/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx index 6f3e1664d2d4..38d3033505ed 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx @@ -58,6 +58,7 @@ export function SwapForm({ const exchangeRate = useSelector(rateSelector); // mobile specific const [confirmed, setConfirmed] = useState(false); + const [swapAcceptedProviders, setSwapAcceptedProviders] = useState([]); const setExchangeRate = useCallback( (rate?: ExchangeRate) => { @@ -314,7 +315,13 @@ export function SwapForm({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [params]); - const swapAcceptedProviders = getAvailableProviders(); + useEffect(() => { + const fetchProviders = async () => { + setSwapAcceptedProviders(await getAvailableProviders()); + }; + fetchProviders(); + }, []); + const termsAccepted = (swapAcceptedProviders || []).includes(provider ?? ""); const [deviceMeta, setDeviceMeta] = useState(); @@ -323,7 +330,7 @@ export function SwapForm({ return ; } - if (getAvailableProviders().length) { + if (swapAcceptedProviders.length) { return ( diff --git a/libs/ledger-live-common/src/exchange/platform/startExchange.ts b/libs/ledger-live-common/src/exchange/platform/startExchange.ts index 98e2cebbc7aa..959292d301e4 100644 --- a/libs/ledger-live-common/src/exchange/platform/startExchange.ts +++ b/libs/ledger-live-common/src/exchange/platform/startExchange.ts @@ -22,7 +22,7 @@ const startExchange = (input: StartExchangeInput): Observable = { + changelly: { + needsKYC: false, + needsBearerToken: false, + type: "CEX", + }, + cic: { + needsKYC: false, + needsBearerToken: false, + type: "CEX", + }, + moonpay: { + needsKYC: true, + needsBearerToken: false, + type: "CEX", + version: 2, + }, + oneinch: { + type: "DEX", + needsKYC: false, + needsBearerToken: false, + }, + paraswap: { + type: "DEX", + needsKYC: false, + needsBearerToken: false, + }, +}; + const swapProviders: Record = { changelly: { name: "Changelly", @@ -75,8 +105,54 @@ const swapProviders: Record = { }, }; -export const getSwapProvider = (providerName: string): ProviderConfig => { - const res = swapProviders[providerName.toLowerCase()]; +export const getSwapProvider = async (providerName: string): Promise => { + const res = getProvidersData()[providerName.toLowerCase()]; + + if (!res) { + throw new Error(`Unknown partner ${providerName}`); + } + + return res; +}; + +function transformData(inputArray) { + const transformedObject = {}; + + inputArray.forEach(item => { + const key = item.name.toLowerCase(); + transformedObject[key] = { + name: item.name, + publicKey: { + curve: item.public_key_curve, + data: Buffer.from(item.public_key, "hex"), + }, + signature: item.signature, + ...(swapProviders[key] && { + needsKYC: swapProviders[key].needsKYC, + needsBearerToken: swapProviders[key].needsBearerToken, + type: swapProviders[key].type, + }), + }; + }); + + return transformedObject; +} + +export const getProvidersData = async () => { + try { + const providersData = await ( + await fetch( + "https://crypto-assets-service.api.aws.prd.ldg-tech.com/v1/partners?output=name,payload_signature_computed_format,signature,public_key,public_key_curve", + ) + ).json(); + return transformData(providersData); + } catch { + return swapProviders; + } +}; + +export const getProvidersAdditionalData = (providerName: string): AdditionalProviderConfig => { + const res = swapAdditionData[providerName.toLowerCase()]; if (!res) { throw new Error(`Unknown partner ${providerName}`); diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyAll.spec.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyAll.spec.ts index 73aa257928d4..37c570f3aa7b 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyAll.spec.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyAll.spec.ts @@ -12,15 +12,13 @@ describe("fetchCurrencyAll", () => { data: fetchCurrencyAllMock, })); - const result = await fetchCurrencyAll({ - providers: ["oneinch"], - }); + const result = await fetchCurrencyAll({}); expect(result).toStrictEqual(flattenV5CurrenciesAll(fetchCurrencyAllMock)); expect(network as jest.Mock).toHaveBeenCalledWith({ method: "GET", timeout: DEFAULT_SWAP_TIMEOUT_MS, - url: "https://swap.ledger.com/v5/currencies/all?providers-whitelist=oneinch&additional-coins-flag=false", + url: "https://swap.ledger.com/v5/currencies/all?providers-whitelist=changelly%2Ccic%2Cmoonpay%2Coneinch%2Cparaswap&additional-coins-flag=false", }); }); }); diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyFrom.spec.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyFrom.spec.ts index 46b0ba79d9b7..9a86096fadf5 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyFrom.spec.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyFrom.spec.ts @@ -13,7 +13,6 @@ describe("fetchCurrencyFrom", () => { })); const result = await fetchCurrencyFrom({ - providers: ["changelly", "cic", "oneinch"], currencyTo: "bitcoin", }); @@ -21,7 +20,7 @@ describe("fetchCurrencyFrom", () => { expect(network as jest.Mock).toHaveBeenCalledWith({ method: "GET", timeout: DEFAULT_SWAP_TIMEOUT_MS, - url: "https://swap.ledger.com/v5/currencies/from?providers-whitelist=changelly%2Ccic%2Coneinch&additional-coins-flag=false¤cy-to=bitcoin", + url: "https://swap.ledger.com/v5/currencies/from?providers-whitelist=changelly%2Ccic%2Cmoonpay%2Coneinch%2Cparaswap&additional-coins-flag=false¤cy-to=bitcoin", }); }); }); diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyTo.spec.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyTo.spec.ts index d83a00687d26..b2b1ac4deec7 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyTo.spec.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/__tests__/fetchCurrencyTo.spec.ts @@ -17,7 +17,6 @@ describe("fetchCurrencyFrom", () => { }); const result = await fetchCurrencyTo({ - providers: ["changelly", "cic", "oneinch"], currencyFromId: "bitcoin", }); @@ -25,7 +24,7 @@ describe("fetchCurrencyFrom", () => { expect(mockNetwork).toHaveBeenCalledWith({ method: "GET", timeout: DEFAULT_SWAP_TIMEOUT_MS, - url: "https://swap.ledger.com/v5/currencies/to?providers-whitelist=changelly%2Ccic%2Coneinch&additional-coins-flag=false¤cy-from=bitcoin", + url: "https://swap.ledger.com/v5/currencies/to?providers-whitelist=changelly%2Ccic%2Cmoonpay%2Coneinch%2Cparaswap&additional-coins-flag=false¤cy-from=bitcoin", }); }); @@ -34,7 +33,6 @@ describe("fetchCurrencyFrom", () => { try { await fetchCurrencyTo({ - providers: ["changelly", "cic", "oneinch"], currencyFromId: "bitcoin", }); } catch (e) { diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyAll.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyAll.ts index 28ad7471759a..ce258ed1021e 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyAll.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyAll.ts @@ -6,11 +6,10 @@ import { fetchCurrencyAllMock } from "./__mocks__/fetchCurrencyAll.mocks"; import { ResponseData as ResponseDataTo } from "./fetchCurrencyTo"; import { ResponseData as ResponseDataFrom } from "./fetchCurrencyFrom"; import { flattenV5CurrenciesAll } from "../../utils/flattenV5CurrenciesAll"; -import { getSwapAPIBaseURL } from "../.."; +import { getAvailableProviders, getSwapAPIBaseURL } from "../.."; import { getEnv } from "@ledgerhq/live-env"; type Props = { - providers: Array; additionalCoinsFlag?: boolean; }; @@ -19,10 +18,11 @@ export type ResponseDataAll = { to: ResponseDataTo["currencyGroups"]; }; -export async function fetchCurrencyAll({ providers, additionalCoinsFlag = false }: Props) { +export async function fetchCurrencyAll({ additionalCoinsFlag = false }: Props) { if (getEnv("MOCK") || getEnv("PLAYWRIGHT_RUN")) return Promise.resolve(flattenV5CurrenciesAll(fetchCurrencyAllMock)); + const providers = getAvailableProviders(); const url = new URL(`${getSwapAPIBaseURL()}/currencies/all`); url.searchParams.append("providers-whitelist", providers.join(",")); url.searchParams.append("additional-coins-flag", additionalCoinsFlag.toString()); diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyFrom.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyFrom.ts index 257ab50f51a4..ad0b62e4ccb9 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyFrom.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyFrom.ts @@ -2,11 +2,10 @@ import network from "@ledgerhq/live-network/network"; import { DEFAULT_SWAP_TIMEOUT_MS } from "../../const/timeout"; import { flattenV5CurrenciesToAndFrom } from "../../utils/flattenV5CurrenciesToAndFrom"; import { fetchCurrencyFromMock } from "./__mocks__/fetchCurrencyFrom.mocks"; -import { getSwapAPIBaseURL } from "../.."; +import { getAvailableProviders, getSwapAPIBaseURL } from "../.."; import { getEnv } from "@ledgerhq/live-env"; type Props = { - providers: Array; currencyTo?: string; additionalCoinsFlag?: boolean; }; @@ -18,17 +17,15 @@ export type ResponseData = { }>; }; -export async function fetchCurrencyFrom({ - providers, - currencyTo, - additionalCoinsFlag = false, -}: Props) { +export async function fetchCurrencyFrom({ currencyTo, additionalCoinsFlag = false }: Props) { if (getEnv("MOCK") || getEnv("PLAYWRIGHT_RUN")) return flattenV5CurrenciesToAndFrom(fetchCurrencyFromMock); const url = new URL(`${getSwapAPIBaseURL()}/currencies/from`); + const providers = getAvailableProviders(); url.searchParams.append("providers-whitelist", providers.join(",")); url.searchParams.append("additional-coins-flag", additionalCoinsFlag.toString()); + if (currencyTo) { url.searchParams.append("currency-to", currencyTo); } diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyTo.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyTo.ts index 4168e3ef4a0d..0f3b51fd2012 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyTo.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchCurrencyTo.ts @@ -5,11 +5,10 @@ import { DEFAULT_SWAP_TIMEOUT_MS } from "../../const/timeout"; import axios from "axios"; import { LedgerAPI4xx } from "@ledgerhq/errors"; import { flattenV5CurrenciesToAndFrom } from "../../utils/flattenV5CurrenciesToAndFrom"; -import { getSwapAPIBaseURL } from "../.."; +import { getAvailableProviders, getSwapAPIBaseURL } from "../.."; type Props = { currencyFromId?: string; - providers: string[]; additionalCoinsFlag?: boolean; }; @@ -21,16 +20,13 @@ type CurrencyGroup = { supportedCurrencies: string[]; }; -export async function fetchCurrencyTo({ - currencyFromId, - providers, - additionalCoinsFlag = false, -}: Props) { +export async function fetchCurrencyTo({ currencyFromId, additionalCoinsFlag = false }: Props) { if (isIntegrationTestEnv()) return Promise.resolve(flattenV5CurrenciesToAndFrom(fetchCurrencyToMock)); const url = new URL(`${getSwapAPIBaseURL()}/currencies/to`); + const providers = getAvailableProviders(); url.searchParams.append("providers-whitelist", providers.join(",")); url.searchParams.append("additional-coins-flag", additionalCoinsFlag.toString()); url.searchParams.append("currency-from", currencyFromId!); diff --git a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchRates.ts b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchRates.ts index 180518ab71d0..e6102b8d415c 100644 --- a/libs/ledger-live-common/src/exchange/swap/api/v5/fetchRates.ts +++ b/libs/ledger-live-common/src/exchange/swap/api/v5/fetchRates.ts @@ -8,10 +8,10 @@ import { SwapGenericAPIError } from "../../../../errors"; import { enrichRatesResponse } from "../../utils/enrichRatesResponse"; import { isIntegrationTestEnv } from "../../utils/isIntegrationTestEnv"; import { fetchRatesMock } from "./__mocks__/fetchRates.mocks"; -import { getSwapAPIBaseURL } from "../.."; +import { getAvailableProviders, getSwapAPIBaseURL } from "../.."; type Props = { - providers: Array; + removeProviders: Array; currencyFrom?: string; toCurrencyId?: string; fromCurrencyAmount: string; @@ -76,7 +76,7 @@ export const throwRateError = (response: ExchangeRate[]) => { }; export async function fetchRates({ - providers, + removeProviders, currencyFrom, toCurrencyId, unitTo, @@ -90,11 +90,15 @@ export async function fetchRates({ } const url = new URL(`${getSwapAPIBaseURL()}/rate`); + const providers = await getAvailableProviders(); + removeProviders.forEach(provider => { + providers.splice(providers.indexOf(provider), 1); + }); const requestBody = { from: currencyFrom, to: toCurrencyId, amountFrom: fromCurrencyAmount, // not sure why amountFrom thinks it can be undefined here - providers, + providers: providers, }; try { diff --git a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts index 10de444f26eb..dc9d9fb737a3 100644 --- a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts +++ b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts @@ -47,7 +47,7 @@ const completeExchange = ( const confirmExchange = async () => { await withDevicePromise(deviceId, async transport => { - const providerConfig = getSwapProvider(provider); + const providerConfig = await getSwapProvider(provider); if (providerConfig.type !== "CEX") { throw new Error(`Unsupported provider type ${providerConfig.type}`); } diff --git a/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts b/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts index 56eb4c391b5b..ad51281b3d12 100644 --- a/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts +++ b/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts @@ -12,7 +12,7 @@ import { getSwapAPIBaseURL, getSwapAPIError } from "./"; import { mockGetExchangeRates } from "./mock"; import type { CustomMinOrMaxError, GetExchangeRates } from "./types"; import { isIntegrationTestEnv } from "./utils/isIntegrationTestEnv"; -import { getSwapProvider } from "../providers"; +import { getProvidersAdditionalData } from "../providers/swap"; const getExchangeRates: GetExchangeRates = async ({ exchange, @@ -139,7 +139,7 @@ const inferError = ( const tenPowMagnitude = new BigNumber(10).pow(unitFrom.magnitude); const { amountTo, minAmountFrom, maxAmountFrom, errorCode, errorMessage, provider, status } = responseData; - const isDex = getSwapProvider(provider).type === "DEX"; + const isDex = getProvidersAdditionalData(provider).type === "DEX"; // DEX quotes are out of limits error. We do not know if it is a low or high limit, neither the amount. if ((!minAmountFrom || !maxAmountFrom) && status === "error" && errorCode !== 300 && isDex) { diff --git a/libs/ledger-live-common/src/exchange/swap/getProviders.ts b/libs/ledger-live-common/src/exchange/swap/getProviders.ts deleted file mode 100644 index 5f319c21e462..000000000000 --- a/libs/ledger-live-common/src/exchange/swap/getProviders.ts +++ /dev/null @@ -1,39 +0,0 @@ -import network from "@ledgerhq/live-network/network"; -import qs from "qs"; -import { SwapNoAvailableProviders } from "../../errors"; -import { getAvailableProviders, getSwapAPIBaseURL } from "./"; -import { mockGetProviders } from "./mock"; -import type { GetProviders, ProvidersResponseV4 } from "./types"; -import { isIntegrationTestEnv } from "./utils/isIntegrationTestEnv"; - -const getProviders: GetProviders = async () => { - if (isIntegrationTestEnv()) return mockGetProviders(); - - const res = await network({ - method: "GET", - url: `${getSwapAPIBaseURL()}/providers`, - params: { whitelist: getAvailableProviders() }, - paramsSerializer: params => qs.stringify(params, { arrayFormat: "comma" }), - }); - - const responseV4 = res.data as ProvidersResponseV4; - if (!responseV4.providers || !Object.keys(responseV4.providers).length) { - throw new SwapNoAvailableProviders(); - } - return Object.entries(responseV4.providers).flatMap(([provider, groups]) => ({ - provider: provider, - pairs: groups.flatMap(group => - group.methods.flatMap(tradeMethod => - Object.entries(group.pairs).flatMap(([from, toArray]) => - (toArray as number[]).map(to => ({ - from: responseV4.currencies[from], - to: responseV4.currencies[to.toString()], - tradeMethod, - })), - ), - ), - ), - })); -}; - -export default getProviders; diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyAll.ts b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyAll.ts index 04e3beafe483..302e6cfe48df 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyAll.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyAll.ts @@ -1,14 +1,13 @@ -import { getAvailableProviders } from "../.."; import { useFeature } from "../../../../featureFlags"; import { useAPI } from "../../../../hooks/useAPI"; import { fetchCurrencyAll } from "../../api/v5"; export function useFetchCurrencyAll() { const fetchAdditionalCoins = useFeature("fetchAdditionalCoins"); + const { data, ...rest } = useAPI({ queryFn: fetchCurrencyAll, queryProps: { - providers: getAvailableProviders(), additionalCoinsFlag: fetchAdditionalCoins?.enabled, }, // assume the all currency list for the given props won't change during a users session. diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyFrom.ts b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyFrom.ts index 577504039802..7e3eceb25bec 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyFrom.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyFrom.ts @@ -1,4 +1,3 @@ -import { getAvailableProviders } from "../.."; import { useFeature } from "../../../../featureFlags"; import { useAPI } from "../../../../hooks/useAPI"; import { fetchCurrencyFrom } from "../../api/v5/fetchCurrencyFrom"; @@ -11,10 +10,10 @@ type Props = { export function useFetchCurrencyFrom({ currencyTo, enabled }: Props = {}) { const fetchAdditionalCoins = useFeature("fetchAdditionalCoins"); + return useAPI({ queryFn: fetchCurrencyFrom, queryProps: { - providers: getAvailableProviders(), currencyTo, additionalCoinsFlag: fetchAdditionalCoins?.enabled, }, diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyTo.ts b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyTo.ts index b0cf2f10bfc4..6ba6bf8d4fb6 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyTo.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchCurrencyTo.ts @@ -2,7 +2,6 @@ import { AccountLike } from "@ledgerhq/types-live"; import { getAccountCurrency } from "@ledgerhq/coin-framework/account/helpers"; import { fetchCurrencyTo } from "../../api/v5"; -import { getAvailableProviders } from "../.."; import { useAPI } from "../../../../hooks/useAPI"; import { useFeature } from "../../../../featureFlags"; @@ -13,13 +12,14 @@ type Props = { export function useFetchCurrencyTo({ fromCurrencyAccount }: Props) { const fetchAdditionalCoins = useFeature("fetchAdditionalCoins"); + const currencyFromId = fromCurrencyAccount ? getAccountCurrency(fromCurrencyAccount).id : undefined; + return useAPI({ queryFn: fetchCurrencyTo, queryProps: { - providers: getAvailableProviders(), currencyFromId, additionalCoinsFlag: fetchAdditionalCoins?.enabled, }, diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts index f567479abcce..fc292e694107 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts @@ -1,4 +1,3 @@ -import { getAvailableProviders } from "../.."; import { AccountLike } from "@ledgerhq/types-live"; import { getAccountCurrency } from "@ledgerhq/coin-framework/account/helpers"; import { CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets"; @@ -27,18 +26,18 @@ export function useFetchRates({ : undefined; const unitTo = toCurrency?.units[0]; const moonpayFF = useFeature("ptxSwapMoonpayProvider"); + const removeProviders: string[] = []; const formattedCurrencyAmount = (unitFrom && `${fromCurrencyAmount.shiftedBy(-unitFrom.magnitude)}`) ?? "0"; - const providers = getAvailableProviders(); if (!moonpayFF?.enabled) { - providers.splice(providers.indexOf("moonpay"), 1); + removeProviders.push("moonpay"); } const toCurrencyId = toCurrency?.id; return useAPI({ queryFn: fetchRates, queryProps: { - providers: providers, + removeProviders: [], unitTo: unitTo!, unitFrom: unitFrom!, currencyFrom, diff --git a/libs/ledger-live-common/src/exchange/swap/index.ts b/libs/ledger-live-common/src/exchange/swap/index.ts index c1d471058a32..c4948140a511 100644 --- a/libs/ledger-live-common/src/exchange/swap/index.ts +++ b/libs/ledger-live-common/src/exchange/swap/index.ts @@ -19,7 +19,6 @@ import getCompleteSwapHistory from "./getCompleteSwapHistory"; import initSwap from "./initSwap"; import { postSwapAccepted, postSwapCancelled } from "./postSwapState"; import getExchangeRates from "./getExchangeRates"; -import getProviders from "./getProviders"; export { getAvailableProviders } from "../providers"; @@ -131,7 +130,6 @@ export { getCompleteSwapHistory, postSwapAccepted, getExchangeRates, - getProviders, postSwapCancelled, initSwap, USStates, diff --git a/libs/ledger-live-common/src/exchange/swap/initSwap.ts b/libs/ledger-live-common/src/exchange/swap/initSwap.ts index 9637b67b0728..a29cc887ec21 100644 --- a/libs/ledger-live-common/src/exchange/swap/initSwap.ts +++ b/libs/ledger-live-common/src/exchange/swap/initSwap.ts @@ -72,7 +72,7 @@ const initSwap = (input: InitSwapInput): Observable => { // NB Added the try/catch because of the API stability issues. let res; - const swapProviderConfig = getSwapProvider(provider); + const swapProviderConfig = await getSwapProvider(provider); const headers = { EquipmentId: getEnv("USER_ID"), diff --git a/libs/ledger-live-common/src/exchange/swap/utils/index.ts b/libs/ledger-live-common/src/exchange/swap/utils/index.ts index fdf1d2b49887..8d0d8029bb16 100644 --- a/libs/ledger-live-common/src/exchange/swap/utils/index.ts +++ b/libs/ledger-live-common/src/exchange/swap/utils/index.ts @@ -1,7 +1,7 @@ import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { Account, AccountLike, SubAccount } from "@ledgerhq/types-live"; -import { getSwapProvider } from "../../providers"; import { getAccountCurrency, makeEmptyTokenAccount } from "../../../account"; +import { getProvidersAdditionalData } from "../../providers/swap"; export const FILTER = { centralised: "centralised", @@ -62,7 +62,7 @@ export const getAvailableAccountsById = ( .sort((a, b) => b.balance.minus(a.balance).toNumber()); export const isRegistrationRequired = (provider: string): boolean => { - const { needsBearerToken, needsKYC } = getSwapProvider(provider); + const { needsBearerToken, needsKYC } = getProvidersAdditionalData(provider); return needsBearerToken || needsKYC; };