@ledgerhq/coin-xrp 0.8.0-nightly.7 → 0.8.1-next.0

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.
@@ -16,44 +16,58 @@ import { RIPPLE_EPOCH } from "./utils";
16
16
  * @returns
17
17
  */
18
18
  export function listOperations(address_1, _a) {
19
- return __awaiter(this, arguments, void 0, function* (address, { limit, mostRecentIndex, startAt, }) {
19
+ return __awaiter(this, arguments, void 0, function* (address, { limit, maxHeight, minHeight, }) {
20
20
  const serverInfo = yield getServerInfos();
21
21
  const ledgers = serverInfo.info.complete_ledgers.split("-");
22
22
  const minLedgerVersion = Number(ledgers[0]);
23
23
  const maxLedgerVersion = Number(ledgers[1]);
24
24
  let options = {
25
- ledger_index_max: mostRecentIndex !== null && mostRecentIndex !== void 0 ? mostRecentIndex : maxLedgerVersion,
25
+ ledger_index_max: maxHeight !== null && maxHeight !== void 0 ? maxHeight : maxLedgerVersion,
26
26
  tx_type: "Payment",
27
27
  };
28
28
  if (limit) {
29
29
  options = Object.assign(Object.assign({}, options), { limit });
30
30
  }
31
- if (startAt) {
31
+ if (minHeight) {
32
32
  options = Object.assign(Object.assign({}, options), {
33
33
  // if there is no ops, it might be after a clear and we prefer to pull from the oldest possible history
34
- ledger_index_min: Math.max(startAt, minLedgerVersion) });
34
+ ledger_index_min: Math.max(minHeight, minLedgerVersion) });
35
35
  }
36
- // We need to filter out the transactions that are not "Payment" type because the filter on "tx_type" of the node RPC
37
- // is not working as expected. It returns all the transactions. We need to call the node RPC multiple times to get the
38
- // desired number of transactions by the limiter.
39
- let transactions = [];
40
- let needToStop = true;
41
- do {
42
- const newTransactions = yield getTransactions(address, options);
43
- const newPaymentsTxs = newTransactions.filter(tx => tx.tx_json.TransactionType === "Payment");
44
- if (options.limit) {
45
- needToStop = newTransactions.length < options.limit;
46
- options.ledger_index_max = newTransactions.slice(-1)[0].tx_json.ledger_index - 1;
47
- }
48
- transactions = transactions.concat(newPaymentsTxs);
49
- } while (options.limit &&
50
- !needToStop &&
51
- transactions.length < options.limit &&
52
- (options.limit -= transactions.length));
53
- return [
54
- transactions.map(convertToCoreOperation(address)),
55
- transactions.slice(-1)[0].tx_json.ledger_index - 1, // Returns the next index to start from for pagination
56
- ];
36
+ function getPaymentTransactions(address, options) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const txs = yield getTransactions(address, options);
39
+ // Filter out the transactions that are not "Payment" type because the filter on "tx_type" of the node RPC is not working as expected.
40
+ const paymentTxs = txs.filter(tx => tx.tx_json.TransactionType === "Payment");
41
+ const shortage = (options.limit && txs.length < options.limit) || false;
42
+ const lastTransaction = txs.slice(-1)[0];
43
+ const nextOptions = Object.assign({}, options);
44
+ if (lastTransaction) {
45
+ nextOptions.ledger_index_max = lastTransaction.tx_json.ledger_index - 1;
46
+ if (nextOptions.limit)
47
+ nextOptions.limit -= paymentTxs.length;
48
+ }
49
+ return [shortage, nextOptions, paymentTxs];
50
+ });
51
+ }
52
+ // TODO BUG: given the number of txs belonging to the SAME block > limit
53
+ // when user loop over pages using the provided token
54
+ // then user misses some txs that doesn't fit the page size limit
55
+ // because the "next token" is a block height (solution is to use an opaque token instead)
56
+ let [txShortage, nextOptions, transactions] = yield getPaymentTransactions(address, options);
57
+ const isEnough = () => txShortage || (limit && transactions.length >= limit);
58
+ // We need to call the node RPC multiple times to get the desired number of transactions by the limiter.
59
+ while (nextOptions.limit && !isEnough()) {
60
+ const [newTxShortage, newNextOptions, newTransactions] = yield getPaymentTransactions(address, nextOptions);
61
+ txShortage = newTxShortage;
62
+ nextOptions = newNextOptions;
63
+ transactions = transactions.concat(newTransactions);
64
+ }
65
+ const lastTransaction = transactions.slice(-1)[0];
66
+ // the next index to start the pagination from
67
+ const nextIndex = lastTransaction
68
+ ? Math.max(lastTransaction.tx_json.ledger_index - 1, minLedgerVersion)
69
+ : minLedgerVersion;
70
+ return [transactions.map(convertToCoreOperation(address)), nextIndex];
57
71
  });
