@lifi/sdk 4.0.0-alpha.1 → 4.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +201 -165
  2. package/dist/cjs/client/getClientStorage.js +3 -4
  3. package/dist/cjs/client/getClientStorage.js.map +1 -1
  4. package/dist/cjs/version.d.ts +1 -1
  5. package/dist/cjs/version.js +1 -1
  6. package/dist/esm/client/getClientStorage.js +4 -4
  7. package/dist/esm/client/getClientStorage.js.map +1 -1
  8. package/dist/esm/version.d.ts +1 -1
  9. package/dist/esm/version.js +1 -1
  10. package/dist/types/client/getClientStorage.d.ts.map +1 -1
  11. package/dist/types/version.d.ts +1 -1
  12. package/package.json +17 -2
  13. package/src/client/getClientStorage.ts +5 -4
  14. package/src/version.ts +1 -1
  15. package/CHANGELOG.md +0 -1272
  16. package/package.json.tmp +0 -103
  17. package/src/actions/actions.unit.handlers.ts +0 -78
  18. package/src/actions/getChains.unit.spec.ts +0 -19
  19. package/src/actions/getConnections.unit.spec.ts +0 -45
  20. package/src/actions/getContractCallsQuote.unit.spec.ts +0 -323
  21. package/src/actions/getGasRecommendation.unit.spec.ts +0 -40
  22. package/src/actions/getNameServiceAddress.unit.spec.ts +0 -169
  23. package/src/actions/getQuote.int.spec.ts +0 -18
  24. package/src/actions/getQuote.unit.spec.ts +0 -154
  25. package/src/actions/getRelayedTransactionStatus.unit.spec.ts +0 -243
  26. package/src/actions/getRelayerQuote.unit.spec.ts +0 -220
  27. package/src/actions/getRoutes.unit.spec.ts +0 -112
  28. package/src/actions/getStatus.unit.spec.ts +0 -53
  29. package/src/actions/getStepTransaction.unit.spec.ts +0 -140
  30. package/src/actions/getToken.unit.spec.ts +0 -45
  31. package/src/actions/getTokenBalance.unit.spec.ts +0 -61
  32. package/src/actions/getTokenBalances.unit.spec.ts +0 -68
  33. package/src/actions/getTokenBalancesByChain.unit.spec.ts +0 -108
  34. package/src/actions/getTokens.unit.spec.ts +0 -16
  35. package/src/actions/getTools.unit.spec.ts +0 -20
  36. package/src/actions/getTransactionHistory.unit.spec.ts +0 -36
  37. package/src/actions/getWalletBalances.unit.spec.ts +0 -90
  38. package/src/actions/relayTransaction.unit.spec.ts +0 -229
  39. package/src/client/createClient.unit.spec.ts +0 -274
  40. package/src/client/getClientStorage.unit.spec.ts +0 -382
  41. package/src/core/StatusManager.unit.spec.ts +0 -298
  42. package/src/core/execution.unit.handlers.ts +0 -32
  43. package/src/core/execution.unit.mock.ts +0 -252
  44. package/src/core/execution.unit.spec.ts +0 -86
  45. package/src/core/stepComparison.unit.spec.ts +0 -89
  46. package/src/errors/SDKError.unit.spec.ts +0 -160
  47. package/src/errors/baseError.unit.spec.ts +0 -22
  48. package/src/errors/httpError.unit.spec.ts +0 -125
  49. package/src/errors/utils/baseErrorRootCause.unit.spec.ts +0 -89
  50. package/src/errors/utils/rootCause.unit.spec.ts +0 -36
  51. package/src/utils/checkPackageUpdates.unit.spec.ts +0 -71
  52. package/src/utils/convertQuoteToRoute.unit.spec.ts +0 -56
  53. package/src/utils/fetchTxErrorDetails.unit.spec.ts +0 -42
  54. package/src/utils/getTransactionMessage.unit.spec.ts +0 -38
  55. package/src/utils/isRoutesRequest.unit.spec.ts +0 -46
  56. package/src/utils/isStep.unit.spec.ts +0 -55
  57. package/src/utils/isToken.unit.spec.ts +0 -49
  58. package/src/utils/request.unit.spec.ts +0 -159
  59. package/src/utils/sleep.unit.spec.ts +0 -17
  60. package/src/utils/waitForResult.unit.spec.ts +0 -75
  61. package/src/utils/withDedupe.unit.spec.ts +0 -26
  62. package/tsconfig.json +0 -18
