From a59d94e8c9a5f85f6b5f1e3af849b7746163a434 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 24 Jul 2025 10:37:18 +0100 Subject: [PATCH 01/14] feat(api): add support for v2 endpoint --- src/config.ts | 7 +++++++ src/services/api.ts | 3 ++- src/types/internal.ts | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 9c322fc1..9a4015fc 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,6 +6,7 @@ export const config = (() => { const _config: SDKBaseConfig = { integrator: 'lifi-sdk', apiUrl: 'https://li.quest/v1', + apiV2Url: 'https://li.quest/v2', rpcUrls: {}, chains: [], providers: [], @@ -20,6 +21,12 @@ export const config = (() => { get() { return _config }, + getApiUrl(version: 'v1' | 'v2' = 'v1'): string { + if (version === 'v2' && _config.apiV2Url) { + return _config.apiV2Url + } + return _config.apiUrl + }, set(options: SDKConfig) { const { chains, providers, rpcUrls, ...otherOptions } = options Object.assign(_config, otherOptions) diff --git a/src/services/api.ts b/src/services/api.ts index d54f9197..f2ca5fa2 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -625,8 +625,9 @@ export const getTransactionHistory = async ( } const _config = config.get() + const apiUrl = config.getApiUrl('v2') - const url = new URL(`${_config.apiUrl}/analytics/transfers`) + const url = new URL(`${apiUrl}/analytics/transfers`) url.searchParams.append('integrator', _config.integrator) url.searchParams.append('wallet', wallet) diff --git a/src/types/internal.ts b/src/types/internal.ts index fb5527ef..a7813f6e 100644 --- a/src/types/internal.ts +++ b/src/types/internal.ts @@ -4,6 +4,7 @@ import type { SDKProvider } from '../core/types.js' export interface SDKBaseConfig { apiKey?: string apiUrl: string + apiV2Url?: string integrator: string userId?: string providers: SDKProvider[] From 637bbef025e724a17af0be5535122c55102e772d Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 24 Jul 2025 10:41:36 +0100 Subject: [PATCH 02/14] chore(test): update api tests --- src/services/api.unit.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index f7f8d11b..81c8775e 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -574,7 +574,7 @@ describe('ApiService', () => { describe('getTransactionHistory', () => { it('returns empty array in response', async () => { server.use( - http.get(`${_config.apiUrl}/analytics/transfers`, async () => + http.get(`${_config.apiV2Url}/analytics/transfers`, async () => HttpResponse.json({}) ) ) @@ -586,7 +586,7 @@ describe('ApiService', () => { } const generatedURL = - 'https://li.quest/v1/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&fromTimestamp=1696326609361&toTimestamp=1696326609362' + 'https://li.quest/v2/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&fromTimestamp=1696326609361&toTimestamp=1696326609362' await expect( ApiService.getTransactionHistory(walletAnalyticsRequest) From a7369b36dd879d63d7050eabdd33d383a08f50a5 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 24 Jul 2025 11:02:55 +0100 Subject: [PATCH 03/14] refactor(api): make v2 support more robust and backward compatible --- src/config.ts | 12 +++++--- src/core/execution.unit.handlers.ts | 10 +++--- src/request.unit.spec.ts | 2 +- src/services/api.ts | 48 +++++++++++++++-------------- src/services/api.unit.handlers.ts | 22 ++++++------- src/services/api.unit.spec.ts | 2 +- src/types/internal.ts | 8 +++-- 7 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/config.ts b/src/config.ts index 9a4015fc..5b08e3e7 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,8 +5,10 @@ import type { RPCUrls, SDKBaseConfig, SDKConfig } from './types/internal.js' export const config = (() => { const _config: SDKBaseConfig = { integrator: 'lifi-sdk', - apiUrl: 'https://li.quest/v1', - apiV2Url: 'https://li.quest/v2', + apiUrl: { + v1: 'https://li.quest/v1', + v2: 'https://li.quest/v2', + }, rpcUrls: {}, chains: [], providers: [], @@ -22,10 +24,10 @@ export const config = (() => { return _config }, getApiUrl(version: 'v1' | 'v2' = 'v1'): string { - if (version === 'v2' && _config.apiV2Url) { - return _config.apiV2Url + if (typeof _config.apiUrl === 'string') { + return _config.apiUrl } - return _config.apiUrl + return _config.apiUrl[version] }, set(options: SDKConfig) { const { chains, providers, rpcUrls, ...otherOptions } = options diff --git a/src/core/execution.unit.handlers.ts b/src/core/execution.unit.handlers.ts index 1431cde3..e1b28234 100644 --- a/src/core/execution.unit.handlers.ts +++ b/src/core/execution.unit.handlers.ts @@ -7,10 +7,10 @@ import { mockStepTransactionWithTxRequest, } from './execution.unit.mock.js' -const _config = config.get() +const apiUrl = config.getApiUrl() export const lifiHandlers = [ - http.post(`${_config.apiUrl}/advanced/stepTransaction`, async () => + http.post(`${apiUrl}/advanced/stepTransaction`, async () => HttpResponse.json( mockStepTransactionWithTxRequest( buildStepObject({ @@ -19,12 +19,10 @@ export const lifiHandlers = [ ) ) ), - http.get(`${_config.apiUrl}/chains`, async () => + http.get(`${apiUrl}/chains`, async () => HttpResponse.json({ chains: mockChainsResponse, }) ), - http.get(`${_config.apiUrl}/status`, async () => - HttpResponse.json(mockStatus) - ), + http.get(`${apiUrl}/status`, async () => HttpResponse.json(mockStatus)), ] diff --git a/src/request.unit.spec.ts b/src/request.unit.spec.ts index 67618c7b..e6f9d5c1 100644 --- a/src/request.unit.spec.ts +++ b/src/request.unit.spec.ts @@ -21,7 +21,7 @@ import type { SDKBaseConfig } from './types/internal.js' import type { ExtendedRequestInit } from './types/request.js' import { version } from './version.js' -const apiUrl = config.get().apiUrl +const apiUrl = config.getApiUrl() describe('request new', () => { const server = setupServer(...handlers) diff --git a/src/services/api.ts b/src/services/api.ts index f2ca5fa2..a971e395 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -92,7 +92,7 @@ export const getQuote = async ( } return await request( - `${_config.apiUrl}/quote?${new URLSearchParams( + `${config.getApiUrl()}/quote?${new URLSearchParams( params as unknown as Record )}`, { @@ -123,14 +123,17 @@ export const getRoutes = async ( ...params.options, } - return await request(`${_config.apiUrl}/advanced/routes`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(params), - signal: options?.signal, - }) + return await request( + `${config.getApiUrl()}/advanced/routes`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(params), + signal: options?.signal, + } + ) } /** @@ -186,7 +189,7 @@ export const getContractCallsQuote = async ( params.denyExchanges ??= _config.routeOptions?.exchanges?.deny params.preferExchanges ??= _config.routeOptions?.exchanges?.prefer // send request - return await request(`${_config.apiUrl}/quote/contractCalls`, { + return await request(`${config.getApiUrl()}/quote/contractCalls`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -213,7 +216,7 @@ export const getStepTransaction = async ( } return await request( - `${config.get().apiUrl}/advanced/stepTransaction`, + `${config.getApiUrl()}/advanced/stepTransaction`, { method: 'POST', headers: { @@ -245,7 +248,7 @@ export const getStatus = async ( params as unknown as Record ) return await request( - `${config.get().apiUrl}/status?${queryParams}`, + `${config.getApiUrl()}/status?${queryParams}`, { signal: options?.signal, } @@ -301,7 +304,7 @@ export const getRelayerQuote = async ( } const result = await request( - `${config.get().apiUrl}/relayer/quote?${new URLSearchParams( + `${config.getApiUrl()}/relayer/quote?${new URLSearchParams( params as unknown as Record )}`, { @@ -344,7 +347,7 @@ export const relayTransaction = async ( } const result = await request( - `${config.get().apiUrl}/relayer/relay`, + `${config.getApiUrl()}/relayer/relay`, { method: 'POST', headers: { @@ -393,7 +396,7 @@ export const getRelayedTransactionStatus = async ( otherParams as unknown as Record ) const result = await request( - `${config.get().apiUrl}/relayer/status/${taskId}?${queryParams}`, + `${config.getApiUrl()}/relayer/status/${taskId}?${queryParams}`, { signal: options?.signal, } @@ -434,7 +437,7 @@ export const getChains = async ( const response = await withDedupe( () => request( - `${config.get().apiUrl}/chains?${urlSearchParams}`, + `${config.getApiUrl()}/chains?${urlSearchParams}`, { signal: options?.signal, } @@ -467,7 +470,7 @@ export const getTokens = async ( const response = await withDedupe( () => request( - `${config.get().apiUrl}/tokens?${urlSearchParams}`, + `${config.getApiUrl()}/tokens?${urlSearchParams}`, { signal: options?.signal, } @@ -501,7 +504,7 @@ export const getToken = async ( ) } return await request( - `${config.get().apiUrl}/token?${new URLSearchParams({ + `${config.getApiUrl()}/token?${new URLSearchParams({ chain, token, } as Record)}`, @@ -529,7 +532,7 @@ export const getTools = async ( } } return await request( - `${config.get().apiUrl}/tools?${new URLSearchParams( + `${config.getApiUrl()}/tools?${new URLSearchParams( params as Record )}`, { @@ -555,7 +558,7 @@ export const getGasRecommendation = async ( ) } - const url = new URL(`${config.get().apiUrl}/gas/suggestion/${params.chainId}`) + const url = new URL(`${config.getApiUrl()}/gas/suggestion/${params.chainId}`) if (params.fromChain) { url.searchParams.append('fromChain', params.fromChain as unknown as string) } @@ -578,7 +581,7 @@ export const getConnections = async ( connectionRequest: ConnectionsRequest, options?: RequestOptions ): Promise => { - const url = new URL(`${config.get().apiUrl}/connections`) + const url = new URL(`${config.getApiUrl()}/connections`) const { fromChain, fromToken, toChain, toToken } = connectionRequest @@ -625,9 +628,8 @@ export const getTransactionHistory = async ( } const _config = config.get() - const apiUrl = config.getApiUrl('v2') - const url = new URL(`${apiUrl}/analytics/transfers`) + const url = new URL(`${config.getApiUrl('v2')}/analytics/transfers`) url.searchParams.append('integrator', _config.integrator) url.searchParams.append('wallet', wallet) diff --git a/src/services/api.unit.handlers.ts b/src/services/api.unit.handlers.ts index 6149b608..1fb32bfe 100644 --- a/src/services/api.unit.handlers.ts +++ b/src/services/api.unit.handlers.ts @@ -3,35 +3,35 @@ import { ChainId, CoinKey } from '@lifi/types' import { HttpResponse, http } from 'msw' import { config } from '../config.js' -const _config = config.get() +const apiUrl = config.getApiUrl() export const handlers = [ - http.post(`${_config.apiUrl}/advanced/routes`, async () => { + http.post(`${apiUrl}/advanced/routes`, async () => { return HttpResponse.json({}) }), - http.post(`${_config.apiUrl}/advanced/possibilities`, async () => + http.post(`${apiUrl}/advanced/possibilities`, async () => HttpResponse.json({}) ), - http.get(`${_config.apiUrl}/token`, async () => HttpResponse.json({})), - http.get(`${_config.apiUrl}/quote`, async () => HttpResponse.json({})), - http.get(`${_config.apiUrl}/status`, async () => HttpResponse.json({})), - http.get(`${_config.apiUrl}/chains`, async () => + http.get(`${apiUrl}/token`, async () => HttpResponse.json({})), + http.get(`${apiUrl}/quote`, async () => HttpResponse.json({})), + http.get(`${apiUrl}/status`, async () => HttpResponse.json({})), + http.get(`${apiUrl}/chains`, async () => HttpResponse.json({ chains: [{ id: 1 }] }) ), - http.get(`${_config.apiUrl}/tools`, async () => + http.get(`${apiUrl}/tools`, async () => HttpResponse.json({ bridges: [], exchanges: [] }) ), - http.get(`${_config.apiUrl}/tokens`, async () => + http.get(`${apiUrl}/tokens`, async () => HttpResponse.json({ tokens: { [ChainId.ETH]: [findDefaultToken(CoinKey.ETH, ChainId.ETH)], }, }) ), - http.post(`${_config.apiUrl}/advanced/stepTransaction`, async () => + http.post(`${apiUrl}/advanced/stepTransaction`, async () => HttpResponse.json({}) ), - http.get(`${_config.apiUrl}/gas/suggestion/${ChainId.OPT}`, async () => + http.get(`${apiUrl}/gas/suggestion/${ChainId.OPT}`, async () => HttpResponse.json({}) ), ] diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index 81c8775e..4ec88dab 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -540,7 +540,7 @@ describe('ApiService', () => { describe('getAvailableConnections', () => { it('returns empty array in response', async () => { server.use( - http.get(`${_config.apiUrl}/connections`, async () => + http.get(`${config.getApiUrl()}/connections`, async () => HttpResponse.json({ connections: [] }) ) ) diff --git a/src/types/internal.ts b/src/types/internal.ts index a7813f6e..ff4d24d6 100644 --- a/src/types/internal.ts +++ b/src/types/internal.ts @@ -3,8 +3,12 @@ import type { SDKProvider } from '../core/types.js' export interface SDKBaseConfig { apiKey?: string - apiUrl: string - apiV2Url?: string + apiUrl: + | string + | { + v1: string + v2: string + } integrator: string userId?: string providers: SDKProvider[] From 3dd2e65480f4f48545e27f2fac9d855765d67748 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 24 Jul 2025 11:03:37 +0100 Subject: [PATCH 04/14] chore(test): update api tests --- src/services/api.unit.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index 4ec88dab..51aec5c3 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -574,7 +574,7 @@ describe('ApiService', () => { describe('getTransactionHistory', () => { it('returns empty array in response', async () => { server.use( - http.get(`${_config.apiV2Url}/analytics/transfers`, async () => + http.get(`${config.getApiUrl('v2')}/analytics/transfers`, async () => HttpResponse.json({}) ) ) From 3caacbf97049acd94193c29ab6b2f69d1a077268 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 24 Jul 2025 11:04:00 +0100 Subject: [PATCH 05/14] chore(test): update api tests --- src/services/api.unit.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index 51aec5c3..115dcfc2 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -34,7 +34,6 @@ import { handlers } from './api.unit.handlers.js' const mockedFetch = vi.spyOn(request, 'request') describe('ApiService', () => { - const _config = config.get() const server = setupServer(...handlers) beforeAll(() => { setupTestEnvironment() From 7f3559065b66e95ecbcc417f4479b0187ff81a5e Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 12:49:19 +0100 Subject: [PATCH 06/14] feat(analytics): add paginated data types --- src/config.ts | 10 ++-------- src/services/api.ts | 29 ++++++++++++++++++++++++----- src/types/internal.ts | 7 +------ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/config.ts b/src/config.ts index 5b08e3e7..e873e986 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,10 +5,7 @@ import type { RPCUrls, SDKBaseConfig, SDKConfig } from './types/internal.js' export const config = (() => { const _config: SDKBaseConfig = { integrator: 'lifi-sdk', - apiUrl: { - v1: 'https://li.quest/v1', - v2: 'https://li.quest/v2', - }, + apiUrl: 'https://li.quest', rpcUrls: {}, chains: [], providers: [], @@ -24,10 +21,7 @@ export const config = (() => { return _config }, getApiUrl(version: 'v1' | 'v2' = 'v1'): string { - if (typeof _config.apiUrl === 'string') { - return _config.apiUrl - } - return _config.apiUrl[version] + return `${_config.apiUrl}/${version}` }, set(options: SDKConfig) { const { chains, providers, rpcUrls, ...otherOptions } = options diff --git a/src/services/api.ts b/src/services/api.ts index c8a28ba7..ccb129d4 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -31,13 +31,13 @@ import { type ToolsRequest, type ToolsResponse, type TransactionAnalyticsRequest, - type TransactionAnalyticsResponse, } from '@lifi/types' import { config } from '../config.js' import { BaseError } from '../errors/baseError.js' import { ErrorName } from '../errors/constants.js' import { ValidationError } from '../errors/errors.js' import { SDKError } from '../errors/SDKError.js' +import type { PaginatedResponse, PaginationQuery } from '../index.js' import { request } from '../request.js' import { isRoutesRequest, isStep } from '../typeguards.js' import { withDedupe } from '../utils/withDedupe.js' @@ -618,9 +618,17 @@ export const getConnections = async ( } export const getTransactionHistory = async ( - { wallet, status, fromTimestamp, toTimestamp }: TransactionAnalyticsRequest, + { + wallet, + status, + fromTimestamp, + toTimestamp, + limit, + next, + previous, + }: TransactionAnalyticsRequest & PaginationQuery, options?: RequestOptions -): Promise => { +): Promise> => { if (!wallet) { throw new SDKError( new ValidationError('Required parameter "wallet" is missing.') @@ -630,7 +638,6 @@ export const getTransactionHistory = async ( const _config = config.get() const url = new URL(`${config.getApiUrl('v2')}/analytics/transfers`) - url.searchParams.append('integrator', _config.integrator) url.searchParams.append('wallet', wallet) @@ -646,5 +653,17 @@ export const getTransactionHistory = async ( url.searchParams.append('toTimestamp', toTimestamp.toString()) } - return await request(url, options) + if (limit) { + url.searchParams.append('limit', limit.toString()) + } + + if (next) { + url.searchParams.append('next', next.toString()) + } + + if (previous) { + url.searchParams.append('previous', previous.toString()) + } + + return await request>(url, options) } diff --git a/src/types/internal.ts b/src/types/internal.ts index ff4d24d6..fb5527ef 100644 --- a/src/types/internal.ts +++ b/src/types/internal.ts @@ -3,12 +3,7 @@ import type { SDKProvider } from '../core/types.js' export interface SDKBaseConfig { apiKey?: string - apiUrl: - | string - | { - v1: string - v2: string - } + apiUrl: string integrator: string userId?: string providers: SDKProvider[] From 09988f256d280ec30eefd0931b0ae1d0c0f99e79 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 12:50:26 +0100 Subject: [PATCH 07/14] fix(analytics): fix types imports --- src/services/api.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/api.ts b/src/services/api.ts index ccb129d4..5686d1af 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -12,6 +12,8 @@ import { isContractCallsRequestWithFromAmount, isContractCallsRequestWithToAmount, type LiFiStep, + type PaginatedResponse, + type PaginationQuery, type QuoteRequest, type RelayerQuoteResponse, type RelayRequest, @@ -37,7 +39,6 @@ import { BaseError } from '../errors/baseError.js' import { ErrorName } from '../errors/constants.js' import { ValidationError } from '../errors/errors.js' import { SDKError } from '../errors/SDKError.js' -import type { PaginatedResponse, PaginationQuery } from '../index.js' import { request } from '../request.js' import { isRoutesRequest, isStep } from '../typeguards.js' import { withDedupe } from '../utils/withDedupe.js' From ecdfc7af948243a999f2e0b018f3a5e026f4a5cc Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 13:01:56 +0100 Subject: [PATCH 08/14] feat(analytics): set items limit default to 1000 --- src/services/api.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/services/api.ts b/src/services/api.ts index 5686d1af..489d7379 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -624,7 +624,7 @@ export const getTransactionHistory = async ( status, fromTimestamp, toTimestamp, - limit, + limit = 1000, next, previous, }: TransactionAnalyticsRequest & PaginationQuery, @@ -641,6 +641,7 @@ export const getTransactionHistory = async ( const url = new URL(`${config.getApiUrl('v2')}/analytics/transfers`) url.searchParams.append('integrator', _config.integrator) url.searchParams.append('wallet', wallet) + url.searchParams.append('limit', limit.toString()) if (status) { url.searchParams.append('status', status) @@ -654,10 +655,6 @@ export const getTransactionHistory = async ( url.searchParams.append('toTimestamp', toTimestamp.toString()) } - if (limit) { - url.searchParams.append('limit', limit.toString()) - } - if (next) { url.searchParams.append('next', next.toString()) } From d7d7f982fe8b9ec0f45615e089b1d60fa85625dc Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 13:03:59 +0100 Subject: [PATCH 09/14] chore(analytics): update tests --- src/services/api.unit.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index 115dcfc2..f1c96225 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -585,7 +585,7 @@ describe('ApiService', () => { } const generatedURL = - 'https://li.quest/v2/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&fromTimestamp=1696326609361&toTimestamp=1696326609362' + 'https://li.quest/v2/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&limit=1000&fromTimestamp=1696326609361&toTimestamp=1696326609362' await expect( ApiService.getTransactionHistory(walletAnalyticsRequest) From 94b814d777909c376f41bb6cf8b43eb90e12e58c Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 14:08:33 +0100 Subject: [PATCH 10/14] chore(analytics): add check for config url --- src/config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.ts b/src/config.ts index e873e986..71054fbe 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,6 +21,9 @@ export const config = (() => { return _config }, getApiUrl(version: 'v1' | 'v2' = 'v1'): string { + if (_config.apiUrl.endsWith('v1') || _config.apiUrl.endsWith('v2')) { + return _config.apiUrl + } return `${_config.apiUrl}/${version}` }, set(options: SDKConfig) { From 8bd444b2fae88996802539941e84fb76d2fb641b Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Tue, 29 Jul 2025 14:23:45 +0100 Subject: [PATCH 11/14] chore(analytics): add check for config url --- src/config.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/config.ts b/src/config.ts index 71054fbe..337a67ec 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,10 +21,8 @@ export const config = (() => { return _config }, getApiUrl(version: 'v1' | 'v2' = 'v1'): string { - if (_config.apiUrl.endsWith('v1') || _config.apiUrl.endsWith('v2')) { - return _config.apiUrl - } - return `${_config.apiUrl}/${version}` + const baseUrl = _config.apiUrl.replace(/\/v[12]\/?$/, '') + return `${baseUrl}/${version}` }, set(options: SDKConfig) { const { chains, providers, rpcUrls, ...otherOptions } = options From be82f5718831ed18f52f57a040c273e8297814a3 Mon Sep 17 00:00:00 2001 From: tomide oladipo Date: Thu, 7 Aug 2025 12:07:32 +0100 Subject: [PATCH 12/14] refactor(config): replace regex url parsing with native URL object --- src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 337a67ec..f9ef0703 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,7 +21,7 @@ export const config = (() => { return _config }, getApiUrl(version: 'v1' | 'v2' = 'v1'): string { - const baseUrl = _config.apiUrl.replace(/\/v[12]\/?$/, '') + const baseUrl = new URL(_config.apiUrl).origin return `${baseUrl}/${version}` }, set(options: SDKConfig) { From 663578bfa31e8d3c76ca99e2e4c2dc67c7a29dd3 Mon Sep 17 00:00:00 2001 From: tomide Date: Tue, 9 Sep 2025 17:24:58 +0200 Subject: [PATCH 13/14] refactor(analytics): set default limit to 10, and remove wallet check --- src/services/api.ts | 13 +++++-------- src/services/api.unit.spec.ts | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/services/api.ts b/src/services/api.ts index 71441245..2e548c6f 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -674,25 +674,22 @@ export const getTransactionHistory = async ( status, fromTimestamp, toTimestamp, - limit = 1000, + limit = 10, next, previous, }: TransactionAnalyticsRequest & PaginationQuery, options?: RequestOptions ): Promise> => { - if (!wallet) { - throw new SDKError( - new ValidationError('Required parameter "wallet" is missing.') - ) - } - const _config = config.get() const url = new URL(`${config.getApiUrl('v2')}/analytics/transfers`) url.searchParams.append('integrator', _config.integrator) - url.searchParams.append('wallet', wallet) url.searchParams.append('limit', limit.toString()) + if (wallet) { + url.searchParams.append('wallet', wallet) + } + if (status) { url.searchParams.append('status', status) } diff --git a/src/services/api.unit.spec.ts b/src/services/api.unit.spec.ts index a38d550a..13a77be7 100644 --- a/src/services/api.unit.spec.ts +++ b/src/services/api.unit.spec.ts @@ -606,7 +606,7 @@ describe('ApiService', () => { } const generatedURL = - 'https://li.quest/v2/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&limit=1000&fromTimestamp=1696326609361&toTimestamp=1696326609362' + 'https://li.quest/v2/analytics/transfers?integrator=lifi-sdk&limit=10&wallet=0x5520abcd&fromTimestamp=1696326609361&toTimestamp=1696326609362' await expect( ApiService.getTransactionHistory(walletAnalyticsRequest) From 7d0a7f297146da15c9efef9b72abeff9342198d8 Mon Sep 17 00:00:00 2001 From: tomide Date: Tue, 9 Sep 2025 17:34:06 +0200 Subject: [PATCH 14/14] fix(api): update url: --- src/services/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/api.ts b/src/services/api.ts index 2e548c6f..605525ca 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -127,7 +127,7 @@ export async function getQuote( } return await request( - `${_config.apiUrl}/${isFromAmountRequest ? 'quote' : 'quote/toAmount'}?${new URLSearchParams( + `${config.getApiUrl()}/${isFromAmountRequest ? 'quote' : 'quote/toAmount'}?${new URLSearchParams( params as unknown as Record )}`, {