@ledgerhq/coin-filecoin 1.14.1-nightly.20251114023758 → 1.15.0-nightly.20251115023630

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 (56) hide show
  1. package/.unimportedrc.json +2 -0
  2. package/CHANGELOG.md +11 -7
  3. package/lib/api/api.d.ts +5 -3
  4. package/lib/api/api.d.ts.map +1 -1
  5. package/lib/api/api.js +66 -21
  6. package/lib/api/api.js.map +1 -1
  7. package/lib/common-logic/index.d.ts +1 -1
  8. package/lib/common-logic/index.d.ts.map +1 -1
  9. package/lib/common-logic/index.js +1 -3
  10. package/lib/common-logic/index.js.map +1 -1
  11. package/lib/common-logic/utils.d.ts +0 -2
  12. package/lib/common-logic/utils.d.ts.map +1 -1
  13. package/lib/common-logic/utils.js +16 -68
  14. package/lib/common-logic/utils.js.map +1 -1
  15. package/lib/erc20/tokenAccounts.d.ts +2 -3
  16. package/lib/erc20/tokenAccounts.d.ts.map +1 -1
  17. package/lib/erc20/tokenAccounts.js +46 -32
  18. package/lib/erc20/tokenAccounts.js.map +1 -1
  19. package/lib/test/fixtures.d.ts +87 -0
  20. package/lib/test/fixtures.d.ts.map +1 -0
  21. package/lib/test/fixtures.js +311 -0
  22. package/lib/test/fixtures.js.map +1 -0
  23. package/lib/types/common.d.ts +22 -2
  24. package/lib/types/common.d.ts.map +1 -1
  25. package/lib-es/api/api.d.ts +5 -3
  26. package/lib-es/api/api.d.ts.map +1 -1
  27. package/lib-es/api/api.js +61 -18
  28. package/lib-es/api/api.js.map +1 -1
  29. package/lib-es/common-logic/index.d.ts +1 -1
  30. package/lib-es/common-logic/index.d.ts.map +1 -1
  31. package/lib-es/common-logic/index.js +1 -1
  32. package/lib-es/common-logic/index.js.map +1 -1
  33. package/lib-es/common-logic/utils.d.ts +0 -2
  34. package/lib-es/common-logic/utils.d.ts.map +1 -1
  35. package/lib-es/common-logic/utils.js +16 -66
  36. package/lib-es/common-logic/utils.js.map +1 -1
  37. package/lib-es/erc20/tokenAccounts.d.ts +2 -3
  38. package/lib-es/erc20/tokenAccounts.d.ts.map +1 -1
  39. package/lib-es/erc20/tokenAccounts.js +47 -33
  40. package/lib-es/erc20/tokenAccounts.js.map +1 -1
  41. package/lib-es/test/fixtures.d.ts +87 -0
  42. package/lib-es/test/fixtures.d.ts.map +1 -0
  43. package/lib-es/test/fixtures.js +297 -0
  44. package/lib-es/test/fixtures.js.map +1 -0
  45. package/lib-es/types/common.d.ts +22 -2
  46. package/lib-es/types/common.d.ts.map +1 -1
  47. package/package.json +6 -6
  48. package/src/api/api.ts +107 -26
  49. package/src/api/api.unit.test.ts +217 -0
  50. package/src/common-logic/index.ts +0 -2
  51. package/src/common-logic/utils.ts +19 -90
  52. package/src/common-logic/utils.unit.test.ts +429 -0
  53. package/src/erc20/tokenAccounts.ts +59 -34
  54. package/src/erc20/tokenAccounts.unit.test.ts +73 -0
  55. package/src/test/fixtures.ts +342 -0
  56. package/src/types/common.ts +24 -2
