@ledgerhq/coin-xrp 7.6.0-nightly.5 → 7.6.0-nightly.7

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 (91) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/package.json +6 -6
  4. package/lib/api/index.integ.test.d.ts +0 -2
  5. package/lib/api/index.integ.test.d.ts.map +0 -1
  6. package/lib/api/index.integ.test.js +0 -332
  7. package/lib/api/index.integ.test.js.map +0 -1
  8. package/lib/api/index.test.d.ts +0 -2
  9. package/lib/api/index.test.d.ts.map +0 -1
  10. package/lib/api/index.test.js +0 -347
  11. package/lib/api/index.test.js.map +0 -1
  12. package/lib/logic/broadcast.test.d.ts +0 -2
  13. package/lib/logic/broadcast.test.d.ts.map +0 -1
  14. package/lib/logic/broadcast.test.js +0 -46
  15. package/lib/logic/broadcast.test.js.map +0 -1
  16. package/lib/logic/craftRawTransaction.test.d.ts +0 -2
  17. package/lib/logic/craftRawTransaction.test.d.ts.map +0 -1
  18. package/lib/logic/craftRawTransaction.test.js +0 -304
  19. package/lib/logic/craftRawTransaction.test.js.map +0 -1
  20. package/lib/logic/craftTransaction.test.d.ts +0 -2
  21. package/lib/logic/craftTransaction.test.d.ts.map +0 -1
  22. package/lib/logic/craftTransaction.test.js +0 -75
  23. package/lib/logic/craftTransaction.test.js.map +0 -1
  24. package/lib/logic/estimateFees.test.d.ts +0 -2
  25. package/lib/logic/estimateFees.test.d.ts.map +0 -1
  26. package/lib/logic/estimateFees.test.js +0 -51
  27. package/lib/logic/estimateFees.test.js.map +0 -1
  28. package/lib/logic/getBalance.test.d.ts +0 -2
  29. package/lib/logic/getBalance.test.d.ts.map +0 -1
  30. package/lib/logic/getBalance.test.js +0 -63
  31. package/lib/logic/getBalance.test.js.map +0 -1
  32. package/lib/logic/listOperations.test.d.ts +0 -2
  33. package/lib/logic/listOperations.test.d.ts.map +0 -1
  34. package/lib/logic/listOperations.test.js +0 -275
  35. package/lib/logic/listOperations.test.js.map +0 -1
  36. package/lib/logic/utils.test.d.ts +0 -2
  37. package/lib/logic/utils.test.d.ts.map +0 -1
  38. package/lib/logic/utils.test.js +0 -115
  39. package/lib/logic/utils.test.js.map +0 -1
  40. package/lib/logic/validateIntent.test.d.ts +0 -2
  41. package/lib/logic/validateIntent.test.d.ts.map +0 -1
  42. package/lib/logic/validateIntent.test.js +0 -266
  43. package/lib/logic/validateIntent.test.js.map +0 -1
  44. package/lib/network/index.test.d.ts +0 -2
  45. package/lib/network/index.test.d.ts.map +0 -1
  46. package/lib/network/index.test.js +0 -105
  47. package/lib/network/index.test.js.map +0 -1
  48. package/lib-es/api/index.integ.test.d.ts +0 -2
  49. package/lib-es/api/index.integ.test.d.ts.map +0 -1
  50. package/lib-es/api/index.integ.test.js +0 -330
  51. package/lib-es/api/index.integ.test.js.map +0 -1
  52. package/lib-es/api/index.test.d.ts +0 -2
  53. package/lib-es/api/index.test.d.ts.map +0 -1
  54. package/lib-es/api/index.test.js +0 -322
  55. package/lib-es/api/index.test.js.map +0 -1
  56. package/lib-es/logic/broadcast.test.d.ts +0 -2
  57. package/lib-es/logic/broadcast.test.d.ts.map +0 -1
  58. package/lib-es/logic/broadcast.test.js +0 -44
  59. package/lib-es/logic/broadcast.test.js.map +0 -1
  60. package/lib-es/logic/craftRawTransaction.test.d.ts +0 -2
  61. package/lib-es/logic/craftRawTransaction.test.d.ts.map +0 -1
  62. package/lib-es/logic/craftRawTransaction.test.js +0 -302
  63. package/lib-es/logic/craftRawTransaction.test.js.map +0 -1
  64. package/lib-es/logic/craftTransaction.test.d.ts +0 -2
  65. package/lib-es/logic/craftTransaction.test.d.ts.map +0 -1
  66. package/lib-es/logic/craftTransaction.test.js +0 -73
  67. package/lib-es/logic/craftTransaction.test.js.map +0 -1
  68. package/lib-es/logic/estimateFees.test.d.ts +0 -2
  69. package/lib-es/logic/estimateFees.test.d.ts.map +0 -1
  70. package/lib-es/logic/estimateFees.test.js +0 -46
  71. package/lib-es/logic/estimateFees.test.js.map +0 -1
  72. package/lib-es/logic/getBalance.test.d.ts +0 -2
  73. package/lib-es/logic/getBalance.test.d.ts.map +0 -1
  74. package/lib-es/logic/getBalance.test.js +0 -61
  75. package/lib-es/logic/getBalance.test.js.map +0 -1
  76. package/lib-es/logic/listOperations.test.d.ts +0 -2
  77. package/lib-es/logic/listOperations.test.d.ts.map +0 -1
  78. package/lib-es/logic/listOperations.test.js +0 -273
  79. package/lib-es/logic/listOperations.test.js.map +0 -1
  80. package/lib-es/logic/utils.test.d.ts +0 -2
  81. package/lib-es/logic/utils.test.d.ts.map +0 -1
  82. package/lib-es/logic/utils.test.js +0 -113
  83. package/lib-es/logic/utils.test.js.map +0 -1
  84. package/lib-es/logic/validateIntent.test.d.ts +0 -2
  85. package/lib-es/logic/validateIntent.test.d.ts.map +0 -1
  86. package/lib-es/logic/validateIntent.test.js +0 -241
  87. package/lib-es/logic/validateIntent.test.js.map +0 -1
  88. package/lib-es/network/index.test.d.ts +0 -2
  89. package/lib-es/network/index.test.d.ts.map +0 -1
  90. package/lib-es/network/index.test.js +0 -100
  91. package/lib-es/network/index.test.js.map +0 -1
