@ledgerhq/coin-multiversx 1.2.0 → 1.2.1-nightly.20260929020940
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.
- package/CHANGELOG.md +14 -0
- package/lib/constants.d.ts +1 -0
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +2 -1
- package/lib/constants.js.map +1 -1
- package/lib/network/api.d.ts.map +1 -1
- package/lib/network/api.js +38 -22
- package/lib/network/api.js.map +1 -1
- package/lib-es/constants.d.ts +1 -0
- package/lib-es/constants.d.ts.map +1 -1
- package/lib-es/constants.js +1 -0
- package/lib-es/constants.js.map +1 -1
- package/lib-es/network/api.d.ts.map +1 -1
- package/lib-es/network/api.js +39 -23
- package/lib-es/network/api.js.map +1 -1
- package/package.json +8 -7
- package/src/constants.ts +1 -0
- package/src/network/api.test.ts +87 -5
- package/src/network/api.ts +52 -23
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @ledgerhq/coin-elrond
|
|
2
2
|
|
|
3
|
+
## 1.2.1-nightly.20260929020940
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#21953](https://github.com/LedgerHQ/ledger-live/pull/21953) [`381bd0b`](https://github.com/LedgerHQ/ledger-live/commit/381bd0befb6a09f20f13f65c233f0e1479e7051d) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Consume `@ledgerhq/live-config`, `@ledgerhq/live-env`, `@ledgerhq/live-currency-format`,
|
|
8
|
+
`@ledgerhq/domain-service` and `@ledgerhq/evm-tools` from npm instead of the workspace — they
|
|
9
|
+
now live in the `ts-libs` repository. No API change.
|
|
10
|
+
|
|
11
|
+
- [#22540](https://github.com/LedgerHQ/ledger-live/pull/22540) [`9cafda0`](https://github.com/LedgerHQ/ledger-live/commit/9cafda098001d1912b872e341c4568386b70ed75) Thanks [@koda-apps](https://github.com/apps/koda-apps)! - Fix MultiversX transaction history sync failing on accounts with more than 10,000 transactions. Pagination now moves past the API's 10,000-result window with a `before` cursor, so the full history is fetched.
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`2d869a5`](https://github.com/LedgerHQ/ledger-live/commit/2d869a596a4562a00003de01cc657d7277dc6b7c), [`f1d8aac`](https://github.com/LedgerHQ/ledger-live/commit/f1d8aac1c7c0bc0be9beb1508c1a9ef3cf7affae), [`381bd0b`](https://github.com/LedgerHQ/ledger-live/commit/381bd0befb6a09f20f13f65c233f0e1479e7051d), [`a025d7a`](https://github.com/LedgerHQ/ledger-live/commit/a025d7a872b7b1e4681d16b2bfb54f8949bf6626), [`a896fca`](https://github.com/LedgerHQ/ledger-live/commit/a896fca1974a46f10e915d1212e0947e2d808ad5), [`88bae04`](https://github.com/LedgerHQ/ledger-live/commit/88bae04e2f7e7a3de8d55c340fe32b48e37bd78d)]:
|
|
14
|
+
- @ledgerhq/types-live@6.126.0-nightly.20260929020940
|
|
15
|
+
- @ledgerhq/ledger-wallet-framework@3.6.0-nightly.20260929020940
|
|
16
|
+
|
|
3
17
|
## 1.2.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
package/lib/constants.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export declare const TRANSACTION_OPTIONS_TX_HASH_SIGN = 1;
|
|
|
3
3
|
export declare const TRANSACTION_VERSION_DEFAULT = 2;
|
|
4
4
|
export declare const METACHAIN_SHARD = 4294967295;
|
|
5
5
|
export declare const MAX_PAGINATION_SIZE = 50;
|
|
6
|
+
export declare const MAX_PAGINATION_RESULT_WINDOW = 10000;
|
|
6
7
|
export declare const GAS: {
|
|
7
8
|
ESDT_TRANSFER: number;
|
|
8
9
|
DELEGATE: number;
|
package/lib/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,eAAO,MAAM,gCAAgC,IAAS,CAAC;AACvD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,GAAG;IACd,aAAa;IACb,QAAQ;IACR,KAAK;CACN,CAAC;AACF,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,qBAAqB,EAAE,SAAgD,CAAC;AACrF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,uBAAuB,mEAC8B,CAAC;AACnE,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,wBAAwB,mEAC6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,eAAO,MAAM,gCAAgC,IAAS,CAAC;AACvD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,eAAO,MAAM,GAAG;IACd,aAAa;IACb,QAAQ;IACR,KAAK;CACN,CAAC;AACF,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,qBAAqB,EAAE,SAAgD,CAAC;AACrF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,uBAAuB,mEAC8B,CAAC;AACnE,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,wBAAwB,mEAC6B,CAAC"}
|
package/lib/constants.js
CHANGED
|
@@ -3,12 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MULTIVERSX_DUMMY_ADDRESS = exports.MULTIVERSX_LEDGER_VALIDATOR_ADDRESS = exports.MULTIVERSX_STAKING_POOL = exports.MULTIVERSX_EXPLORER_URL = exports.DECIMALS_LIMIT = exports.MIN_DELEGATION_AMOUNT = exports.CHAIN_ID = exports.GAS_PRICE_MODIFIER = exports.GAS_PER_DATA_BYTE = exports.MIN_GAS_LIMIT = exports.GAS_PRICE = exports.GAS = exports.MAX_PAGINATION_SIZE = exports.METACHAIN_SHARD = exports.TRANSACTION_VERSION_DEFAULT = exports.TRANSACTION_OPTIONS_TX_HASH_SIGN = void 0;
|
|
6
|
+
exports.MULTIVERSX_DUMMY_ADDRESS = exports.MULTIVERSX_LEDGER_VALIDATOR_ADDRESS = exports.MULTIVERSX_STAKING_POOL = exports.MULTIVERSX_EXPLORER_URL = exports.DECIMALS_LIMIT = exports.MIN_DELEGATION_AMOUNT = exports.CHAIN_ID = exports.GAS_PRICE_MODIFIER = exports.GAS_PER_DATA_BYTE = exports.MIN_GAS_LIMIT = exports.GAS_PRICE = exports.GAS = exports.MAX_PAGINATION_RESULT_WINDOW = exports.MAX_PAGINATION_SIZE = exports.METACHAIN_SHARD = exports.TRANSACTION_VERSION_DEFAULT = exports.TRANSACTION_OPTIONS_TX_HASH_SIGN = void 0;
|
|
7
7
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
8
|
exports.TRANSACTION_OPTIONS_TX_HASH_SIGN = 0b0001;
|
|
9
9
|
exports.TRANSACTION_VERSION_DEFAULT = 2;
|
|
10
10
|
exports.METACHAIN_SHARD = 4294967295;
|
|
11
11
|
exports.MAX_PAGINATION_SIZE = 50;
|
|
12
|
+
exports.MAX_PAGINATION_RESULT_WINDOW = 10000;
|
|
12
13
|
exports.GAS = {
|
|
13
14
|
ESDT_TRANSFER: 500000,
|
|
14
15
|
DELEGATE: 75000000,
|
package/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AAExB,QAAA,gCAAgC,GAAG,MAAM,CAAC;AAC1C,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAChC,QAAA,eAAe,GAAG,UAAU,CAAC;AAC7B,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,GAAG,GAAG;IACjB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;CACf,CAAC;AACW,QAAA,SAAS,GAAG,UAAU,CAAC;AACvB,QAAA,aAAa,GAAG,KAAK,CAAC;AACtB,QAAA,iBAAiB,GAAG,IAAI,CAAC;AACzB,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAC1B,QAAA,QAAQ,GAAG,GAAG,CAAC;AACf,QAAA,qBAAqB,GAAc,IAAI,sBAAS,CAAC,qBAAqB,CAAC,CAAC;AACxE,QAAA,cAAc,GAAG,EAAE,CAAC;AAEpB,QAAA,uBAAuB,GAAG,iCAAiC,CAAC;AAC5D,QAAA,uBAAuB,GAClC,gEAAgE,CAAC;AACtD,QAAA,mCAAmC,GAAG,EAAE,CAAC;AACzC,QAAA,wBAAwB,GACnC,gEAAgE,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AAExB,QAAA,gCAAgC,GAAG,MAAM,CAAC;AAC1C,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAChC,QAAA,eAAe,GAAG,UAAU,CAAC;AAC7B,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,4BAA4B,GAAG,KAAK,CAAC;AACrC,QAAA,GAAG,GAAG;IACjB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;CACf,CAAC;AACW,QAAA,SAAS,GAAG,UAAU,CAAC;AACvB,QAAA,aAAa,GAAG,KAAK,CAAC;AACtB,QAAA,iBAAiB,GAAG,IAAI,CAAC;AACzB,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAC1B,QAAA,QAAQ,GAAG,GAAG,CAAC;AACf,QAAA,qBAAqB,GAAc,IAAI,sBAAS,CAAC,qBAAqB,CAAC,CAAC;AACxE,QAAA,cAAc,GAAG,EAAE,CAAC;AAEpB,QAAA,uBAAuB,GAAG,iCAAiC,CAAC;AAC5D,QAAA,uBAAuB,GAClC,gEAAgE,CAAC;AACtD,QAAA,mCAAmC,GAAG,EAAE,CAAC;AACzC,QAAA,wBAAwB,GACnC,gEAAgE,CAAC"}
|
package/lib/network/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;AA0ElB,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAE5C,YAAY,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAGtD;IAEK,iBAAiB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAQjE;IAEK,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlD;IAEK,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAmB7C;IAEK,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAelD;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAenF;IAEK,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAMzE;IAEK,6BAA6B,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkBrC;IAEK,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAiBhE;IAEK,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;IAEK,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAQhD;IAEK,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnD;CACF;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,MAAM,GAC5B,oBAAoB,CAEtB"}
|
package/lib/network/api.js
CHANGED
|
@@ -16,6 +16,40 @@ const decodeTransactionMode = (action) => {
|
|
|
16
16
|
return "send";
|
|
17
17
|
return action.name;
|
|
18
18
|
};
|
|
19
|
+
async function fetchAllTransactions(url, totalCount) {
|
|
20
|
+
const allTransactions = [];
|
|
21
|
+
const seenHashes = new Set();
|
|
22
|
+
let from = 0;
|
|
23
|
+
let before;
|
|
24
|
+
while (allTransactions.length < totalCount) {
|
|
25
|
+
const beforeParam = before ? `&before=${before}` : "";
|
|
26
|
+
const { data } = await (0, live_network_1.default)({
|
|
27
|
+
method: "GET",
|
|
28
|
+
url: `${url}&from=${from}&size=${constants_1.MAX_PAGINATION_SIZE}${beforeParam}`,
|
|
29
|
+
});
|
|
30
|
+
const transactions = data ?? [];
|
|
31
|
+
for (const transaction of transactions) {
|
|
32
|
+
if (transaction.txHash && seenHashes.has(transaction.txHash))
|
|
33
|
+
continue;
|
|
34
|
+
if (transaction.txHash)
|
|
35
|
+
seenHashes.add(transaction.txHash);
|
|
36
|
+
allTransactions.push(transaction);
|
|
37
|
+
}
|
|
38
|
+
if (transactions.length < constants_1.MAX_PAGINATION_SIZE)
|
|
39
|
+
break;
|
|
40
|
+
from += constants_1.MAX_PAGINATION_SIZE;
|
|
41
|
+
if (from + constants_1.MAX_PAGINATION_SIZE <= constants_1.MAX_PAGINATION_RESULT_WINDOW)
|
|
42
|
+
continue;
|
|
43
|
+
const oldest = transactions[transactions.length - 1].timestamp;
|
|
44
|
+
if (oldest === undefined || oldest + 1 === before) {
|
|
45
|
+
throw new Error("MultiversX pagination cannot move past the API result window");
|
|
46
|
+
}
|
|
47
|
+
// `before` is exclusive: re-read the oldest second so same-timestamp transactions are kept
|
|
48
|
+
before = oldest + 1;
|
|
49
|
+
from = 0;
|
|
50
|
+
}
|
|
51
|
+
return allTransactions;
|
|
52
|
+
}
|
|
19
53
|
class MultiversXNetworkApi {
|
|
20
54
|
API_URL;
|
|
21
55
|
DELEGATION_API_URL;
|
|
@@ -62,18 +96,9 @@ class MultiversXNetworkApi {
|
|
|
62
96
|
method: "GET",
|
|
63
97
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?after=${after}`,
|
|
64
98
|
});
|
|
65
|
-
const allTransactions =
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const { data: transactions } = await (0, live_network_1.default)({
|
|
69
|
-
method: "GET",
|
|
70
|
-
url: `${this.API_URL}/accounts/${addr}/transactions?after=${after}&from=${from}&size=${constants_1.MAX_PAGINATION_SIZE}&withOperations=true&withScResults=true`,
|
|
71
|
-
});
|
|
72
|
-
for (const transaction of transactions ?? []) {
|
|
73
|
-
transaction.mode = decodeTransactionMode(transaction.action);
|
|
74
|
-
}
|
|
75
|
-
allTransactions.push(...(transactions ?? []));
|
|
76
|
-
from = from + constants_1.MAX_PAGINATION_SIZE;
|
|
99
|
+
const allTransactions = await fetchAllTransactions(`${this.API_URL}/accounts/${addr}/transactions?after=${after}&withOperations=true&withScResults=true`, transactionsCount);
|
|
100
|
+
for (const transaction of allTransactions) {
|
|
101
|
+
transaction.mode = decodeTransactionMode(transaction.action);
|
|
77
102
|
}
|
|
78
103
|
return allTransactions;
|
|
79
104
|
}
|
|
@@ -90,16 +115,7 @@ class MultiversXNetworkApi {
|
|
|
90
115
|
method: "GET",
|
|
91
116
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?token=${token}&after=${after}`,
|
|
92
117
|
});
|
|
93
|
-
const allTokenTransactions =
|
|
94
|
-
let from = 0;
|
|
95
|
-
while (from < tokenTransactionsCount) {
|
|
96
|
-
const { data: tokenTransactions } = await (0, live_network_1.default)({
|
|
97
|
-
method: "GET",
|
|
98
|
-
url: `${this.API_URL}/accounts/${addr}/transactions?token=${token}&from=${from}&after=${after}&size=${constants_1.MAX_PAGINATION_SIZE}`,
|
|
99
|
-
});
|
|
100
|
-
allTokenTransactions.push(...(tokenTransactions ?? []));
|
|
101
|
-
from = from + constants_1.MAX_PAGINATION_SIZE;
|
|
102
|
-
}
|
|
118
|
+
const allTokenTransactions = await fetchAllTransactions(`${this.API_URL}/accounts/${addr}/transactions?token=${token}&after=${after}`, tokenTransactionsCount);
|
|
103
119
|
for (const esdtTransaction of allTokenTransactions) {
|
|
104
120
|
esdtTransaction.transfer =
|
|
105
121
|
"esdt";
|
package/lib/network/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":";;;;;;;AAAA,0EAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":";;;;;;;AAAA,0EAA6C;AAC7C,4CAAkG;AAoClG,MAAM,qBAAqB,GAAG,CAAC,MAAoC,EAAU,EAAE;IAC7E,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC,CAAC;AAEF,KAAK,UAAU,oBAAoB,CACjC,GAAW,EACX,UAAkB;IAElB,MAAM,eAAe,GAA+B,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAA0B,CAAC;IAE/B,OAAO,eAAe,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,sBAAO,EAA6B;YACzD,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,GAAG,SAAS,IAAI,SAAS,+BAAmB,GAAG,WAAW,EAAE;SACrE,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAEhC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,WAAW,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvE,IAAI,WAAW,CAAC,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3D,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,+BAAmB;YAAE,MAAM;QAErD,IAAI,IAAI,+BAAmB,CAAC;QAC5B,IAAI,IAAI,GAAG,+BAAmB,IAAI,wCAA4B;YAAE,SAAS;QAEzE,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,2FAA2F;QAC3F,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;IACmB,OAAO,CAAS;IAChB,kBAAkB,CAAS;IAE5C,YAAY,OAAe,EAAE,kBAA0B;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,IAAY;QAEZ,MAAM,EACJ,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GACpC,GAAG,MAAM,IAAA,sBAAO,EAAoB;YACnC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,wBAAwB;SAC9D,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAuB;YAC9D,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,YAAY;SAC5C,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,EACJ,IAAI,EAAE,EACJ,IAAI,EAAE,EACJ,MAAM,EAAE,EACN,YAAY,EAAE,OAAO,EACrB,gBAAgB,EAAE,YAAY,EAC9B,iBAAiB,EAAE,QAAQ,EAC3B,iBAAiB,EAAE,QAAQ,EAC3B,qBAAqB,EAAE,UAAU,EACjC,sBAAsB,EAAE,gBAAgB,GACzC,GACF,GACF,GACF,GAAG,MAAM,IAAA,sBAAO,EAAsB;YACrC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,iBAAiB;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,EACJ,IAAI,EAAE,EACJ,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GACvB,GACF,GAAG,MAAM,IAAA,sBAAO,EAA4B;YAC3C,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,mBAAmB;YACvC,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAe;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAS;YACxD,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,6BAA6B,KAAK,EAAE;SAC1E,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAChD,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,uBAAuB,KAAK,yCAAyC,EACrG,iBAAiB,CAClB,CAAC;QACF,KAAK,MAAM,WAAW,IAAI,eAAe,EAAE,CAAC;YAC1C,WAAW,CAAC,IAAI,GAAG,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAA8B,CAAC;QAC5F,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAyB;YAClE,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,aAAa,IAAI,cAAc;SAC/D,CAAC,CAAC;QACH,OAAO,WAAW,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,6BAA6B,CACjC,IAAY,EACZ,KAAa,EACb,OAAe;QAEf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAS;YAC7D,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,6BAA6B,KAAK,UAAU,KAAK,EAAE;SACzF,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,MAAM,oBAAoB,CACrD,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,uBAAuB,KAAK,UAAU,KAAK,EAAE,EAC7E,sBAAsB,CACvB,CAAC;QAEF,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE,CAAC;YAClD,eAAyC,CAAC,QAAQ;gBACjD,MAA8C,CAAC;QACnD,CAAC;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,IAAY;QACxC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAS;YAClD,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,eAAe;SACrD,CAAC,CAAC;QAEH,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,GAAG,WAAW,EAAE,CAAC;YAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAc;gBAClD,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,gBAAgB,IAAI,SAAS,+BAAmB,EAAE;aACxF,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,IAAI,GAAG,+BAAmB,CAAC;QACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,4BAA4B,CAAC,IAAY;QAC7C,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,sBAAO,EAAS;YAClD,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,aAAa,IAAI,eAAe;SACrD,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,MAAM,EACJ,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,GAC/B,GAAG,MAAM,IAAA,sBAAO,EAAuB;YACtC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,iBAAiB,2BAAe,eAAe;SACpE,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;;AAED,0BACE,WAAmB,EACnB,qBAA6B;IAE7B,OAAO,IAAI,oBAAoB,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AACtE,CAAC"}
|
package/lib-es/constants.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export declare const TRANSACTION_OPTIONS_TX_HASH_SIGN = 1;
|
|
|
3
3
|
export declare const TRANSACTION_VERSION_DEFAULT = 2;
|
|
4
4
|
export declare const METACHAIN_SHARD = 4294967295;
|
|
5
5
|
export declare const MAX_PAGINATION_SIZE = 50;
|
|
6
|
+
export declare const MAX_PAGINATION_RESULT_WINDOW = 10000;
|
|
6
7
|
export declare const GAS: {
|
|
7
8
|
ESDT_TRANSFER: number;
|
|
8
9
|
DELEGATE: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,eAAO,MAAM,gCAAgC,IAAS,CAAC;AACvD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,GAAG;IACd,aAAa;IACb,QAAQ;IACR,KAAK;CACN,CAAC;AACF,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,qBAAqB,EAAE,SAAgD,CAAC;AACrF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,uBAAuB,mEAC8B,CAAC;AACnE,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,wBAAwB,mEAC6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,eAAO,MAAM,gCAAgC,IAAS,CAAC;AACvD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,eAAO,MAAM,GAAG;IACd,aAAa;IACb,QAAQ;IACR,KAAK;CACN,CAAC;AACF,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,qBAAqB,EAAE,SAAgD,CAAC;AACrF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,uBAAuB,mEAC8B,CAAC;AACnE,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,wBAAwB,mEAC6B,CAAC"}
|
package/lib-es/constants.js
CHANGED
|
@@ -3,6 +3,7 @@ export const TRANSACTION_OPTIONS_TX_HASH_SIGN = 0b0001;
|
|
|
3
3
|
export const TRANSACTION_VERSION_DEFAULT = 2;
|
|
4
4
|
export const METACHAIN_SHARD = 4294967295;
|
|
5
5
|
export const MAX_PAGINATION_SIZE = 50;
|
|
6
|
+
export const MAX_PAGINATION_RESULT_WINDOW = 10000;
|
|
6
7
|
export const GAS = {
|
|
7
8
|
ESDT_TRANSFER: 500000,
|
|
8
9
|
DELEGATE: 75000000,
|
package/lib-es/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;CACf,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAc,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAClC,gEAAgE,CAAC;AACnE,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,wBAAwB,GACnC,gEAAgE,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAClD,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,OAAO;CACf,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAc,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAClC,gEAAgE,CAAC;AACnE,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,wBAAwB,GACnC,gEAAgE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAIlB,WAAW,EACZ,MAAM,UAAU,CAAC;AA0ElB,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAE5C,YAAY,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAGtD;IAEK,iBAAiB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAQjE;IAEK,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlD;IAEK,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAmB7C;IAEK,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAelD;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAenF;IAEK,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAMzE;IAEK,6BAA6B,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkBrC;IAEK,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAiBhE;IAEK,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;IAEK,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAQhD;IAEK,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnD;CACF;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,MAAM,GAC5B,oBAAoB,CAEtB"}
|
package/lib-es/network/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import network from "@ledgerhq/live-network";
|
|
2
|
-
import { METACHAIN_SHARD, MAX_PAGINATION_SIZE } from "../constants";
|
|
2
|
+
import { METACHAIN_SHARD, MAX_PAGINATION_SIZE, MAX_PAGINATION_RESULT_WINDOW } from "../constants";
|
|
3
3
|
const decodeTransactionMode = (action) => {
|
|
4
4
|
if (!action)
|
|
5
5
|
return "send";
|
|
@@ -9,6 +9,40 @@ const decodeTransactionMode = (action) => {
|
|
|
9
9
|
return "send";
|
|
10
10
|
return action.name;
|
|
11
11
|
};
|
|
12
|
+
async function fetchAllTransactions(url, totalCount) {
|
|
13
|
+
const allTransactions = [];
|
|
14
|
+
const seenHashes = new Set();
|
|
15
|
+
let from = 0;
|
|
16
|
+
let before;
|
|
17
|
+
while (allTransactions.length < totalCount) {
|
|
18
|
+
const beforeParam = before ? `&before=${before}` : "";
|
|
19
|
+
const { data } = await network({
|
|
20
|
+
method: "GET",
|
|
21
|
+
url: `${url}&from=${from}&size=${MAX_PAGINATION_SIZE}${beforeParam}`,
|
|
22
|
+
});
|
|
23
|
+
const transactions = data ?? [];
|
|
24
|
+
for (const transaction of transactions) {
|
|
25
|
+
if (transaction.txHash && seenHashes.has(transaction.txHash))
|
|
26
|
+
continue;
|
|
27
|
+
if (transaction.txHash)
|
|
28
|
+
seenHashes.add(transaction.txHash);
|
|
29
|
+
allTransactions.push(transaction);
|
|
30
|
+
}
|
|
31
|
+
if (transactions.length < MAX_PAGINATION_SIZE)
|
|
32
|
+
break;
|
|
33
|
+
from += MAX_PAGINATION_SIZE;
|
|
34
|
+
if (from + MAX_PAGINATION_SIZE <= MAX_PAGINATION_RESULT_WINDOW)
|
|
35
|
+
continue;
|
|
36
|
+
const oldest = transactions[transactions.length - 1].timestamp;
|
|
37
|
+
if (oldest === undefined || oldest + 1 === before) {
|
|
38
|
+
throw new Error("MultiversX pagination cannot move past the API result window");
|
|
39
|
+
}
|
|
40
|
+
// `before` is exclusive: re-read the oldest second so same-timestamp transactions are kept
|
|
41
|
+
before = oldest + 1;
|
|
42
|
+
from = 0;
|
|
43
|
+
}
|
|
44
|
+
return allTransactions;
|
|
45
|
+
}
|
|
12
46
|
export class MultiversXNetworkApi {
|
|
13
47
|
API_URL;
|
|
14
48
|
DELEGATION_API_URL;
|
|
@@ -55,18 +89,9 @@ export class MultiversXNetworkApi {
|
|
|
55
89
|
method: "GET",
|
|
56
90
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?after=${after}`,
|
|
57
91
|
});
|
|
58
|
-
const allTransactions =
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const { data: transactions } = await network({
|
|
62
|
-
method: "GET",
|
|
63
|
-
url: `${this.API_URL}/accounts/${addr}/transactions?after=${after}&from=${from}&size=${MAX_PAGINATION_SIZE}&withOperations=true&withScResults=true`,
|
|
64
|
-
});
|
|
65
|
-
for (const transaction of transactions ?? []) {
|
|
66
|
-
transaction.mode = decodeTransactionMode(transaction.action);
|
|
67
|
-
}
|
|
68
|
-
allTransactions.push(...(transactions ?? []));
|
|
69
|
-
from = from + MAX_PAGINATION_SIZE;
|
|
92
|
+
const allTransactions = await fetchAllTransactions(`${this.API_URL}/accounts/${addr}/transactions?after=${after}&withOperations=true&withScResults=true`, transactionsCount);
|
|
93
|
+
for (const transaction of allTransactions) {
|
|
94
|
+
transaction.mode = decodeTransactionMode(transaction.action);
|
|
70
95
|
}
|
|
71
96
|
return allTransactions;
|
|
72
97
|
}
|
|
@@ -83,16 +108,7 @@ export class MultiversXNetworkApi {
|
|
|
83
108
|
method: "GET",
|
|
84
109
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?token=${token}&after=${after}`,
|
|
85
110
|
});
|
|
86
|
-
const allTokenTransactions =
|
|
87
|
-
let from = 0;
|
|
88
|
-
while (from < tokenTransactionsCount) {
|
|
89
|
-
const { data: tokenTransactions } = await network({
|
|
90
|
-
method: "GET",
|
|
91
|
-
url: `${this.API_URL}/accounts/${addr}/transactions?token=${token}&from=${from}&after=${after}&size=${MAX_PAGINATION_SIZE}`,
|
|
92
|
-
});
|
|
93
|
-
allTokenTransactions.push(...(tokenTransactions ?? []));
|
|
94
|
-
from = from + MAX_PAGINATION_SIZE;
|
|
95
|
-
}
|
|
111
|
+
const allTokenTransactions = await fetchAllTransactions(`${this.API_URL}/accounts/${addr}/transactions?token=${token}&after=${after}`, tokenTransactionsCount);
|
|
96
112
|
for (const esdtTransaction of allTokenTransactions) {
|
|
97
113
|
esdtTransaction.transfer =
|
|
98
114
|
"esdt";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/network/api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-multiversx",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1-nightly.20260929020940",
|
|
4
4
|
"description": "Ledger MultiversX Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -49,8 +49,9 @@
|
|
|
49
49
|
},
|
|
50
50
|
"license": "Apache-2.0",
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@ledgerhq/coin-module-framework": "9.
|
|
52
|
+
"@ledgerhq/coin-module-framework": "9.2.0",
|
|
53
53
|
"@ledgerhq/devices": "8.18.0",
|
|
54
|
+
"@ledgerhq/live-env": "4.1.0",
|
|
54
55
|
"@ledgerhq/live-network": "3.1.0",
|
|
55
56
|
"@ledgerhq/logs": "6.19.0",
|
|
56
57
|
"@multiversx/sdk-core": "^13.7.0",
|
|
@@ -62,9 +63,8 @@
|
|
|
62
63
|
"lodash": "4.17.21",
|
|
63
64
|
"protobufjs": "^7.2.6",
|
|
64
65
|
"rxjs": "7.8.2",
|
|
65
|
-
"@ledgerhq/
|
|
66
|
-
"@ledgerhq/types-live": "^6.
|
|
67
|
-
"@ledgerhq/ledger-wallet-framework": "^3.5.0"
|
|
66
|
+
"@ledgerhq/ledger-wallet-framework": "^3.6.0-nightly.20260929020940",
|
|
67
|
+
"@ledgerhq/types-live": "^6.126.0-nightly.20260929020940"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@swc/core": "1.15.11",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"oxfmt": "0.67.0",
|
|
79
79
|
"oxlint": "1.82.0",
|
|
80
80
|
"@ledgerhq/test-quarantine": "0.0.0",
|
|
81
|
-
"@ledgerhq/
|
|
82
|
-
"@ledgerhq/
|
|
81
|
+
"@ledgerhq/wallet-framework-test-setup": "^0.1.12-nightly.20260929020940",
|
|
82
|
+
"@ledgerhq/disable-network-setup": "^0.3.0"
|
|
83
83
|
},
|
|
84
84
|
"scripts": {
|
|
85
85
|
"clean": "rimraf lib lib-es",
|
|
@@ -92,6 +92,7 @@
|
|
|
92
92
|
"lint:fix": "oxfmt src && oxlint src --fix --quiet",
|
|
93
93
|
"test": "jest",
|
|
94
94
|
"test-integ": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js --config=jest.integ.config.js",
|
|
95
|
+
"typecheck": "tsc --noEmit --customConditions node",
|
|
95
96
|
"unimported": "unimported",
|
|
96
97
|
"format": "oxfmt src",
|
|
97
98
|
"format:check": "oxfmt src --check"
|
package/src/constants.ts
CHANGED
|
@@ -4,6 +4,7 @@ export const TRANSACTION_OPTIONS_TX_HASH_SIGN = 0b0001;
|
|
|
4
4
|
export const TRANSACTION_VERSION_DEFAULT = 2;
|
|
5
5
|
export const METACHAIN_SHARD = 4294967295;
|
|
6
6
|
export const MAX_PAGINATION_SIZE = 50;
|
|
7
|
+
export const MAX_PAGINATION_RESULT_WINDOW = 10000;
|
|
7
8
|
export const GAS = {
|
|
8
9
|
ESDT_TRANSFER: 500000,
|
|
9
10
|
DELEGATE: 75000000,
|
package/src/network/api.test.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import network from "@ledgerhq/live-network";
|
|
2
|
+
import { MAX_PAGINATION_RESULT_WINDOW } from "../constants";
|
|
3
|
+
import type { MultiversXApiTransaction } from "../types";
|
|
2
4
|
import { MultiversXNetworkApi } from "./api";
|
|
3
5
|
|
|
4
6
|
jest.mock("@ledgerhq/live-network", () => {
|
|
@@ -6,16 +8,46 @@ jest.mock("@ledgerhq/live-network", () => {
|
|
|
6
8
|
return { __esModule: true, default: fn };
|
|
7
9
|
});
|
|
8
10
|
|
|
11
|
+
const mockedNetwork = network as unknown as jest.Mock;
|
|
12
|
+
|
|
13
|
+
function makeTransactions(count: number, transactionsPerTimestamp = 1): MultiversXApiTransaction[] {
|
|
14
|
+
return Array.from(
|
|
15
|
+
{ length: count },
|
|
16
|
+
(_, i) =>
|
|
17
|
+
({
|
|
18
|
+
txHash: `tx-${i}`,
|
|
19
|
+
timestamp: count - Math.floor(i / transactionsPerTimestamp),
|
|
20
|
+
}) as MultiversXApiTransaction,
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function mockApi(transactions: MultiversXApiTransaction[], count = transactions.length) {
|
|
25
|
+
mockedNetwork.mockImplementation(async ({ url }: { url: string }) => {
|
|
26
|
+
if (url.includes("/transactions/count")) return { data: count };
|
|
27
|
+
const params = new URL(url).searchParams;
|
|
28
|
+
const from = Number(params.get("from"));
|
|
29
|
+
const size = Number(params.get("size"));
|
|
30
|
+
const before = params.get("before");
|
|
31
|
+
if (from + size > MAX_PAGINATION_RESULT_WINDOW) {
|
|
32
|
+
throw new Error("Result window is too large");
|
|
33
|
+
}
|
|
34
|
+
const filtered = before
|
|
35
|
+
? transactions.filter(tx => (tx.timestamp ?? 0) < Number(before))
|
|
36
|
+
: transactions;
|
|
37
|
+
return { data: filtered.slice(from, from + size) };
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
9
41
|
describe("MultiversXNetworkApi startAt clamping", () => {
|
|
10
42
|
const api = new MultiversXNetworkApi("https://api.example.com", "https://deleg.example.com");
|
|
11
43
|
|
|
12
44
|
beforeEach(() => {
|
|
13
|
-
|
|
45
|
+
mockedNetwork.mockReset();
|
|
14
46
|
});
|
|
15
47
|
|
|
16
48
|
test("getHistory clamps startAt=0 to after=1", async () => {
|
|
17
49
|
// First call gets the count, 0 means no pagination loop
|
|
18
|
-
|
|
50
|
+
mockedNetwork.mockResolvedValueOnce({ data: 0 });
|
|
19
51
|
|
|
20
52
|
await api.getHistory("erd1testaddress", 0);
|
|
21
53
|
|
|
@@ -28,7 +60,7 @@ describe("MultiversXNetworkApi startAt clamping", () => {
|
|
|
28
60
|
});
|
|
29
61
|
|
|
30
62
|
test("getHistory uses positive startAt unchanged", async () => {
|
|
31
|
-
|
|
63
|
+
mockedNetwork.mockResolvedValueOnce({ data: 0 });
|
|
32
64
|
|
|
33
65
|
await api.getHistory("erd1positive", 123);
|
|
34
66
|
|
|
@@ -41,7 +73,7 @@ describe("MultiversXNetworkApi startAt clamping", () => {
|
|
|
41
73
|
});
|
|
42
74
|
|
|
43
75
|
test("getESDTTransactionsForAddress clamps startAt=0 to after=1", async () => {
|
|
44
|
-
|
|
76
|
+
mockedNetwork.mockResolvedValueOnce({ data: 0 });
|
|
45
77
|
|
|
46
78
|
await api.getESDTTransactionsForAddress("erd1tokaddr", "TOKEN-abc", 0);
|
|
47
79
|
|
|
@@ -56,7 +88,7 @@ describe("MultiversXNetworkApi startAt clamping", () => {
|
|
|
56
88
|
});
|
|
57
89
|
|
|
58
90
|
test("getESDTTransactionsForAddress uses positive startAt unchanged", async () => {
|
|
59
|
-
|
|
91
|
+
mockedNetwork.mockResolvedValueOnce({ data: 0 });
|
|
60
92
|
|
|
61
93
|
await api.getESDTTransactionsForAddress("erd1tokaddr", "TOKEN-abc", 456);
|
|
62
94
|
|
|
@@ -70,3 +102,53 @@ describe("MultiversXNetworkApi startAt clamping", () => {
|
|
|
70
102
|
);
|
|
71
103
|
});
|
|
72
104
|
});
|
|
105
|
+
|
|
106
|
+
describe("MultiversXNetworkApi pagination past the result window", () => {
|
|
107
|
+
const api = new MultiversXNetworkApi("https://api.example.com", "https://deleg.example.com");
|
|
108
|
+
|
|
109
|
+
beforeEach(() => {
|
|
110
|
+
mockedNetwork.mockReset();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("getHistory returns every transaction beyond the window", async () => {
|
|
114
|
+
const transactions = makeTransactions(MAX_PAGINATION_RESULT_WINDOW + 50);
|
|
115
|
+
mockApi(transactions);
|
|
116
|
+
|
|
117
|
+
const result = await api.getHistory("erd1big", 0);
|
|
118
|
+
|
|
119
|
+
expect(result.map(tx => tx.txHash)).toEqual(transactions.map(tx => tx.txHash));
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("getHistory keeps transactions sharing a timestamp across the window boundary", async () => {
|
|
123
|
+
const transactions = makeTransactions(MAX_PAGINATION_RESULT_WINDOW + 50, 7);
|
|
124
|
+
mockApi(transactions);
|
|
125
|
+
|
|
126
|
+
const result = await api.getHistory("erd1big", 0);
|
|
127
|
+
|
|
128
|
+
expect(result.map(tx => tx.txHash)).toEqual(transactions.map(tx => tx.txHash));
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("getESDTTransactionsForAddress returns every transaction beyond the window", async () => {
|
|
132
|
+
const transactions = makeTransactions(MAX_PAGINATION_RESULT_WINDOW + 50);
|
|
133
|
+
mockApi(transactions);
|
|
134
|
+
|
|
135
|
+
const result = await api.getESDTTransactionsForAddress("erd1big", "TOKEN-abc", 0);
|
|
136
|
+
|
|
137
|
+
expect(result.map(tx => tx.txHash)).toEqual(transactions.map(tx => tx.txHash));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("getHistory stops on a short page when count overstates the history", async () => {
|
|
141
|
+
const transactions = makeTransactions(5);
|
|
142
|
+
mockApi(transactions, 20);
|
|
143
|
+
|
|
144
|
+
const result = await api.getHistory("erd1short", 0);
|
|
145
|
+
|
|
146
|
+
expect(result.map(tx => tx.txHash)).toEqual(transactions.map(tx => tx.txHash));
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test("getHistory throws when a full window shares one timestamp", async () => {
|
|
150
|
+
mockApi(makeTransactions(MAX_PAGINATION_RESULT_WINDOW + 50, MAX_PAGINATION_RESULT_WINDOW + 50));
|
|
151
|
+
|
|
152
|
+
await expect(api.getHistory("erd1stuck", 0)).rejects.toThrow("result window");
|
|
153
|
+
});
|
|
154
|
+
});
|
package/src/network/api.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import network from "@ledgerhq/live-network";
|
|
2
|
-
import { METACHAIN_SHARD, MAX_PAGINATION_SIZE } from "../constants";
|
|
2
|
+
import { METACHAIN_SHARD, MAX_PAGINATION_SIZE, MAX_PAGINATION_RESULT_WINDOW } from "../constants";
|
|
3
3
|
import type {
|
|
4
4
|
ESDTToken,
|
|
5
5
|
MultiversXApiTransaction,
|
|
@@ -42,6 +42,47 @@ const decodeTransactionMode = (action?: MultiversXTransactionAction): string =>
|
|
|
42
42
|
return action.name;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
+
async function fetchAllTransactions(
|
|
46
|
+
url: string,
|
|
47
|
+
totalCount: number,
|
|
48
|
+
): Promise<MultiversXApiTransaction[]> {
|
|
49
|
+
const allTransactions: MultiversXApiTransaction[] = [];
|
|
50
|
+
const seenHashes = new Set<string>();
|
|
51
|
+
let from = 0;
|
|
52
|
+
let before: number | undefined;
|
|
53
|
+
|
|
54
|
+
while (allTransactions.length < totalCount) {
|
|
55
|
+
const beforeParam = before ? `&before=${before}` : "";
|
|
56
|
+
const { data } = await network<MultiversXApiTransaction[]>({
|
|
57
|
+
method: "GET",
|
|
58
|
+
url: `${url}&from=${from}&size=${MAX_PAGINATION_SIZE}${beforeParam}`,
|
|
59
|
+
});
|
|
60
|
+
const transactions = data ?? [];
|
|
61
|
+
|
|
62
|
+
for (const transaction of transactions) {
|
|
63
|
+
if (transaction.txHash && seenHashes.has(transaction.txHash)) continue;
|
|
64
|
+
if (transaction.txHash) seenHashes.add(transaction.txHash);
|
|
65
|
+
allTransactions.push(transaction);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (transactions.length < MAX_PAGINATION_SIZE) break;
|
|
69
|
+
|
|
70
|
+
from += MAX_PAGINATION_SIZE;
|
|
71
|
+
if (from + MAX_PAGINATION_SIZE <= MAX_PAGINATION_RESULT_WINDOW) continue;
|
|
72
|
+
|
|
73
|
+
const oldest = transactions[transactions.length - 1].timestamp;
|
|
74
|
+
if (oldest === undefined || oldest + 1 === before) {
|
|
75
|
+
throw new Error("MultiversX pagination cannot move past the API result window");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// `before` is exclusive: re-read the oldest second so same-timestamp transactions are kept
|
|
79
|
+
before = oldest + 1;
|
|
80
|
+
from = 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return allTransactions;
|
|
84
|
+
}
|
|
85
|
+
|
|
45
86
|
export class MultiversXNetworkApi {
|
|
46
87
|
private readonly API_URL: string;
|
|
47
88
|
private readonly DELEGATION_API_URL: string;
|
|
@@ -116,18 +157,12 @@ export class MultiversXNetworkApi {
|
|
|
116
157
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?after=${after}`,
|
|
117
158
|
});
|
|
118
159
|
|
|
119
|
-
const allTransactions
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
});
|
|
126
|
-
for (const transaction of transactions ?? []) {
|
|
127
|
-
transaction.mode = decodeTransactionMode(transaction.action) as MultiversXTransactionMode;
|
|
128
|
-
}
|
|
129
|
-
allTransactions.push(...(transactions ?? []));
|
|
130
|
-
from = from + MAX_PAGINATION_SIZE;
|
|
160
|
+
const allTransactions = await fetchAllTransactions(
|
|
161
|
+
`${this.API_URL}/accounts/${addr}/transactions?after=${after}&withOperations=true&withScResults=true`,
|
|
162
|
+
transactionsCount,
|
|
163
|
+
);
|
|
164
|
+
for (const transaction of allTransactions) {
|
|
165
|
+
transaction.mode = decodeTransactionMode(transaction.action) as MultiversXTransactionMode;
|
|
131
166
|
}
|
|
132
167
|
return allTransactions;
|
|
133
168
|
}
|
|
@@ -151,16 +186,10 @@ export class MultiversXNetworkApi {
|
|
|
151
186
|
url: `${this.API_URL}/accounts/${addr}/transactions/count?token=${token}&after=${after}`,
|
|
152
187
|
});
|
|
153
188
|
|
|
154
|
-
const allTokenTransactions
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
method: "GET",
|
|
159
|
-
url: `${this.API_URL}/accounts/${addr}/transactions?token=${token}&from=${from}&after=${after}&size=${MAX_PAGINATION_SIZE}`,
|
|
160
|
-
});
|
|
161
|
-
allTokenTransactions.push(...(tokenTransactions ?? []));
|
|
162
|
-
from = from + MAX_PAGINATION_SIZE;
|
|
163
|
-
}
|
|
189
|
+
const allTokenTransactions = await fetchAllTransactions(
|
|
190
|
+
`${this.API_URL}/accounts/${addr}/transactions?token=${token}&after=${after}`,
|
|
191
|
+
tokenTransactionsCount,
|
|
192
|
+
);
|
|
164
193
|
|
|
165
194
|
for (const esdtTransaction of allTokenTransactions) {
|
|
166
195
|
(esdtTransaction as { transfer?: string }).transfer =
|