@@ -0,0 +1,297 @@
1
+ import BigNumber from "bignumber.js";
2
+ import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
3
+ import { encodeAccountId } from "@ledgerhq/coin-framework/account/index";
4
+ /**
5
+ * Sample Filecoin addresses for testing
6
+ */
7
+ export const TEST_ADDRESSES = {
8
+ // f1 address (SECP256K1)
9
+ F1_ADDRESS: "f1abjxfbp274xpdqcpuaykwkfb43omjotacm2p3za",
10
+ // f4 address (delegated)
11
+ F4_ADDRESS: "f410fkkld55ioe7qg24wvt7fu6pbknb56ht7ptloy",
12
+ // Another f1 address for recipient
13
+ RECIPIENT_F1: "f1z4nykg7q6q5qnxs7h4zknhlqbqhq5jxcqm5qw4y",
14
+ // Another f4 address for recipient
15
+ RECIPIENT_F4: "f410fagkr6pfqzd5q2kj42qrj54g3sxqjsrqn4fhoy",
16
+ // ERC20 contract address (f4)
17
+ ERC20_CONTRACT: "f410f3huuiyauahgjp7xjbvb7yfpuhvpyxvnqx3qy",
18
+ };
19
+ /**
20
+ * Sample transaction hashes for testing
21
+ */
22
+ export const TEST_TRANSACTION_HASHES = {
23
+ VALID: "bafy2bzacedpqzd6qm2r7nvxj5oetpqvhujwwmvkhz4u3xnfzdvwzxpjzuqhpa",
24
+ };
25
+ /**
26
+ * Sample block heights for testing
27
+ */
28
+ export const TEST_BLOCK_HEIGHTS = {
29
+ CURRENT: 3000000,
30
+ RECENT: 2999999,
31
+ OLD: 2500000,
32
+ };
33
+ /**
34
+ * Create a mock Filecoin account for testing
35
+ *
36
+ * @param options Optional parameters to override default values
37
+ * @returns A mock Filecoin account
38
+ */
39
+ export const createMockAccount = (options) => {
40
+ const seedIdentifier = options?.seedIdentifier || TEST_ADDRESSES.F1_ADDRESS;
41
+ // For Filecoin, we need to handle the currency ID appropriately
42
+ // Using a mock currency structure similar to what getCryptoCurrencyById would return
43
+ const mockCurrency = {
44
+ type: "CryptoCurrency",
45
+ id: "filecoin",
46
+ coinType: 461,
47
+ name: "Filecoin",
48
+ managerAppName: "Filecoin",
49
+ ticker: "FIL",
50
+ scheme: "filecoin",
51
+ color: "#0090FF",
52
+ family: "filecoin",
53
+ units: [
54
+ {
55
+ name: "FIL",
56
+ code: "FIL",
57
+ magnitude: 18,
58
+ },
59
+ {
60
+ name: "attoFIL",
61
+ code: "attoFIL",
62
+ magnitude: 0,
63
+ },
64
+ ],
65
+ explorerViews: [
66
+ {
67
+ address: "https://filfox.info/en/address/$address",
68
+ tx: "https://filfox.info/en/message/$hash",
69
+ },
70
+ ],
71
+ };
72
+ const account = {
73
+ type: "Account",
74
+ id: options?.id ||
75
+ encodeAccountId({
76
+ type: "js",
77
+ version: "2",
78
+ currencyId: "filecoin",
79
+ xpubOrAddress: seedIdentifier,
80
+ derivationMode: "",
81
+ }),
82
+ seedIdentifier,
83
+ derivationMode: "",
84
+ index: options?.index || 0,
85
+ freshAddress: options?.freshAddress || seedIdentifier,
86
+ freshAddressPath: options?.freshAddressPath || "44'/461'/0'/0/0",
87
+ blockHeight: options?.blockHeight || TEST_BLOCK_HEIGHTS.CURRENT,
88
+ balance: options?.balance instanceof BigNumber
89
+ ? options.balance
90
+ : new BigNumber(options?.balance || "1000000000000000000"), // 1 FIL
91
+ spendableBalance: options?.spendableBalance instanceof BigNumber
92
+ ? options.spendableBalance
93
+ : new BigNumber(options?.spendableBalance || "1000000000000000000"), // 1 FIL
94
+ operations: options?.operations || [],
95
+ pendingOperations: options?.pendingOperations || [],
96
+ currency: options?.currency || mockCurrency,
97
+ operationsCount: options?.operationsCount || 0,
98
+ subAccounts: options?.subAccounts || [],
99
+ swapHistory: [],
100
+ balanceHistoryCache: {
101
+ HOUR: { latestDate: null, balances: [] },
102
+ DAY: { latestDate: null, balances: [] },
103
+ WEEK: { latestDate: null, balances: [] },
104
+ },
105
+ creationDate: options?.creationDate || new Date(),
106
+ lastSyncDate: options?.lastSyncDate || new Date(),
107
+ nfts: options?.nfts || [],
108
+ used: true,
109
+ };
110
+ return { ...account, ...options };
111
+ };
112
+ /**
113
+ * Create a mock Filecoin transaction for testing
114
+ *
115
+ * @param options Optional parameters to override default values
116
+ * @returns A mock Filecoin transaction
117
+ */
118
+ export const createMockTransaction = (options) => {
119
+ const transaction = {
120
+ family: "filecoin",
121
+ amount: options?.amount instanceof BigNumber
122
+ ? options.amount
123
+ : new BigNumber(options?.amount || "100000000000000000"), // 0.1 FIL
124
+ recipient: options?.recipient || TEST_ADDRESSES.RECIPIENT_F1,
125
+ useAllAmount: options?.useAllAmount || false,
126
+ nonce: options?.nonce || 0,
127
+ method: options?.method || 0,
128
+ version: options?.version || 0,
129
+ params: options?.params,
130
+ gasLimit: options?.gasLimit || new BigNumber(1000000),
131
+ gasFeeCap: options?.gasFeeCap || new BigNumber("100000"),
132
+ gasPremium: options?.gasPremium || new BigNumber("100000"),
133
+ };
134
+ return { ...transaction, ...options };
135
+ };
136
+ /**
137
+ * Create a mock Filecoin operation for testing
138
+ *
139
+ * @param account The account associated with the operation
140
+ * @param transaction The transaction details
141
+ * @param options Optional parameters to override default values
142
+ * @returns A mock Filecoin operation
143
+ */
144
+ export const createMockOperation = (account, transaction, options) => {
145
+ const hash = options?.hash || TEST_TRANSACTION_HASHES.VALID;
146
+ const type = options?.type || "OUT";
147
+ const fee = transaction.gasLimit.multipliedBy(transaction.gasFeeCap).plus(transaction.gasPremium);
148
+ const operation = {
149
+ id: options?.id || encodeOperationId(account.id, hash, type),
150
+ hash,
151
+ type,
152
+ senders: options?.senders || [account.freshAddress],
153
+ recipients: options?.recipients || [transaction.recipient],
154
+ accountId: account.id,
155
+ blockHash: options?.blockHash || null,
156
+ blockHeight: options?.blockHeight || null,
157
+ value: type === "OUT" ? transaction.amount.plus(fee) : transaction.amount,
158
+ fee,
159
+ date: options?.date || new Date(),
160
+ extra: options?.extra || {},
161
+ hasFailed: options?.hasFailed || false,
162
+ };
163
+ return { ...operation, ...options };
164
+ };
165
+ /**
166
+ * Create a mock TokenAccount for testing ERC20 functionality
167
+ *
168
+ * @param parentAccount The parent Filecoin account
169
+ * @param options Optional parameters to override default values
170
+ * @returns A mock TokenAccount
171
+ */
172
+ export const createMockTokenAccount = (parentAccount, options) => {
173
+ const tokenAccount = {
174
+ type: "TokenAccount",
175
+ id: options?.id || `${parentAccount.id}+${TEST_ADDRESSES.ERC20_CONTRACT}`,
176
+ parentId: parentAccount.id,
177
+ token: options?.token || {
178
+ type: "TokenCurrency",
179
+ id: `filecoin/erc20/test_token`,
180
+ contractAddress: TEST_ADDRESSES.ERC20_CONTRACT,
181
+ parentCurrency: parentAccount.currency,
182
+ tokenType: "erc20",
183
+ name: "Test Token",
184
+ ticker: "TST",
185
+ units: [
186
+ {
187
+ name: "TST",
188
+ code: "TST",
189
+ magnitude: 18,
190
+ },
191
+ ],
192
+ disableCountervalue: false,
193
+ },
194
+ balance: options?.balance instanceof BigNumber
195
+ ? options.balance
196
+ : new BigNumber(options?.balance || "1000000000000000000"), // 1 TST
197
+ spendableBalance: options?.spendableBalance instanceof BigNumber
198
+ ? options.spendableBalance
199
+ : new BigNumber(options?.spendableBalance || "1000000000000000000"),
200
+ creationDate: options?.creationDate || new Date(),
201
+ operationsCount: options?.operationsCount || 0,
202
+ operations: options?.operations || [],
203
+ pendingOperations: options?.pendingOperations || [],
204
+ swapHistory: options?.swapHistory || [],
205
+ balanceHistoryCache: options?.balanceHistoryCache || {
206
+ HOUR: { latestDate: null, balances: [] },
207
+ DAY: { latestDate: null, balances: [] },
208
+ WEEK: { latestDate: null, balances: [] },
209
+ },
210
+ };
211
+ return { ...tokenAccount, ...options };
212
+ };
213
+ /**
214
+ * Create mock API response for balance
215
+ *
216
+ * @param options Optional parameters to override default values
217
+ * @returns A mock BalanceResponse
218
+ */
219
+ export const createMockBalanceResponse = (options) => {
220
+ return {
221
+ total_balance: options?.total_balance || "1000000000000000000",
222
+ spendable_balance: options?.spendable_balance || "1000000000000000000",
223
+ locked_balance: options?.locked_balance || "0",
224
+ };
225
+ };
226
+ /**
227
+ * Create mock API response for transaction
228
+ *
229
+ * @param options Optional parameters to override default values
230
+ * @returns A mock TransactionResponse
231
+ */
232
+ export const createMockTransactionResponse = (options) => {
233
+ return {
234
+ hash: options?.hash || TEST_TRANSACTION_HASHES.VALID,
235
+ to: options?.to || TEST_ADDRESSES.RECIPIENT_F1,
236
+ from: options?.from || TEST_ADDRESSES.F1_ADDRESS,
237
+ amount: options?.amount || "100000000000000000",
238
+ status: options?.status || "Ok",
239
+ type: options?.type || "transfer",
240
+ timestamp: options?.timestamp || Math.floor(Date.now() / 1000),
241
+ height: options?.height || TEST_BLOCK_HEIGHTS.CURRENT,
242
+ fee_data: options?.fee_data || {
243
+ MinerFee: {
244
+ MinerAddress: "f0123",
245
+ Amount: "50000",
246
+ },
247
+ OverEstimationBurnFee: {
248
+ BurnAddress: "f099",
249
+ Amount: "25000",
250
+ },
251
+ BurnFee: {
252
+ BurnAddress: "f099",
253
+ Amount: "25000",
254
+ },
255
+ TotalCost: "100000",
256
+ },
257
+ };
258
+ };
259
+ /**
260
+ * Create mock API response for estimated fees
261
+ *
262
+ * @param options Optional parameters to override default values
263
+ * @returns A mock EstimatedFeesResponse
264
+ */
265
+ export const createMockEstimatedFeesResponse = (options) => {
266
+ return {
267
+ gas_limit: options?.gas_limit || 1000000,
268
+ gas_fee_cap: options?.gas_fee_cap || "100000",
269
+ gas_premium: options?.gas_premium || "100000",
270
+ nonce: options?.nonce || 0,
271
+ };
272
+ };
273
+ /**
274
+ * Create mock ERC20 transfer for testing token functionality
275
+ *
276
+ * @param options Optional parameters to override default values
277
+ * @returns A mock ERC20Transfer
278
+ */
279
+ export const createMockERC20Transfer = (options) => {
280
+ const transfer = {
281
+ id: options?.id || "1",
282
+ height: options?.height || TEST_BLOCK_HEIGHTS.CURRENT,
283
+ type: options?.type || "erc20_transfer",
284
+ status: options?.status || "Ok",
285
+ to: options?.to || TEST_ADDRESSES.RECIPIENT_F4,
286
+ from: options?.from || TEST_ADDRESSES.F4_ADDRESS,
287
+ amount: options?.amount || "1000000000000000000",
288
+ contract_address: options?.contract_address || TEST_ADDRESSES.ERC20_CONTRACT,
289
+ timestamp: options?.timestamp || Math.floor(Date.now() / 1000),
290
+ tx_hash: options?.tx_hash || TEST_TRANSACTION_HASHES.VALID,
291
+ };
292
+ if (options?.tx_cid !== undefined) {
293
+ transfer.tx_cid = options.tx_cid;
294
+ }
295
+ return transfer;
296
+ };
297
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"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"}
@@ -17,19 +17,39 @@ export interface EstimatedFeesResponse {
17
17
  gas_premium: string;
18
18
  nonce: number;
19
19
  }