@@ -1,273 +0,0 @@
1
- import { assert } from "console";
2
- import { listOperations } from "./listOperations";
3
- import { RIPPLE_EPOCH } from "./utils";
4
- const maxHeight = 2;
5
- const minHeight = 1;
6
- const mockGetServerInfos = jest.fn().mockResolvedValue({
7
- info: {
8
- complete_ledgers: `${minHeight}-${maxHeight}`,
9
- },
10
- });
11
- const mockNetworkGetTransactions = jest.fn();
12
- jest.mock("../network", () => ({
13
- getServerInfos: () => mockGetServerInfos(),
14
- getTransactions: () => mockNetworkGetTransactions(),
15
- }));
16
- describe("listOperations", () => {
17
- afterEach(() => {
18
- mockGetServerInfos.mockClear();
19
- mockNetworkGetTransactions.mockClear();
20
- });
21
- const someMarker = { ledger: 1, seq: 1 };
22
- function mockNetworkTxs(txs) {
23
- return {
24
- account: "account",
25
- ledger_index_max: 1,
26
- ledger_index_min: 1,
27
- limit: 1,
28
- validated: false,
29
- transactions: txs,
30
- marker: someMarker,
31
- error: "",
32
- };
33
- }
34
- it("when there are no transactions then the result is empty", async () => {
35
- // Given
36
- mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs([]));
37
- // When
38
- const [results, token] = await listOperations("any address", { minHeight: 0, order: "asc" });
39
- // Then
40
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
41
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(1);
42
- expect(results).toEqual([]);
43
- expect(JSON.parse(token)).toEqual(someMarker);
44
- });
45
- it("when there are no transactions and a limit then the result is empty", async () => {
46
- // Given
47
- mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs([]));
48
- // When
49
- const [results, token] = await listOperations("any address", { minHeight: 0, limit: 1 });
50
- // Then
51
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
52
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(1);
53
- expect(results).toEqual([]);
54
- expect(JSON.parse(token)).toEqual(someMarker);
55
- });
56
- const paymentTx = {
57
- ledger_hash: "HASH_VALUE_BLOCK",
58
- hash: "HASH_VALUE",
59
- validated: true,
60
- close_time_iso: "2000-01-01T00:00:01Z",
61
- meta: { delivered_amount: "100" },
62
- tx_json: {
63
- TransactionType: "Payment",
64
- Fee: "1",
65
- ledger_index: 2,
66
- date: 1000,
67
- Account: "sender",
68
- Destination: "dest",
69
- Sequence: 1,
70
- SigningPubKey: "DEADBEEF",
71
- },
72
- };
73
- const otherTx = { ...paymentTx, tx_json: { ...paymentTx.tx_json, TransactionType: "Other" } };
74
- it("should only list operations of type payment", async () => {
75
- // Given
76
- const lastTransaction = paymentTx;
77
- const txs = [paymentTx, otherTx, lastTransaction];
78
- mockNetworkGetTransactions.mockResolvedValueOnce(mockNetworkTxs(txs));
79
- mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs([])); // subsequent calls
80
- // When
81
- const [results, token] = await listOperations("any address", { minHeight: 0, limit: 3 });
82
- // Then
83
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
84
- // it's called twice because first call yields only 2 transactions, and 3 are asked
85
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(2);
86
- expect(results.length).toEqual(2);
87
- expect(JSON.parse(token)).toEqual(someMarker);
88
- });
89
- it("should make enough calls so that the limit requested is satisfied", async () => {
90
- const txs = [paymentTx, paymentTx, otherTx, otherTx, otherTx, otherTx, otherTx, otherTx];
91
- assert(txs.length === 8);
92
- mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs(txs));
93
- const [results, token] = await listOperations("any address", { minHeight: 0, limit: 8 });
94
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
95
- // it's called 4 times because each call yields only 2 transactions, and 8 are asked
96
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(4);
97
- expect(results.length).toEqual(8);
98
- expect(JSON.parse(token)).toEqual(someMarker);
99
- });
100
- it("should make enough calls, even if there is not enough txs to satisfy the limit", async () => {
101
- mockNetworkGetTransactions.mockResolvedValueOnce(mockNetworkTxs([otherTx, otherTx, otherTx, otherTx]));
102
- mockNetworkGetTransactions.mockResolvedValueOnce(mockNetworkTxs([paymentTx, paymentTx]));
103
- mockNetworkGetTransactions.mockResolvedValue([]); // subsequent calls
104
- const [results, token] = await listOperations("any address", { minHeight: 0, limit: 4 });
105
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
106
- // it's called 2 times because the second call is a shortage of txs
107
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(2);
108
- expect(results.length).toEqual(2);
109
- expect(JSON.parse(token)).toEqual(someMarker);
110
- });
111
- it.each([
112
- {
113
- address: "WHATEVER_ADDRESS",
114
- opSender: "account_addr",
115
- opDestination: "WHATEVER_ADDRESS",
116
- expectedType: "IN",
117
- },
118
- {
119
- address: "WHATEVER_ADDRESS",
120
- opSender: "WHATEVER_ADDRESS",
121
- opDestination: "destination_addr",
122
- expectedType: "OUT",
123
- },
124
- ])("should return the list of operations associated to an account", async ({ address, opSender, opDestination, expectedType }) => {
125
- // Given
126
- const deliveredAmount = 100;
127
- const fees = 10;
128
- mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs([
129
- {
130
- ledger_hash: "HASH_VALUE_BLOCK",
131
- hash: "HASH_VALUE",
132
- close_time_iso: "2000-01-01T00:00:01Z",
133
- meta: { delivered_amount: deliveredAmount.toString() },
134
- tx_json: {
135
- TransactionType: "Payment",
136
- Fee: fees.toString(),
137
- ledger_index: 1,
138
- date: 1000,
139
- Account: opSender,
140
- Destination: opDestination,
141
- Sequence: 1,
142
- SigningPubKey: "DEADBEEF",
143
- },
144
- },
145
- {
146
- ledger_hash: "HASH_VALUE_BLOCK",
147
- hash: "HASH_VALUE",
148
- close_time_iso: "2000-01-01T00:00:01Z",
149
- meta: { delivered_amount: deliveredAmount.toString() },
150
- tx_json: {
151
- TransactionType: "Payment",
152
- Fee: fees.toString(),
153
- ledger_index: 1,
154
- date: 1000,
155
- Account: opSender,
156
- Destination: opDestination,
157
- DestinationTag: 509555,
158
- Sequence: 1,
159
- SigningPubKey: "DEADBEEF",
160
- },
161
- },
162
- {
163
- ledger_hash: "HASH_VALUE_BLOCK",
164
- hash: "HASH_VALUE",
165
- close_time_iso: "2000-01-01T00:00:01Z",
166
- meta: { delivered_amount: deliveredAmount.toString() },
167
- tx_json: {
168
- TransactionType: "Payment",
169
- Fee: fees.toString(),
170
- ledger_index: 1,
171
- date: 1000,
172
- Account: opSender,
173
- Destination: opDestination,
174
- Memos: [
175
- {
176
- Memo: {
177
- MemoType: "687474703a2f2f6578616d706c652e636f6d2f6d656d6f2f67656e65726963",
178
- MemoData: "72656e74",
179
- },
180
- },
181
- ],
182
- Sequence: 1,
183
- SigningPubKey: "DEADBEEF",
184
- },
185
- },
186
- ]));
187
- // When
188
- const [results, _] = await listOperations(address, { minHeight: 0, order: "asc" });
189
- // Then
190
- expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
191
- expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(1);
192
- const expectedValue = BigInt(deliveredAmount);
193
- expect(results).toEqual([
194
- {
195
- id: "HASH_VALUE",
196
- asset: { type: "native" },
197
- tx: {
198
- fees: BigInt(10),
199
- hash: "HASH_VALUE",
200
- block: {
201
- hash: "HASH_VALUE_BLOCK",
202
- height: 1,
203
- time: new Date("2000-01-01T00:00:01Z"),
204
- },
205
- date: new Date(1000000 + RIPPLE_EPOCH * 1000),
206
- },
207
- type: expectedType,
208
- value: expectedValue,
209
- senders: [opSender],
210
- recipients: [opDestination],
211
- details: {
212
- sequence: 1,
213
- xrpTxType: "Payment",
214
- memos: [
215
- {
216
- type: "687474703a2f2f6578616d706c652e636f6d2f6d656d6f2f67656e65726963",
217
- data: "72656e74",
218
- },
219
- ],
220
- signingPubKey: "DEADBEEF",
221
- },
222
- },
223
- {
224
- id: "HASH_VALUE",
225
- asset: { type: "native" },
226
- tx: {
227
- hash: "HASH_VALUE",
228
- fees: BigInt(10),
229
- date: new Date(1000000 + RIPPLE_EPOCH * 1000),
230
- block: {
231
- hash: "HASH_VALUE_BLOCK",
232
- height: 1,
233
- time: new Date("2000-01-01T00:00:01Z"),
234
- },
235
- },
236
- type: expectedType,
237
- value: expectedValue,
238
- senders: [opSender],
239
- recipients: [opDestination],
240
- details: {
241
- sequence: 1,
242
- destinationTag: 509555,
243
- xrpTxType: "Payment",
244
- signingPubKey: "DEADBEEF",
245
- },
246
- },
247
- {
248
- id: "HASH_VALUE",
249
- asset: { type: "native" },
250
- tx: {
251
- hash: "HASH_VALUE",
252
- fees: BigInt(10),
253
- block: {
254
- hash: "HASH_VALUE_BLOCK",
255
- height: 1,
256
- time: new Date("2000-01-01T00:00:01Z"),
257
- },
258
- date: new Date(1000000 + RIPPLE_EPOCH * 1000),
259
- },
260
- details: {
261
- sequence: 1,
262
- xrpTxType: "Payment",
263
- signingPubKey: "DEADBEEF",
264
- },
265
- type: expectedType,
266
- value: expectedValue,
267
- senders: [opSender],
268
- recipients: [opDestination],
269
- },
270
- ]);
271
- });
272
- });
273
- //# sourceMappingURL=listOperations.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listOperations.test.js","sourceRoot":"","sources":["../../src/logic/listOperations.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/logic/utils.test.ts"],"names":[],"mappings":""}
@@ -1,113 +0,0 @@
1
- import { cachedRecipientIsNew, sortSignersByNumericAddress } from "./utils";
2
- // We'll mock ripple-address-codec so that we control numeric ordering via decodeAccountID
3
- // without re-implementing the util's logic inside the tests.
4
- const decodeAccountIDMock = jest.fn((account) => {
5
- // Provide deterministic 20-byte arrays whose last byte encodes the numeric ordering.
6
- // (Big-endian comparison means earlier bytes are 0; ordering driven by final byte value.)
7
- const bytes = new Uint8Array(20).fill(0);
8
- const ordering = { alpha: 1, gamma: 2, beta: 3, epsilon: 4, delta: 5 };
9
- if (ordering[account])
10
- bytes[19] = ordering[account];
11
- return bytes;
12
- });
13
- jest.mock("ripple-address-codec", () => ({
14
- isValidClassicAddress: () => true,
15
- decodeAccountID: (address) => decodeAccountIDMock(address),
16
- }));
17
- const mockGetAccountInfo = jest.fn();
18
- jest.mock("../network", () => ({
19
- getAccountInfo: (address) => mockGetAccountInfo(address),
20
- }));
21
- describe("cachedRecipientIsNew", () => {
22
- afterEach(() => {
23
- mockGetAccountInfo.mockClear();
24
- });
25
- it("returns true when network returns a new empty account", async () => {
26
- // Given
27
- mockGetAccountInfo.mockResolvedValueOnce({
28
- isNewAccount: true,
29
- balance: "0",
30
- ownerCount: 0,
31
- sequence: 0,
32
- });
33
- // When
34
- const result = await cachedRecipientIsNew("address1");
35
- // Then
36
- expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
37
- expect(result).toBeTruthy();
38
- });
39
- it("returns false when network a valid AccountInfo", async () => {
40
- // Given
41
- mockGetAccountInfo.mockResolvedValueOnce({
42
- isNewAccount: false,
43
- balance: "999441667919804",
44
- ownerCount: 0,
45
- sequence: 999441667919804,
46
- });
47
- // When
48
- const result = await cachedRecipientIsNew("address2");
49
- // Then
50
- expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
51
- expect(result).toBeFalsy();
52
- });
53
- it("throws an error when network throws an error", async () => {
54
- // Given
55
- mockGetAccountInfo.mockImplementationOnce(() => {
56
- throw new Error("Malformed address");
57
- });
58
- // When & Then
59
- await expect(cachedRecipientIsNew("address3")).rejects.toThrow("Malformed address");
60
- expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
61
- });
62
- });
63
- // Helper to build a SignerEntry from an Account address
64
- function signer(account) {
65
- return {
66
- Signer: {
67
- Account: account,
68
- SigningPubKey: "PUBKEY",
69
- TxnSignature: "SIGNATURE",
70
- },
71
- };
72
- }
73
- // We intentionally use simple string identifiers (not real XRP addresses) since we fully mock decodeAccountID.
74
- // Numeric order (smallest->largest) encoded in mock via last byte value: alpha(1), gamma(2), beta(3), epsilon(4), delta(5)
75
- const orderedByNumeric = ["alpha", "gamma", "beta", "epsilon", "delta"];
76
- describe("sortSignersByNumericAddress", () => {
77
- it("returns an empty array when given an empty array", () => {
78
- expect(sortSignersByNumericAddress([])).toEqual([]);
79
- });
80
- it("does not mutate the original array", () => {
81
- const original = [signer("beta"), signer("alpha"), signer("delta")];
82
- const originalSnapshot = original.map(s => s.Signer.Account);
83
- const result = sortSignersByNumericAddress(original);
84
- expect(result).not.toBe(original);
85
- expect(original.map(s => s.Signer.Account)).toEqual(originalSnapshot);
86
- });
87
- it("returns new array for single element", () => {
88
- const single = [signer("alpha")];
89
- const result = sortSignersByNumericAddress(single);
90
- expect(result).toHaveLength(1);
91
- expect(result[0].Signer.Account).toBe("alpha");
92
- expect(result).not.toBe(single);
93
- });
94
- it("sorts by numeric account ID as provided by decodeAccountID mock", () => {
95
- const shuffled = ["delta", "gamma", "alpha", "epsilon", "beta"]; // random order
96
- const signers = shuffled.map(a => signer(a));
97
- const result = sortSignersByNumericAddress(signers).map(s => s.Signer.Account);
98
- expect(result).toEqual(orderedByNumeric);
99
- // Ensure decodeAccountID was called for each element at least once
100
- orderedByNumeric.forEach(addr => {
101
- expect(decodeAccountIDMock).toHaveBeenCalledWith(addr);
102
- });
103
- });
104
- it("ordering differs from naive lexicographic string sort", () => {
105
- const signers = ["alpha", "beta", "delta", "epsilon", "gamma"].map(a => signer(a));
106
- const numericSorted = sortSignersByNumericAddress(signers).map(s => s.Signer.Account);
107
- const lexSorted = signers.map(s => s.Signer.Account).sort();
108
- // Our predetermined numeric order should not equal simple lexical sort (which puts beta before gamma)
109
- expect(numericSorted).toEqual(orderedByNumeric);
110
- expect(numericSorted).not.toEqual(lexSorted);
111
- });
112
- });
113
- //# sourceMappingURL=utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/logic/utils.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=validateIntent.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateIntent.test.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.test.ts"],"names":[],"mappings":""}
@@ -1,241 +0,0 @@
1
- import { validateIntent } from "./validateIntent";
2
- import * as utils from "./utils";
3
- const mockGetBalance = jest.fn();
4
- const mockGetServerInfos = jest.fn();
5
- jest.mock("./getBalance", () => ({
6
- getBalance: () => mockGetBalance(),
7
- }));
8
- jest.mock("../network", () => ({
9
- getServerInfos: () => mockGetServerInfos(),
10
- }));
11
- jest.spyOn(utils, "cachedRecipientIsNew").mockImplementation(addr => {
12
- if (addr === RECIPIENT_NEW) {
13
- return Promise.resolve(true);
14
- }
15
- return Promise.resolve(false);
16
- });
17
- const reserveBase = 10000000n; // 10 XRP (drops)
18
- const SENDER = "rPSCfmnX3t9jQJG5RNcZtSaP5UhExZDue4";
19
- const RECIPIENT = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
20
- const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
21
- describe("validateIntent", () => {
22
- afterEach(() => {
23
- jest.clearAllMocks();
24
- });
25
- it("returns no errors on valid transaction", async () => {
26
- mockGetServerInfos.mockResolvedValue({
27
- info: {
28
- validated_ledger: {
29
- reserve_base_xrp: reserveBase / 1000000n, // XRP value, not drops
30
- },
31
- },
32
- });
33
- mockGetBalance.mockResolvedValue([
34
- {
35
- value: 50000000n,
36
- asset: { type: "native" },
37
- locked: 0n,
38
- },
39
- ]);
40
- const result = await validateIntent(
41
- // account as any,
42
- {
43
- intentType: "transaction",
44
- sender: SENDER,
45
- amount: 20000000n,
46
- recipient: RECIPIENT,
47
- asset: { unit: { code: "XRP", magnitude: 6 } },
48
- }, {
49
- value: 10000n, // fees
50
- });
51
- expect(result.errors).toEqual({});
52
- expect(result.warnings).toEqual({});
53
- expect(result.totalSpent).toBe(20010000n);
54
- });
55
- it("throws FeeTooHigh warning when fee is >10% of amount", async () => {
56
- mockGetServerInfos.mockResolvedValue({
57
- info: {
58
- validated_ledger: {
59
- reserve_base_xrp: reserveBase / 1000000n,
60
- },
61
- },
62
- });
63
- mockGetBalance.mockResolvedValue([
64
- {
65
- value: 50000000n,
66
- asset: { type: "native" },
67
- locked: 0n,
68
- },
69
- ]);
70
- const result = await validateIntent(
71
- // account as any,
72
- {
73
- intentType: "transaction",
74
- sender: SENDER,
75
- amount: 1000000n,
76
- recipient: RECIPIENT,
77
- asset: { unit: { code: "XRP", magnitude: 6 } },
78
- }, {
79
- value: 200000n, // fees
80
- });
81
- expect(result.warnings.feeTooHigh).toBeInstanceOf(Error);
82
- expect(result.errors).toEqual({});
83
- });
84
- it("errors when fee is missing", async () => {
85
- mockGetServerInfos.mockResolvedValue({
86
- info: {
87
- validated_ledger: {
88
- reserve_base_xrp: reserveBase / 1000000n,
89
- },
90
- },
91
- });
92
- mockGetBalance.mockResolvedValue([
93
- {
94
- value: 30000000n,
95
- asset: { type: "native" },
96
- locked: 0n,
97
- },
98
- ]);
99
- const result = await validateIntent(
100
- // account as any,
101
- {
102
- intentType: "transaction",
103
- sender: SENDER,
104
- amount: 10000000n,
105
- recipient: RECIPIENT,
106
- asset: { unit: { code: "XRP", magnitude: 6 } },
107
- });
108
- expect(result.errors.fee?.name).toBe("FeeNotLoaded");
109
- });
110
- it("errors if recipient is same as sender", async () => {
111
- mockGetServerInfos.mockResolvedValue({
112
- info: {
113
- validated_ledger: {
114
- reserve_base_xrp: reserveBase / 1000000n,
115
- },
116
- },
117
- });
118
- mockGetBalance.mockResolvedValue([
119
- {
120
- value: 50000000n,
121
- asset: { type: "native" },
122
- locked: 0n,
123
- },
124
- ]);
125
- const result = await validateIntent(
126
- // account as any,
127
- {
128
- intentType: "transaction",
129
- sender: SENDER,
130
- amount: 10000000n,
131
- recipient: SENDER,
132
- asset: { unit: { code: "XRP", magnitude: 6 } },
133
- }, { value: 10000n });
134
- expect(result.errors.recipient?.name).toBe("InvalidAddressBecauseDestinationIsAlsoSource");
135
- });
136
- it("errors if recipient is new and amount is too low", async () => {
137
- mockGetServerInfos.mockResolvedValue({
138
- info: {
139
- validated_ledger: {
140
- reserve_base_xrp: reserveBase / 1000000n,
141
- },
142
- },
143
- });
144
- mockGetBalance.mockResolvedValue([
145
- {
146
- value: 50000000n,
147
- asset: { type: "native" },
148
- locked: 0n,
149
- },
150
- ]);
151
- const result = await validateIntent(
152
- // account as any,
153
- {
154
- intentType: "transaction",
155
- sender: SENDER,
156
- amount: 5000000n,
157
- recipient: RECIPIENT_NEW,
158
- asset: { unit: { code: "XRP", magnitude: 6 } },
159
- }, { value: 10000n });
160
- expect(result.errors.amount?.name).toBe("NotEnoughBalanceBecauseDestinationNotCreated");
161
- });
162
- it("errors if amount is zero", async () => {
163
- mockGetServerInfos.mockResolvedValue({
164
- info: {
165
- validated_ledger: {
166
- reserve_base_xrp: reserveBase / 1000000n,
167
- },
168
- },
169
- });
170
- mockGetBalance.mockResolvedValue([
171
- {
172
- value: 50000000n,
173
- asset: { type: "native" },
174
- locked: 0n,
175
- },
176
- ]);
177
- const result = await validateIntent(
178
- // account as any,
179
- {
180
- intentType: "transaction",
181
- sender: SENDER,
182
- amount: 0n,
183
- recipient: RECIPIENT,
184
- asset: { unit: { code: "XRP", magnitude: 6 } },
185
- }, { value: 10000n });
186
- expect(result.errors.amount?.name).toBe("AmountRequired");
187
- });
188
- it("errors if recipient is invalid", async () => {
189
- mockGetServerInfos.mockResolvedValue({
190
- info: {
191
- validated_ledger: {
192
- reserve_base_xrp: reserveBase / 1000000n,
193
- },
194
- },
195
- });
196
- mockGetBalance.mockResolvedValue([
197
- {
198
- value: 50000000n,
199
- asset: { type: "native" },
200
- locked: 0n,
201
- },
202
- ]);
203
- const result = await validateIntent(
204
- // account as any,
205
- {
206
- intentType: "transaction",
207
- sender: SENDER,
208
- asset: { unit: { code: "XRP", magnitude: 6 } },
209
- amount: 1000000n,
210
- recipient: "not-an-address",
211
- }, { value: 10000n });
212
- expect(result.errors.recipient?.name).toBe("InvalidAddress");
213
- });
214
- it("errors if recipient is missing", async () => {
215
- mockGetServerInfos.mockResolvedValue({
216
- info: {
217
- validated_ledger: {
218
- reserve_base_xrp: reserveBase / 1000000n,
219
- },
220
- },
221
- });
222
- mockGetBalance.mockResolvedValue([
223
- {
224
- value: 50000000n,
225
- asset: { type: "native" },
226
- locked: 0n,
227
- },
228
- ]);
229
- const result = await validateIntent(
230
- // account as any,
231
- {
232
- intentType: "transaction",
233
- sender: SENDER,
234
- asset: { unit: { code: "XRP", magnitude: 6 } },
235
- amount: 1000000n,
236
- recipient: "",
237
- }, { value: 10000n });
238
- expect(result.errors.recipient?.name).toBe("RecipientRequired");
239
- });
240
- });
241
- //# sourceMappingURL=validateIntent.test.js.map