@@ -1,108 +0,0 @@
1
- import { findDefaultToken } from '@lifi/data-types'
2
- import type { Token } from '@lifi/types'
3
- import { ChainId, CoinKey } from '@lifi/types'
4
- import { beforeEach, describe, expect, it, vi } from 'vitest'
5
- import { client } from './actions.unit.handlers.js'
6
- import { getTokenBalancesByChain } from './getTokenBalancesByChain.js'
7
-
8
- const mockedGetTokenBalancesForChains = vi.spyOn(
9
- await import('./getTokenBalancesByChain.js'),
10
- 'getTokenBalancesByChain'
11
- )
12
-
13
- describe('getTokenBalancesByChain', () => {
14
- beforeEach(() => {
15
- vi.clearAllMocks()
16
- })
17
-
18
- const SOME_TOKEN = {
19
- ...findDefaultToken(CoinKey.USDC, ChainId.DAI),
20
- priceUSD: '',
21
- }
22
- const SOME_WALLET_ADDRESS = 'some wallet address'
23
-
24
- describe('user input is invalid', () => {
25
- it('should throw Error because of missing walletAddress', async () => {
26
- await expect(
27
- getTokenBalancesByChain(client, '', {
28
- [ChainId.DAI]: [SOME_TOKEN],
29
- })
30
- ).rejects.toThrow('Missing walletAddress.')
31
- })
32
-
33
- it('should throw Error because of an invalid token', async () => {
34
- await expect(
35
- getTokenBalancesByChain(client, SOME_WALLET_ADDRESS, {
36
- [ChainId.DAI]: [{ not: 'a token' } as unknown as Token],
37
- })
38
- ).rejects.toThrow('Invalid tokens passed.')
39
- })
40
-
41
- it('should return empty token list as it is', async () => {
42
- mockedGetTokenBalancesForChains.mockReturnValue(Promise.resolve([]))
43
-
44
- const result = await getTokenBalancesByChain(
45
- client,
46
- SOME_WALLET_ADDRESS,
47
- {
48
- [ChainId.DAI]: [],
49
- }
50
- )
51
-
52
- expect(result).toEqual([])
53
- expect(mockedGetTokenBalancesForChains).toHaveBeenCalledTimes(1)
54
- })
55
- })
56
-
57
- describe('user input is valid', () => {
58
- it('should call the balance service', async () => {
59
- const balanceResponse = {
60
- [ChainId.DAI]: [
61
- {
62
- ...SOME_TOKEN,
63
- amount: 123n,
64
- blockNumber: 1n,
65
- },
66
- ],
67
- }
68
-
69
- mockedGetTokenBalancesForChains.mockReturnValue(
70
- Promise.resolve(balanceResponse)
71
- )
72
-
73
- const result = await getTokenBalancesByChain(
74
- client,
75
- SOME_WALLET_ADDRESS,
76
- {
77
- [ChainId.DAI]: [SOME_TOKEN],
78
- }
79
- )
80
-
81
- expect(mockedGetTokenBalancesForChains).toHaveBeenCalledTimes(1)
82
- expect(result).toEqual(balanceResponse)
83
- })
84
- })
85
-
86
- describe('provider is not the same as the chain type', () => {
87
- it('should return the tokens as is', async () => {
88
- const balanceResponse = {
89
- [ChainId.DAI]: [SOME_TOKEN],
90
- }
91
-
92
- mockedGetTokenBalancesForChains.mockReturnValue(
93
- Promise.resolve(balanceResponse)
94
- )
95
-
96
- const result = await getTokenBalancesByChain(
97
- client,
98
- SOME_WALLET_ADDRESS,
99
- {
100
- [ChainId.DAI]: [SOME_TOKEN],
101
- }
102
- )
103
-
104
- expect(mockedGetTokenBalancesForChains).toHaveBeenCalledTimes(1)
105
- expect(result).toEqual(balanceResponse)
106
- })
107
- })
108
- })
@@ -1,16 +0,0 @@
1
- import { ChainId } from '@lifi/types'
2
- import { describe, expect, it } from 'vitest'
3
- import { client, setupTestServer } from './actions.unit.handlers.js'
4
- import { getTokens } from './getTokens.js'
5
-
6
- describe('getTokens', () => {
7
- setupTestServer()
8
-
9
- it('return the tokens', async () => {
10
- const result = await getTokens(client, {
11
- chains: [ChainId.ETH, ChainId.POL],
12
- })
13
- expect(result).toBeDefined()
14
- expect(result.tokens[ChainId.ETH]).toBeDefined()
15
- })
16
- })
@@ -1,20 +0,0 @@
1
- import { ChainId } from '@lifi/types'
2
- import { describe, expect, it } from 'vitest'
3
- import { client, setupTestServer } from './actions.unit.handlers.js'
4
- import { getTools } from './getTools.js'
5
-
6
- describe('getTools', () => {
7
- setupTestServer()
8
-
9
- describe('and the backend succeeds', () => {
10
- it('returns the tools', async () => {
11
- const tools = await getTools(client, {
12
- chains: [ChainId.ETH, ChainId.POL],
13
- })
14
-
15
- expect(tools).toBeDefined()
16
- expect(tools.bridges).toBeDefined()
17
- expect(tools.exchanges).toBeDefined()
18
- })
19
- })
20
- })
@@ -1,36 +0,0 @@
1
- import type { TransactionAnalyticsRequest } from '@lifi/types'
2
- import { HttpResponse, http } from 'msw'
3
- import { describe, expect, it, vi } from 'vitest'
4
- import * as request from '../utils/request.js'
5
- import { client, setupTestServer } from './actions.unit.handlers.js'
6
- import { getTransactionHistory } from './getTransactionHistory.js'
7
-
8
- const mockedFetch = vi.spyOn(request, 'request')
9
-
10
- describe('getTransactionHistory', () => {
11
- const server = setupTestServer()
12
-
13
- it('returns empty array in response', async () => {
14
- server.use(
15
- http.get(`${client.config.apiUrl}/analytics/transfers`, async () =>
16
- HttpResponse.json({})
17
- )
18
- )
19
-
20
- const walletAnalyticsRequest: TransactionAnalyticsRequest = {
21
- fromTimestamp: 1696326609361,
22
- toTimestamp: 1696326609362,
23
- wallet: '0x5520abcd',
24
- }
25
-
26
- const generatedURL =
27
- 'https://li.quest/v1/analytics/transfers?integrator=lifi-sdk&wallet=0x5520abcd&fromTimestamp=1696326609361&toTimestamp=1696326609362'
28
-
29
- await expect(
30
- getTransactionHistory(client, walletAnalyticsRequest)
31
- ).resolves.toEqual({})
32
-
33
- expect((mockedFetch.mock.calls[0][1] as URL).href).toEqual(generatedURL)
34
- expect(mockedFetch).toHaveBeenCalledOnce()
35
- })
36
- })
@@ -1,90 +0,0 @@
1
- import { findDefaultToken } from '@lifi/data-types'
2
- import type { WalletTokenExtended } from '@lifi/types'
3
- import { ChainId, CoinKey } from '@lifi/types'
4
- import { beforeEach, describe, expect, it, vi } from 'vitest'
5
- import { client } from './actions.unit.handlers.js'
6
- import { getWalletBalances } from './getWalletBalances.js'
7
-
8
- const mockedGetWalletBalances = vi.spyOn(
9
- await import('./getWalletBalances.js'),
10
- 'getWalletBalances'
11
- )
12
-
13
- describe('getWalletBalances', () => {
14
- beforeEach(() => {
15
- vi.clearAllMocks()
16
- })
17
-
18
- const SOME_TOKEN = {
19
- ...findDefaultToken(CoinKey.USDC, ChainId.DAI),
20
- priceUSD: '',
21
- }
22
- const SOME_WALLET_ADDRESS = 'some wallet address'
23
-
24
- describe('user input is invalid', () => {
25
- it('should throw Error because of missing walletAddress', async () => {
26
- await expect(getWalletBalances(client, '')).rejects.toThrow(
27
- 'Missing walletAddress.'
28
- )
29
- })
30
- })
31
-
32
- describe('user input is valid', () => {
33
- it('should call the balance service without options', async () => {
34
- const balanceResponse: Record<number, WalletTokenExtended[]> = {
35
- [ChainId.DAI]: [
36
- {
37
- ...SOME_TOKEN,
38
- amount: '123',
39
- marketCapUSD: 1000000,
40
- volumeUSD24H: 50000,
41
- fdvUSD: 2000000,
42
- },
43
- ],
44
- }
45
-
46
- mockedGetWalletBalances.mockReturnValue(Promise.resolve(balanceResponse))
47
-
48
- const result = await getWalletBalances(client, SOME_WALLET_ADDRESS)
49
-
50
- expect(mockedGetWalletBalances).toHaveBeenCalledTimes(1)
51
- expect(mockedGetWalletBalances).toHaveBeenCalledWith(
52
- client,
53
- SOME_WALLET_ADDRESS
54
- )
55
- expect(result).toEqual(balanceResponse)
56
- })
57
-
58
- it('should call the balance service with options', async () => {
59
- const balanceResponse: Record<number, WalletTokenExtended[]> = {
60
- [ChainId.DAI]: [
61
- {
62
- ...SOME_TOKEN,
63
- amount: '123',
64
- marketCapUSD: 1000000,
65
- volumeUSD24H: 50000,
66
- fdvUSD: 2000000,
67
- },
68
- ],
69
- }
70
-
71
- const options = { signal: new AbortController().signal }
72
-
73
- mockedGetWalletBalances.mockReturnValue(Promise.resolve(balanceResponse))
74
-
75
- const result = await getWalletBalances(
76
- client,
77
- SOME_WALLET_ADDRESS,
78
- options
79
- )
80
-
81
- expect(mockedGetWalletBalances).toHaveBeenCalledTimes(1)
82
- expect(mockedGetWalletBalances).toHaveBeenCalledWith(
83
- client,
84
- SOME_WALLET_ADDRESS,
85
- options
86
- )
87
- expect(result).toEqual(balanceResponse)
88
- })
89
- })
90
- })
@@ -1,229 +0,0 @@
1
- import type { RelayRequest, RelayResponse, RequestOptions } from '@lifi/types'
2
- import { HttpResponse, http } from 'msw'
3
- import { describe, expect, it } from 'vitest'
4
- import { BaseError } from '../errors/baseError.js'
5
- import { ErrorName } from '../errors/constants.js'
6
- import { SDKError } from '../errors/SDKError.js'
7
- import { client, setupTestServer } from './actions.unit.handlers.js'
8
- import { relayTransaction } from './relayTransaction.js'
9
-
10
- describe('relayTransaction', () => {
11
- const server = setupTestServer()
12
-
13
- const createMockRelayRequest = (typedData: any[]): RelayRequest => ({
14
- type: 'lifi',
15
- id: 'test-step-id',
16
- includedSteps: [],
17
- tool: 'test-tool',
18
- toolDetails: {
19
- key: 'test-tool',
20
- name: 'Test Tool',
21
- logoURI: 'https://example.com/logo.png',
22
- },
23
- action: {
24
- fromChainId: 1,
25
- toChainId: 1,
26
- fromToken: {
27
- address: '0x1234567890123456789012345678901234567890',
28
- symbol: 'TEST',
29
- decimals: 18,
30
- chainId: 1,
31
- name: 'Test Token',
32
- priceUSD: '1.00',
33
- },
34
- toToken: {
35
- address: '0x0987654321098765432109876543210987654321',
36
- symbol: 'TEST2',
37
- decimals: 18,
38
- chainId: 1,
39
- name: 'Test Token 2',
40
- priceUSD: '1.00',
41
- },
42
- fromAmount: '1000000000000000000',
43
- },
44
- estimate: {
45
- fromAmount: '1000000000000000000',
46
- toAmount: '1000000000000000000',
47
- toAmountMin: '1000000000000000000',
48
- approvalAddress: '0x1234567890123456789012345678901234567890',
49
- tool: 'test-tool',
50
- executionDuration: 30000,
51
- },
52
- transactionRequest: {
53
- to: '0x1234567890123456789012345678901234567890',
54
- data: '0x',
55
- value: '0',
56
- gasLimit: '100000',
57
- },
58
- typedData,
59
- })
60
-
61
- const mockRelayRequest: RelayRequest = createMockRelayRequest([
62
- {
63
- domain: {
64
- name: 'Test Token',
65
- version: '1',
66
- chainId: 1,
67
- verifyingContract: '0x1234567890123456789012345678901234567890',
68
- },
69
- types: {
70
- Permit: [
71
- { name: 'owner', type: 'address' },
72
- { name: 'spender', type: 'address' },
73
- { name: 'value', type: 'uint256' },
74
- { name: 'nonce', type: 'uint256' },
75
- { name: 'deadline', type: 'uint256' },
76
- ],
77
- },
78
- primaryType: 'Permit',
79
- message: {
80
- owner: '0x1234567890123456789012345678901234567890',
81
- spender: '0x0987654321098765432109876543210987654321',
82
- value: '1000000000000000000',
83
- nonce: 0,
84
- deadline: 1234567890,
85
- },
86
- signature:
87
- '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12',
88
- },
89
- ])
90
-
91
- const mockRelayRequestWithPermitWitness: RelayRequest =
92
- createMockRelayRequest([
93
- {
94
- domain: {
95
- name: 'Test Token',
96
- version: '1',
97
- chainId: 1,
98
- verifyingContract: '0x1234567890123456789012345678901234567890',
99
- },
100
- types: {
101
- PermitWitnessTransferFrom: [
102
- { name: 'owner', type: 'address' },
103
- { name: 'spender', type: 'address' },
104
- { name: 'value', type: 'uint256' },
105
- { name: 'nonce', type: 'uint256' },
106
- { name: 'deadline', type: 'uint256' },
107
- ],
108
- },
109
- primaryType: 'PermitWitnessTransferFrom',
110
- message: {
111
- owner: '0x1234567890123456789012345678901234567890',
112
- spender: '0x0987654321098765432109876543210987654321',
113
- value: '1000000000000000000',
114
- nonce: 0,
115
- deadline: 1234567890,
116
- },
117
- signature:
118
- '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12',
119
- },
120
- ])
121
-
122
- const mockSuccessResponse: RelayResponse = {
123
- status: 'ok',
124
- data: {
125
- taskId: 'test-task-id-123',
126
- },
127
- }
128
-
129
- const mockErrorResponse: RelayResponse = {
130
- status: 'error',
131
- data: {
132
- code: 400,
133
- message: 'Invalid request parameters',
134
- },
135
- }
136
-
137
- describe('success scenarios', () => {
138
- it('should relay transaction successfully for advanced relayer', async () => {
139
- server.use(
140
- http.post(`${client.config.apiUrl}/advanced/relay`, async () => {
141
- return HttpResponse.json(mockSuccessResponse)
142
- })
143
- )
144
-
145
- const result = await relayTransaction(client, mockRelayRequest)
146
-
147
- expect(result).toEqual(mockSuccessResponse.data)
148
- })
149
-
150
- it('should relay transaction successfully for gasless relayer', async () => {
151
- server.use(
152
- http.post(`${client.config.apiUrl}/relayer/relay`, async () => {
153
- return HttpResponse.json(mockSuccessResponse)
154
- })
155
- )
156
-
157
- const result = await relayTransaction(
158
- client,
159
- mockRelayRequestWithPermitWitness
160
- )
161
-
162
- expect(result).toEqual(mockSuccessResponse.data)
163
- })
164
- })
165
-
166
- describe('error scenarios', () => {
167
- it('should throw BaseError when server returns error status', async () => {
168
- server.use(
169
- http.post(`${client.config.apiUrl}/advanced/relay`, async () => {
170
- return HttpResponse.json(mockErrorResponse)
171
- })
172
- )
173
-
174
- await expect(relayTransaction(client, mockRelayRequest)).rejects.toThrow(
175
- BaseError
176
- )
177
-
178
- try {
179
- await relayTransaction(client, mockRelayRequest)
180
- } catch (error) {
181
- expect(error).toBeInstanceOf(BaseError)
182
- expect((error as BaseError).name).toBe(ErrorName.ServerError)
183
- expect((error as BaseError).code).toBe(400)
184
- expect((error as BaseError).message).toBe('Invalid request parameters')
185
- }
186
- })
187
-
188
- it('should throw SDKError when network request fails', async () => {
189
- server.use(
190
- http.post(`${client.config.apiUrl}/advanced/relay`, async () => {
191
- return HttpResponse.error()
192
- })
193
- )
194
-
195
- await expect(relayTransaction(client, mockRelayRequest)).rejects.toThrow(
196
- SDKError
197
- )
198
- })
199
-
200
- it('should throw SDKError when request times out', async () => {
201
- server.use(
202
- http.post(`${client.config.apiUrl}/advanced/relay`, async () => {
203
- // Simulate timeout by not responding
204
- await new Promise(() => {}) // Never resolves
205
- })
206
- )
207
-
208
- const timeoutOptions: RequestOptions = {
209
- signal: AbortSignal.timeout(100), // 100ms timeout
210
- }
211
-
212
- await expect(
213
- relayTransaction(client, mockRelayRequest, timeoutOptions)
214
- ).rejects.toThrow()
215
- })
216
- })
217
-
218
- describe('validation scenarios', () => {
219
- it('should throw SDKError when typedData is missing', async () => {
220
- const invalidRequest = createMockRelayRequest([])
221
- // Remove typedData to test validation
222
- delete (invalidRequest as any).typedData
223
-
224
- await expect(relayTransaction(client, invalidRequest)).rejects.toThrow(
225
- SDKError
226
- )
227
- })
228
- })
229
- })