20
+ export interface Metadata {
21
+ limit: number;
22
+ offset: number;
23
+ }
20
24
  export interface TransactionsResponse {
21
25
  txs: TransactionResponse[];
26
+ metadata: Metadata;
22
27
  }
23
28
  export interface TransactionResponse {
24
- amount: number;
29
+ amount: string;
25
30
  to: string;
26
31
  from: string;
32
+ fee_data?: FeeData;
27
33
  status: string;
28
34
  type: string;
29
35
  hash: string;
30
36
  timestamp: number;
31
37
  height: number;
32
- fee?: number;
38
+ }
39
+ export interface FeeData {
40
+ MinerFee: {
41
+ MinerAddress: string;
42
+ Amount: string;
43
+ };
44
+ OverEstimationBurnFee: {
45
+ BurnAddress: string;
46
+ Amount: string;
47
+ };
48
+ BurnFee: {
49
+ BurnAddress: string;
50
+ Amount: string;
51
+ };
52
+ TotalCost: string;
33
53
  }
34
54
  export interface BalanceResponse {
35
55
  locked_balance: string;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-filecoin",
3
- "version": "1.14.1-nightly.20251114023758",
3
+ "version": "1.15.0-nightly.20251115023630",
4
4
  "description": "Ledger Filecoin Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -100,15 +100,15 @@
100
100
  "iso-filecoin": "^4.1.0",
101
101
  "lodash": "^4.17.21",
102
102
  "rxjs": "^7.8.1",
103
- "@ledgerhq/coin-framework": "^6.9.0-nightly.20251114023758",
104
- "@ledgerhq/cryptoassets": "^13.33.0-nightly.20251114023758",
103
+ "@ledgerhq/coin-framework": "^6.9.0-nightly.20251115023630",
104
+ "@ledgerhq/cryptoassets": "^13.33.0-nightly.20251115023630",
105
105
  "@ledgerhq/devices": "8.7.0",
106
106
  "@ledgerhq/errors": "^6.27.0",
107
- "@ledgerhq/live-env": "^2.21.0-nightly.20251114023758",
108
- "@ledgerhq/live-network": "^2.1.1-nightly.20251114023758",
107
+ "@ledgerhq/live-env": "^2.21.0-nightly.20251115023630",
108
+ "@ledgerhq/live-network": "^2.1.1-nightly.20251115023630",
109
109
  "@ledgerhq/logs": "^6.13.0",
110
110
  "@ledgerhq/types-cryptoassets": "^7.30.0",
111
- "@ledgerhq/types-live": "^6.89.0-nightly.20251114023758"
111
+ "@ledgerhq/types-live": "^6.89.0-nightly.20251115023630"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@types/invariant": "^2.2.2",
package/src/api/api.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { log } from "@ledgerhq/logs";
2
- import { AxiosRequestConfig, AxiosResponse } from "axios";
3
2
 
4
- import network from "@ledgerhq/live-network/network";
3
+ import network from "@ledgerhq/live-network";
5
4
  import { makeLRUCache } from "@ledgerhq/live-network/cache";
6
5
  import { getEnv } from "@ledgerhq/live-env";
7
6
 
@@ -19,62 +18,80 @@ import {
19
18
  ERC20BalanceResponse,
20
19
  } from "../types";
21
20
  import { FilecoinFeeEstimationFailed } from "../errors";
21
+ import { LiveNetworkRequest } from "@ledgerhq/live-network/network";
22
22
 
23
- const getFilecoinURL = (path?: string): string => {
23
+ const txsPerPageLimit = 1000;
24
+ const currentVersion = "/v2";
25
+ const fromHeightQueryParam = "from_height";
26
+
27
+ const getFilecoinURL = (version: string = currentVersion, path?: string): string => {
24
28
  const baseUrl = getEnv("API_FILECOIN_ENDPOINT");
25
29
  if (!baseUrl) throw new Error("API base URL not available");
26
30
 
27
- return `${baseUrl}${path ? path : ""}`;
31
+ return `${baseUrl}${version ? version : ""}${path ? path : ""}`;
28
32
  };
29
33
 
30
- const fetch = async <T>(path: string) => {
31
- const url = getFilecoinURL(path);
34
+ type FetchProps = {
35
+ version?: string;
36
+ };
37
+ const fetch = async <T>(path: string, { version }: FetchProps) => {
38
+ const url = getFilecoinURL(version, path);
32
39
 
33
40
  // We force data to this way as network func is not using the correct param type. Changing that func will generate errors in other implementations
34
- const opts: AxiosRequestConfig = {
41
+ const opts: LiveNetworkRequest<undefined> = {
35
42
  method: "GET",
36
43
  url,
37
44
  };
38
45
 
39
- const rawResponse = await network(opts);
46
+ const rawResponse = await network<T>(opts);
40
47
 
41
48
  // We force data to this way as network func is not using the correct param type. Changing that func will generate errors in other implementations
42
- const { data } = rawResponse as AxiosResponse<T>;
49
+ const { data } = rawResponse;
43
50
 
44
51
  log("http", url);
45
52
  return data;
46
53
  };
47
54
 
48
- const send = async <T>(path: string, data: Record<string, any>) => {
49
- const url = getFilecoinURL(path);
55
+ type sendDataType = EstimatedFeesRequest | BroadcastTransactionRequest;
56
+ type sendProps = {
57
+ version?: string;
58
+ data: sendDataType;
59
+ };
60
+ const send = async <T>(path: string, { version, data }: sendProps): Promise<T> => {
61
+ const url = getFilecoinURL(version, path);
50
62
 
51
- const opts: AxiosRequestConfig = {
63
+ const opts: LiveNetworkRequest<string> = {
52
64
  method: "POST",
53
65
  url,
54
66
  data: JSON.stringify(data),
55
67
  headers: { "Content-Type": "application/json" },
56
68
  };
57
69
 
58
- const rawResponse = await network(opts);
70
+ const rawResponse = await network<T>(opts);
59
71
 
60
72
  // We force data to this way as network func is not using generics. Changing that func will generate errors in other implementations
61
- const { data: responseData } = rawResponse as AxiosResponse<T>;
73
+ const { data: responseData } = rawResponse;
62
74
 
63
75
  log("http", url);
64
76
  return responseData;
65
77
  };
66
78
 
67
79
  export const fetchBalances = async (addr: string): Promise<BalanceResponse> => {
68
- const data = await fetch<BalanceResponse>(`/addresses/${addr}/balance`);
80
+ const data = await fetch<BalanceResponse>(`/addresses/${addr}/balance`, {
81
+ version: currentVersion,
82
+ });
69
83
  return data; // TODO Validate if the response fits this interface
70
84
  };
71
85
 
72
86
  export const fetchEstimatedFees = makeLRUCache(
73
87
  async (request: EstimatedFeesRequest): Promise<EstimatedFeesResponse> => {
74
88
  try {
75
- const data = await send<EstimatedFeesResponse>(`/fees/estimate`, request);
89
+ const data = await send<EstimatedFeesResponse>(`/fees/estimate`, {
90
+ version: currentVersion,
91
+ data: request,
92
+ });
76
93
  return data; // TODO Validate if the response fits this interface
77
- } catch (e: any) {
94
+ } catch (e) {
78
95
  log("error", "filecoin fetchEstimatedFees", e);
79
96
  throw new FilecoinFeeEstimationFailed();
80
97
  }
@@ -86,19 +103,53 @@ export const fetchEstimatedFees = makeLRUCache(
86
103
  );
87
104
 
88
105
  export const fetchBlockHeight = async (): Promise<NetworkStatusResponse> => {
89
- const data = await fetch<NetworkStatusResponse>("/network/status");
90
- return data as NetworkStatusResponse; // TODO Validate if the response fits this interface
106
+ const data = await fetch<NetworkStatusResponse>("/network/status", {
107
+ version: currentVersion,
108
+ });
109
+ return data; // TODO Validate if the response fits this interface
91
110
  };
92
111
 
93
- export const fetchTxs = async (addr: string): Promise<TransactionResponse[]> => {
94
- const response = await fetch<TransactionsResponse>(`/addresses/${addr}/transactions`);
95
- return response.txs; // TODO Validate if the response fits this interface
112
+ export const fetchTxs = async (
113
+ addr: string,
114
+ lastHeight: number,
115
+ offset: number = 0,
116
+ limit: number = 0,
117
+ ): Promise<TransactionsResponse> => {
118
+ const response = await fetch<TransactionsResponse>(
119
+ `/addresses/${addr}/transactions?${fromHeightQueryParam}=${lastHeight}&offset=${offset}&limit=${limit}`,
120
+ {
121
+ version: currentVersion,
122
+ },
123
+ );
124
+ return response; // TODO Validate if the response fits this interface
125
+ };
126
+
127
+ export const fetchTxsWithPages = async (
128
+ addr: string,
129
+ lastHeight: number,
130
+ ): Promise<TransactionResponse[]> => {
131
+ let result: TransactionResponse[] = [];
132
+ let offset = 0;
133
+ let txsLen = txsPerPageLimit;
134
+
135
+ while (txsLen === txsPerPageLimit) {
136
+ const { txs } = await fetchTxs(addr, lastHeight, offset, txsPerPageLimit);
137
+ result = result.concat(txs);
138
+
139
+ txsLen = txs.length;
140
+ offset += txsLen;
141
+ }
142
+
143
+ return result;
96
144
  };
97
145
 
98
146
  export const broadcastTx = async (
99
147
  message: BroadcastTransactionRequest,
100
148
  ): Promise<BroadcastTransactionResponse> => {
101
- const response = await send<BroadcastTransactionResponse>(`/transaction/broadcast`, message);
149
+ const response = await send<BroadcastTransactionResponse>(`/transaction/broadcast`, {
150
+ version: currentVersion,
151
+ data: message,
152
+ });
102
153
  return response; // TODO Validate if the response fits this interface
103
154
  };
104
155
 
@@ -108,6 +159,9 @@ export const fetchERC20TokenBalance = async (
108
159
  ): Promise<string> => {
109
160
  const res = await fetch<ERC20BalanceResponse>(
110
161
  `/contract/${contractAddr}/address/${ethAddr}/balance/erc20`,
162
+ {
163
+ version: currentVersion,
164
+ },
111
165
  );
112
166
 
113
167
  if (res.data.length) {
@@ -117,9 +171,36 @@ export const fetchERC20TokenBalance = async (
117
171
  return "0";
118
172
  };
119
173
 
120
- export const fetchERC20Transactions = async (ethAddr: string): Promise<ERC20Transfer[]> => {
174
+ export const fetchERC20Transactions = async (
175
+ ethAddr: string,
176
+ lastHeight: number,
177
+ offset: number = 0,
178
+ limit: number = 0,
179
+ ): Promise<FetchERC20TransactionsResponse> => {
121
180
  const res = await fetch<FetchERC20TransactionsResponse>(
122
- `/addresses/${ethAddr}/transactions/erc20`,
181
+ `/addresses/${ethAddr}/transactions/erc20?${fromHeightQueryParam}=${lastHeight}&offset=${offset}&limit=${limit}`,
182
+ {
183
+ version: currentVersion,
184
+ },
123
185
  );
124
- return res.txs.sort((a, b) => b.timestamp - a.timestamp);
186
+ return res;
187
+ };
188
+
189
+ export const fetchERC20TransactionsWithPages = async (
190
+ addr: string,
191
+ lastHeight: number,
192
+ ): Promise<ERC20Transfer[]> => {
193
+ let result: ERC20Transfer[] = [];
194
+ let offset = 0;
195
+ let txsLen = txsPerPageLimit;
196
+
197
+ while (txsLen === txsPerPageLimit) {
198
+ const { txs } = await fetchERC20Transactions(addr, lastHeight, offset, txsPerPageLimit);
199
+ result = result.concat(txs);
200
+
201
+ txsLen = txs.length;
202
+ offset += txsLen;
203
+ }
204
+
205
+ return result.sort((a, b) => b.timestamp - a.timestamp);
125
206
  };