58
72
  }
59
73
  const convertToCoreOperation = (address) => (operation) => {
@@ -1 +1 @@
1
- {"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/logic/listOperations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/logic/listOperations.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
+ import { assert } from "console";
10
11
  import { listOperations } from "./listOperations";
11
12
  import { RIPPLE_EPOCH } from "./utils";
13
+ const maxHeight = 2;
14
+ const minHeight = 1;
12
15
  const mockGetServerInfos = jest.fn().mockResolvedValue({
13
16
  info: {
14
- complete_ledgers: "1-2",
17
+ complete_ledgers: `${minHeight}-${maxHeight}`,
15
18
  },
16
19
  });
17
20
  const mockGetTransactions = jest.fn();
@@ -24,6 +27,82 @@ describe("listOperations", () => {
24
27
  mockGetServerInfos.mockClear();
25
28
  mockGetTransactions.mockClear();
26
29
  });
30
+ it("when there are no transactions then the result is empty", () => __awaiter(void 0, void 0, void 0, function* () {
31
+ // Given
32
+ mockGetTransactions.mockResolvedValue([]);
33
+ // When
34
+ const [results, token] = yield listOperations("any address", { minHeight: 0 });
35
+ // Then
36
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
37
+ expect(mockGetTransactions).toHaveBeenCalledTimes(1);
38
+ expect(results).toEqual([]);
39
+ expect(token).toEqual(minHeight);
40
+ }));
41
+ it("when there are no transactions and a limit then the result is empty", () => __awaiter(void 0, void 0, void 0, function* () {
42
+ // Given
43
+ mockGetTransactions.mockResolvedValue([]);
44
+ // When
45
+ const [results, token] = yield listOperations("any address", { minHeight: 0, limit: 1 });
46
+ // Then
47
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
48
+ expect(mockGetTransactions).toHaveBeenCalledTimes(1);
49
+ expect(results).toEqual([]);
50
+ expect(token).toEqual(minHeight);
51
+ }));
52
+ const paymentTx = {
53
+ ledger_hash: "HASH_VALUE_BLOCK",
54
+ hash: "HASH_VALUE",
55
+ close_time_iso: "2000-01-01T00:00:01Z",
56
+ meta: { delivered_amount: "100" },
57
+ tx_json: {
58
+ TransactionType: "Payment",
59
+ Fee: "1",
60
+ ledger_index: 2,
61
+ date: 1000,
62
+ Account: "sender",
63
+ Destination: "dest",
64
+ Sequence: 1,
65
+ },
66
+ };
67
+ const otherTx = Object.assign(Object.assign({}, paymentTx), { tx_json: Object.assign(Object.assign({}, paymentTx.tx_json), { TransactionType: "Other" }) });
68
+ it("should only list operations of type payment", () => __awaiter(void 0, void 0, void 0, function* () {
69
+ // Given
70
+ const lastTransaction = paymentTx;
71
+ mockGetTransactions.mockResolvedValueOnce([paymentTx, otherTx, lastTransaction]);
72
+ mockGetTransactions.mockResolvedValue([]); // subsequent calls
73
+ // When
74
+ const [results, token] = yield listOperations("any address", { minHeight: 0, limit: 3 });
75
+ // Then
76
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
77
+ // it's called twice because first call yields only 2 transactions, and 3 are asked
78
+ expect(mockGetTransactions).toHaveBeenCalledTimes(2);
79
+ expect(results.length).toEqual(2);
80
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
81
+ }));
82
+ it("should make enough calls so that the limit requested is satified", () => __awaiter(void 0, void 0, void 0, function* () {
83
+ const lastTransaction = otherTx;
84
+ const txs = [paymentTx, paymentTx, otherTx, otherTx, otherTx, otherTx, otherTx, otherTx];
85
+ assert(txs.length === 8);
86
+ mockGetTransactions.mockResolvedValue(txs);
87
+ const [results, token] = yield listOperations("any address", { minHeight: 0, limit: 8 });
88
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
89
+ // it's called 4 times because each call yields only 2 transactions, and 8 are asked
90
+ expect(mockGetTransactions).toHaveBeenCalledTimes(4);
91
+ expect(results.length).toEqual(8);
92
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
93
+ }));
94
+ it("should make enough calls, even if there is not enough txs to satisfy the limit", () => __awaiter(void 0, void 0, void 0, function* () {
95
+ mockGetTransactions.mockResolvedValueOnce([otherTx, otherTx, otherTx, otherTx]);
96
+ mockGetTransactions.mockResolvedValueOnce([paymentTx, paymentTx]);
97
+ mockGetTransactions.mockResolvedValue([]); // subsequent calls
98
+ const lastTransaction = paymentTx;
99
+ const [results, token] = yield listOperations("any address", { minHeight: 0, limit: 4 });
100
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
101
+ // it's called 2 times because the second call is a shortage of txs
102
+ expect(mockGetTransactions).toHaveBeenCalledTimes(2);
103
+ expect(results.length).toEqual(2);
104
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
105
+ }));
27
106
  it.each([
28
107
  {
29
108
  address: "WHATEVER_ADDRESS",
@@ -38,7 +117,7 @@ describe("listOperations", () => {
38
117
  expectedType: "OUT",
39
118
  },
40
119
  ])("should return the list of operations associated to an account", (_a) => __awaiter(void 0, [_a], void 0, function* ({ address, opSender, opDestination, expectedType }) {
41
- // Givem
120
+ // Given
42
121
  const deliveredAmount = 100;
43
122
  const fee = 10;
44
123
  mockGetTransactions.mockResolvedValue([
@@ -98,7 +177,7 @@ describe("listOperations", () => {
98
177
  },
99
178
  ]);
100
179
  // When
101
- const [results, _] = yield listOperations(address, { startAt: 0 });
180
+ const [results, _] = yield listOperations(address, { minHeight: 0 });
102
181
  // Then
103
182
  expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
104
183
  expect(mockGetTransactions).toHaveBeenCalledTimes(1);
@@ -1 +1 @@
1
- {"version":3,"file":"listOperations.test.js","sourceRoot":"","sources":["../../src/logic/listOperations.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listOperations.test.js","sourceRoot":"","sources":["../../src/logic/listOperations.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;IACrD,IAAI,EAAE;QACJ,gBAAgB,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE;KAC9C;CACF,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACtC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;IAC1C,eAAe,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE;CAC7C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,CAAC,SAAS,EAAE,CAAC;QAC/B,mBAAmB,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACvE,QAAQ;QACR,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAS,EAAE;QACnF,QAAQ;QACR,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO;QACP,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAA,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG;QAChB,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE,sBAAsB;QACtC,IAAI,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE;QACjC,OAAO,EAAE;YACP,eAAe,EAAE,SAAS;YAC1B,GAAG,EAAE,GAAG;YACR,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,CAAC;SACZ;KACF,CAAC;IACF,MAAM,OAAO,mCAAQ,SAAS,KAAE,OAAO,kCAAO,SAAS,CAAC,OAAO,KAAE,eAAe,EAAE,OAAO,MAAI,CAAC;IAE9F,EAAE,CAAC,6CAA6C,EAAE,GAAS,EAAE;QAC3D,QAAQ;QACR,MAAM,eAAe,GAAG,SAAS,CAAC;QAClC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;QACjF,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;QAE9D,OAAO;QACP,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEzF,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,mFAAmF;QACnF,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAS,EAAE;QAChF,MAAM,eAAe,GAAG,OAAO,CAAC;QAChC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACzF,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QACzB,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAE3C,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEzF,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,oFAAoF;QACpF,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAS,EAAE;QAC9F,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAChF,mBAAmB,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;QAC9D,MAAM,eAAe,GAAG,SAAS,CAAC;QAElC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEzF,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,mEAAmE;QACnE,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN;YACE,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,cAAc;YACxB,aAAa,EAAE,kBAAkB;YACjC,YAAY,EAAE,IAAI;SACnB;QACD;YACE,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,kBAAkB;YAC5B,aAAa,EAAE,kBAAkB;YACjC,YAAY,EAAE,KAAK;SACpB;KACF,CAAC,CACA,+DAA+D,EAC/D,KAA2D,EAAE,4CAAtD,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE;QACvD,QAAQ;QACR,MAAM,eAAe,GAAG,GAAG,CAAC;QAC5B,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,mBAAmB,CAAC,iBAAiB,CAAC;YACpC;gBACE,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,YAAY;gBAClB,cAAc,EAAE,sBAAsB;gBACtC,IAAI,EAAE,EAAE,gBAAgB,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE;gBACtD,OAAO,EAAE;oBACP,eAAe,EAAE,SAAS;oBAC1B,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,YAAY,EAAE,CAAC;oBACf,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,aAAa;oBAC1B,QAAQ,EAAE,CAAC;iBACZ;aACF;YACD;gBACE,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,YAAY;gBAClB,cAAc,EAAE,sBAAsB;gBACtC,IAAI,EAAE,EAAE,gBAAgB,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE;gBACtD,OAAO,EAAE;oBACP,eAAe,EAAE,SAAS;oBAC1B,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,YAAY,EAAE,CAAC;oBACf,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,aAAa;oBAC1B,cAAc,EAAE,MAAM;oBACtB,QAAQ,EAAE,CAAC;iBACZ;aACF;YACD;gBACE,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,YAAY;gBAClB,cAAc,EAAE,sBAAsB;gBACtC,IAAI,EAAE,EAAE,gBAAgB,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE;gBACtD,OAAO,EAAE;oBACP,eAAe,EAAE,SAAS;oBAC1B,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,YAAY,EAAE,CAAC;oBACf,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,aAAa;oBAC1B,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE;gCACJ,QAAQ,EAAE,gEAAgE;gCAC1E,QAAQ,EAAE,UAAU;6BACrB;yBACF;qBACF;oBACD,QAAQ,EAAE,CAAC;iBACZ;aACF;SACF,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAErE,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,kFAAkF;QAClF,MAAM,aAAa,GACjB,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;QAClF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO;gBACP,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,YAAY;gBACxB,KAAK,EAAE,aAAa;gBACpB,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;gBAC3C,OAAO,EAAE,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,CAAC,aAAa,CAAC;gBAC3B,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC;gBAC7C,yBAAyB,EAAE,CAAC;aAC7B;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO;gBACP,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,YAAY;gBACxB,KAAK,EAAE,aAAa;gBACpB,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;gBAC3C,OAAO,EAAE,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,CAAC,aAAa,CAAC;gBAC3B,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC;gBAC7C,yBAAyB,EAAE,CAAC;gBAC5B,OAAO,EAAE;oBACP,cAAc,EAAE,MAAM;iBACvB;aACF;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO;gBACP,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,YAAY;gBACxB,KAAK,EAAE,aAAa;gBACpB,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;gBAC3C,OAAO,EAAE,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,CAAC,aAAa,CAAC;gBAC3B,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC;gBAC7C,yBAAyB,EAAE,CAAC;gBAC5B,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,gEAAgE;4BACtE,IAAI,EAAE,UAAU;yBACjB;qBACF;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAA,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAEvD,eAAO,MAAM,MAAM,cAAqB,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,YACP,OAAO,KAChB,OAAO,CAAC,WAAW,CAoCrB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,MAAM,WACN;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,KAC5F,OAAO,CAAC,aAAa,EAAE,CAQzB,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAEvD,eAAO,MAAM,MAAM,cAAqB,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAC;AAEF,eAAO,MAAM,cAAc,cACd,MAAM,YACP,OAAO,KAChB,OAAO,CAAC,WAAW,CAoCrB,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,MAAM,WACN;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,KAC5F,OAAO,CAAC,aAAa,EAAE,CAUzB,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
@@ -53,7 +53,10 @@ export const getServerInfos = () => __awaiter(void 0, void 0, void 0, function*
53
53
  return rpcCall("server_info", { ledger_index: "validated" });
54
54
  });
55
55
  export const getTransactions = (address, options) => __awaiter(void 0, void 0, void 0, function* () {
56
- const result = yield rpcCall("account_tx", Object.assign(Object.assign({ account: address }, options), { api_version: 2 }));
56
+ const result = yield rpcCall("account_tx", Object.assign(Object.assign({ account: address,
57
+ // newest first
58
+ // note that order within the results is not guaranteed (see documentation of account_tx)
59
+ forward: false }, options), { api_version: 2 }));
57
60
  return result.transactions;
58
61
  });
59
62
  export function getLedger() {
@@ -67,8 +70,8 @@ export function getLedgerIndex() {
67
70
  return result.ledger_index;
68
71
  });
69
72
  }
70
- function rpcCall(method, params) {
71
- return __awaiter(this, void 0, void 0, function* () {
73
+ function rpcCall(method_1) {
74
+ return __awaiter(this, arguments, void 0, function* (method, params = {}) {
72
75
  const { data: { result }, } = yield network({
73
76
  method: "POST",
74
77
  url: getNodeUrl(),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-xrp",
3
- "version": "0.8.0-nightly.7",
3
+ "version": "0.8.1-next.0",
4
4
  "description": "Ledger XRP Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -104,12 +104,12 @@
104
104
  "ripple-address-codec": "^5.0.0",
105
105
  "ripple-binary-codec": "^1.3.0",
106
106
  "rxjs": "^7.8.1",
107
- "@ledgerhq/coin-framework": "^0.21.0-nightly.7",
108
- "@ledgerhq/cryptoassets": "^13.8.0-nightly.0",
107
+ "@ledgerhq/coin-framework": "^0.22.0-next.0",
108
+ "@ledgerhq/cryptoassets": "^13.9.0-next.0",
109
109
  "@ledgerhq/devices": "8.4.4",
110
110
  "@ledgerhq/errors": "^6.19.1",
111
- "@ledgerhq/live-network": "^2.0.3",
112
- "@ledgerhq/types-live": "^6.55.0-nightly.4"
111
+ "@ledgerhq/live-network": "^2.0.4-next.0",
112
+ "@ledgerhq/types-live": "^6.57.0-next.0"
113
113
  },
114
114
  "devDependencies": {
115
115
  "@faker-js/faker": "^8.4.1",
@@ -121,7 +121,7 @@
121
121
  "ripple-keypairs": "^2.0.0",
122
122
  "ts-jest": "^29.1.1",
123
123
  "typescript": "^5.4.5",
124
- "@ledgerhq/types-cryptoassets": "^7.18.0-nightly.0"
124
+ "@ledgerhq/types-cryptoassets": "^7.19.0-next.0"
125
125
  },
126
126
  "scripts": {
127
127
  "clean": "rimraf lib lib-es",
@@ -134,6 +134,7 @@
134
134
  "lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache",
135
135
  "lint:fix": "pnpm lint --fix",
136
136
  "test": "jest",
137
+ "test-watch": "jest --watch",
137
138
  "test-integ": "DOTENV_CONFIG_PATH=.env.integ.test jest --config=jest.integ.config.js",
138
139
  "typecheck": "tsc --noEmit",
139
140
  "unimported": "unimported"
package/src/api/index.ts CHANGED
@@ -45,7 +45,12 @@ async function operations(
45
45
  address: string,
46
46
  { limit, start }: Pagination,
47
47
  ): Promise<[Operation[], number]> {
48
- const [ops, index] = await listOperations(address, { limit, startAt: start ?? 0 });
48
+ const options: {
49
+ limit?: number;
50
+ minHeight?: number;
51
+ } = { limit: limit };
52
+ if (start) options.minHeight = start;
53
+ const [ops, index] = await listOperations(address, options);
49
54
  return [
50
55
  ops.map(op => {
51
56
  const { simpleType, blockHash, blockTime, blockHeight, ...rest } = op;
@@ -63,7 +63,7 @@ async function filterOperations(
63
63
  address: string,
64
64
  blockHeight: number,
65
65
  ): Promise<Operation[]> {
66
- const [operations, _] = await listOperations(address, { startAt: blockHeight });
66
+ const [operations, _] = await listOperations(address, { minHeight: blockHeight });
67
67
 
68
68
  return operations.map(
69
69
  op =>
@@ -1,9 +1,12 @@
1
+ import { assert } from "console";
1
2
  import { listOperations } from "./listOperations";
2
3
  import { RIPPLE_EPOCH } from "./utils";
3
4
 
5
+ const maxHeight = 2;
6
+ const minHeight = 1;
4
7
  const mockGetServerInfos = jest.fn().mockResolvedValue({
5
8
  info: {
6
- complete_ledgers: "1-2",
9
+ complete_ledgers: `${minHeight}-${maxHeight}`,
7
10
  },
8
11
  });
9
12
  const mockGetTransactions = jest.fn();
@@ -18,6 +21,94 @@ describe("listOperations", () => {
18
21
  mockGetTransactions.mockClear();
19
22
  });
20
23
 
24
+ it("when there are no transactions then the result is empty", async () => {
25
+ // Given
26
+ mockGetTransactions.mockResolvedValue([]);
27
+ // When
28
+ const [results, token] = await listOperations("any address", { minHeight: 0 });
29
+ // Then
30
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
31
+ expect(mockGetTransactions).toHaveBeenCalledTimes(1);
32
+ expect(results).toEqual([]);
33
+ expect(token).toEqual(minHeight);
34
+ });
35
+
36
+ it("when there are no transactions and a limit then the result is empty", async () => {
37
+ // Given
38
+ mockGetTransactions.mockResolvedValue([]);
39
+ // When
40
+ const [results, token] = await listOperations("any address", { minHeight: 0, limit: 1 });
41
+ // Then
42
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
43
+ expect(mockGetTransactions).toHaveBeenCalledTimes(1);
44
+ expect(results).toEqual([]);
45
+ expect(token).toEqual(minHeight);
46
+ });
47
+
48
+ const paymentTx = {
49
+ ledger_hash: "HASH_VALUE_BLOCK",
50
+ hash: "HASH_VALUE",
51
+ close_time_iso: "2000-01-01T00:00:01Z",
52
+ meta: { delivered_amount: "100" },
53
+ tx_json: {
54
+ TransactionType: "Payment",
55
+ Fee: "1",
56
+ ledger_index: 2,
57
+ date: 1000,
58
+ Account: "sender",
59
+ Destination: "dest",
60
+ Sequence: 1,
61
+ },
62
+ };
63
+ const otherTx = { ...paymentTx, tx_json: { ...paymentTx.tx_json, TransactionType: "Other" } };
64
+
65
+ it("should only list operations of type payment", async () => {
66
+ // Given
67
+ const lastTransaction = paymentTx;
68
+ mockGetTransactions.mockResolvedValueOnce([paymentTx, otherTx, lastTransaction]);
69
+ mockGetTransactions.mockResolvedValue([]); // subsequent calls
70
+
71
+ // When
72
+ const [results, token] = await listOperations("any address", { minHeight: 0, limit: 3 });
73
+
74
+ // Then
75
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
76
+ // it's called twice because first call yields only 2 transactions, and 3 are asked
77
+ expect(mockGetTransactions).toHaveBeenCalledTimes(2);
78
+ expect(results.length).toEqual(2);
79
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
80
+ });
81
+
82
+ it("should make enough calls so that the limit requested is satified", async () => {
83
+ const lastTransaction = otherTx;
84
+ const txs = [paymentTx, paymentTx, otherTx, otherTx, otherTx, otherTx, otherTx, otherTx];
85
+ assert(txs.length === 8);
86
+ mockGetTransactions.mockResolvedValue(txs);
87
+
88
+ const [results, token] = await listOperations("any address", { minHeight: 0, limit: 8 });
89
+
90
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
91
+ // it's called 4 times because each call yields only 2 transactions, and 8 are asked
92
+ expect(mockGetTransactions).toHaveBeenCalledTimes(4);
93
+ expect(results.length).toEqual(8);
94
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
95
+ });
96
+
97
+ it("should make enough calls, even if there is not enough txs to satisfy the limit", async () => {
98
+ mockGetTransactions.mockResolvedValueOnce([otherTx, otherTx, otherTx, otherTx]);
99
+ mockGetTransactions.mockResolvedValueOnce([paymentTx, paymentTx]);
100
+ mockGetTransactions.mockResolvedValue([]); // subsequent calls
101
+ const lastTransaction = paymentTx;
102
+
103
+ const [results, token] = await listOperations("any address", { minHeight: 0, limit: 4 });
104
+
105
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
106
+ // it's called 2 times because the second call is a shortage of txs
107
+ expect(mockGetTransactions).toHaveBeenCalledTimes(2);
108
+ expect(results.length).toEqual(2);
109
+ expect(token).toEqual(lastTransaction.tx_json.ledger_index - 1);
110
+ });
111
+
21
112
  it.each([
22
113
  {
23
114
  address: "WHATEVER_ADDRESS",
@@ -34,7 +125,7 @@ describe("listOperations", () => {
34
125
  ])(
35
126
  "should return the list of operations associated to an account",
36
127
  async ({ address, opSender, opDestination, expectedType }) => {
37
- // Givem
128
+ // Given
38
129
  const deliveredAmount = 100;
39
130
  const fee = 10;
40
131
  mockGetTransactions.mockResolvedValue([
@@ -95,7 +186,7 @@ describe("listOperations", () => {
95
186
  ]);
96
187
 
97
188
  // When
98
- const [results, _] = await listOperations(address, { startAt: 0 });
189
+ const [results, _] = await listOperations(address, { minHeight: 0 });
99
190
 
100
191
  // Then
101
192
  expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
@@ -13,12 +13,12 @@ export async function listOperations(
13
13
  address: string,
14
14
  {
15
15
  limit,
16
- mostRecentIndex,
17
- startAt,
16
+ maxHeight,
17
+ minHeight,
18
18
  }: {
19
19
  limit?: number;
20
- mostRecentIndex?: number | undefined;
21
- startAt?: number;
20
+ maxHeight?: number | undefined; // used for pagination
21
+ minHeight?: number; // used to retrieve operations from a specific block height until top most
22
22
  },
23
23
  ): Promise<[XrpOperation[], number]> {
24
24
  const serverInfo = await getServerInfos();
@@ -26,13 +26,15 @@ export async function listOperations(
26
26
  const minLedgerVersion = Number(ledgers[0]);
27
27
  const maxLedgerVersion = Number(ledgers[1]);
28
28
 
29
- let options: {
29
+ type Options = {
30
30
  ledger_index_min?: number;
31
31
  ledger_index_max?: number;
32
32
  limit?: number;
33
33
  tx_type?: string;
34
- } = {
35
- ledger_index_max: mostRecentIndex ?? maxLedgerVersion,
34
+ };
35
+
36
+ let options: Options = {
37
+ ledger_index_max: maxHeight ?? maxLedgerVersion,
36
38
  tx_type: "Payment",
37
39
  };
38
40
 
@@ -42,38 +44,55 @@ export async function listOperations(
42
44
  limit,
43
45
  };
44
46
  }
45
- if (startAt) {
47
+ if (minHeight) {
46
48
  options = {
47
49
  ...options,
48
50
  // if there is no ops, it might be after a clear and we prefer to pull from the oldest possible history
49
- ledger_index_min: Math.max(startAt, minLedgerVersion),
51
+ ledger_index_min: Math.max(minHeight, minLedgerVersion),
50
52
  };
51
53
  }
52
54
 
53
- // We need to filter out the transactions that are not "Payment" type because the filter on "tx_type" of the node RPC
54
- // is not working as expected. It returns all the transactions. We need to call the node RPC multiple times to get the
55
- // desired number of transactions by the limiter.
56
- let transactions: XrplOperation[] = [];
57
- let needToStop = true;
58
- do {
59
- const newTransactions = await getTransactions(address, options);
60
- const newPaymentsTxs = newTransactions.filter(tx => tx.tx_json.TransactionType === "Payment");
61
- if (options.limit) {
62
- needToStop = newTransactions.length < options.limit;
63
- options.ledger_index_max = newTransactions.slice(-1)[0].tx_json.ledger_index - 1;
55
+ async function getPaymentTransactions(
56
+ address: string,
57
+ options: Options,
58
+ ): Promise<[boolean, Options, XrplOperation[]]> {
59
+ const txs = await getTransactions(address, options);
60
+ // Filter out the transactions that are not "Payment" type because the filter on "tx_type" of the node RPC is not working as expected.
61
+ const paymentTxs = txs.filter(tx => tx.tx_json.TransactionType === "Payment");
62
+ const shortage = (options.limit && txs.length < options.limit) || false;
63
+ const lastTransaction = txs.slice(-1)[0];
64
+ const nextOptions = { ...options };
65
+ if (lastTransaction) {
66
+ nextOptions.ledger_index_max = lastTransaction.tx_json.ledger_index - 1;
67
+ if (nextOptions.limit) nextOptions.limit -= paymentTxs.length;
64
68
  }
65
- transactions = transactions.concat(newPaymentsTxs);
66
- } while (
67
- options.limit &&
68
- !needToStop &&
69
- transactions.length < options.limit &&
70
- (options.limit -= transactions.length)
71
- );
72
-
73
- return [
74
- transactions.map(convertToCoreOperation(address)),
75
- transactions.slice(-1)[0].tx_json.ledger_index - 1, // Returns the next index to start from for pagination
76
- ];
69
+ return [shortage, nextOptions, paymentTxs];
70
+ }
71
+
72
+ // TODO BUG: given the number of txs belonging to the SAME block > limit
73
+ // when user loop over pages using the provided token
74
+ // then user misses some txs that doesn't fit the page size limit
75
+ // because the "next token" is a block height (solution is to use an opaque token instead)
76
+ let [txShortage, nextOptions, transactions] = await getPaymentTransactions(address, options);
77
+ const isEnough = () => txShortage || (limit && transactions.length >= limit);
78
+ // We need to call the node RPC multiple times to get the desired number of transactions by the limiter.
79
+ while (nextOptions.limit && !isEnough()) {
80
+ const [newTxShortage, newNextOptions, newTransactions] = await getPaymentTransactions(
81
+ address,
82
+ nextOptions,
83
+ );
84
+ txShortage = newTxShortage;
85
+ nextOptions = newNextOptions;
86
+ transactions = transactions.concat(newTransactions);
87
+ }
88
+
89
+ const lastTransaction = transactions.slice(-1)[0];
90
+ // the next index to start the pagination from
91
+ const nextIndex = lastTransaction
92
+ ? Math.max(lastTransaction.tx_json.ledger_index - 1, minLedgerVersion)
93
+ : minLedgerVersion;
94
+
95
+ return [transactions.map(convertToCoreOperation(address)), nextIndex];
77
96
  }
78
97
 
79
98
  const convertToCoreOperation =
@@ -72,10 +72,12 @@ export const getTransactions = async (
72
72
  ): Promise<XrplOperation[]> => {
73
73
  const result = await rpcCall<AccountTxResponse>("account_tx", {
74
74
  account: address,
75
+ // newest first
76
+ // note that order within the results is not guaranteed (see documentation of account_tx)
77
+ forward: false,
75
78
  ...options,
76
79
  api_version: 2,
77
80
  });
78
-
79
81
  return result.transactions;
80
82
  };
81
83
 
@@ -91,7 +93,7 @@ export async function getLedgerIndex(): Promise<number> {
91
93
 
92
94
  async function rpcCall<T extends object>(
93
95
  method: string,
94
- params: Record<string, string | number>,
96
+ params: Record<string, string | number | boolean> = {},
95
97
  ): Promise<T> {
96
98
  const {
97
99
  data: { result },