@ledgerhq/coin-xrp 7.2.0 → 7.3.0-nightly.1
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/.eslintrc.js +1 -0
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +21 -0
- package/lib/api/index.d.ts.map +1 -1
- package/lib/api/index.integ.test.js +12 -2
- package/lib/api/index.integ.test.js.map +1 -1
- package/lib/api/index.js +6 -6
- package/lib/api/index.js.map +1 -1
- package/lib/api/index.test.js +5 -5
- package/lib/api/index.test.js.map +1 -1
- package/lib/logic/index.d.ts +1 -1
- package/lib/logic/index.d.ts.map +1 -1
- package/lib/logic/index.js +3 -3
- package/lib/logic/index.js.map +1 -1
- package/lib/logic/listOperations.js +1 -1
- package/lib/logic/listOperations.js.map +1 -1
- package/lib/logic/listOperations.test.js +1 -1
- package/lib/logic/listOperations.test.js.map +1 -1
- package/lib/logic/validateIntent.d.ts +4 -0
- package/lib/logic/validateIntent.d.ts.map +1 -0
- package/lib/logic/{getTransactionStatus.js → validateIntent.js} +7 -10
- package/lib/logic/validateIntent.js.map +1 -0
- package/lib/logic/validateIntent.test.d.ts +2 -0
- package/lib/logic/validateIntent.test.d.ts.map +1 -0
- package/lib/logic/{getTransactionStatus.test.js → validateIntent.test.js} +20 -23
- package/lib/logic/validateIntent.test.js.map +1 -0
- package/lib/types/model.d.ts +1 -2
- package/lib/types/model.d.ts.map +1 -1
- package/lib-es/api/index.d.ts.map +1 -1
- package/lib-es/api/index.integ.test.js +12 -2
- package/lib-es/api/index.integ.test.js.map +1 -1
- package/lib-es/api/index.js +7 -7
- package/lib-es/api/index.js.map +1 -1
- package/lib-es/api/index.test.js +5 -5
- package/lib-es/api/index.test.js.map +1 -1
- package/lib-es/logic/index.d.ts +1 -1
- package/lib-es/logic/index.d.ts.map +1 -1
- package/lib-es/logic/index.js +1 -1
- package/lib-es/logic/index.js.map +1 -1
- package/lib-es/logic/listOperations.js +1 -1
- package/lib-es/logic/listOperations.js.map +1 -1
- package/lib-es/logic/listOperations.test.js +1 -1
- package/lib-es/logic/listOperations.test.js.map +1 -1
- package/lib-es/logic/validateIntent.d.ts +4 -0
- package/lib-es/logic/validateIntent.d.ts.map +1 -0
- package/lib-es/logic/{getTransactionStatus.js → validateIntent.js} +6 -9
- package/lib-es/logic/validateIntent.js.map +1 -0
- package/lib-es/logic/validateIntent.test.d.ts +2 -0
- package/lib-es/logic/validateIntent.test.d.ts.map +1 -0
- package/lib-es/logic/{getTransactionStatus.test.js → validateIntent.test.js} +20 -23
- package/lib-es/logic/validateIntent.test.js.map +1 -0
- package/lib-es/types/model.d.ts +1 -2
- package/lib-es/types/model.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/api/index.integ.test.ts +16 -2
- package/src/api/index.test.ts +5 -5
- package/src/api/index.ts +8 -6
- package/src/logic/index.ts +1 -1
- package/src/logic/listOperations.test.ts +1 -1
- package/src/logic/listOperations.ts +1 -1
- package/src/logic/{getTransactionStatus.test.ts → validateIntent.test.ts} +21 -17
- package/src/logic/{getTransactionStatus.ts → validateIntent.ts} +10 -8
- package/src/types/model.ts +1 -1
- package/lib/logic/getTransactionStatus.d.ts +0 -4
- package/lib/logic/getTransactionStatus.d.ts.map +0 -1
- package/lib/logic/getTransactionStatus.js.map +0 -1
- package/lib/logic/getTransactionStatus.test.d.ts +0 -2
- package/lib/logic/getTransactionStatus.test.d.ts.map +0 -1
- package/lib/logic/getTransactionStatus.test.js.map +0 -1
- package/lib-es/logic/getTransactionStatus.d.ts +0 -4
- package/lib-es/logic/getTransactionStatus.d.ts.map +0 -1
- package/lib-es/logic/getTransactionStatus.js.map +0 -1
- package/lib-es/logic/getTransactionStatus.test.d.ts +0 -2
- package/lib-es/logic/getTransactionStatus.test.d.ts.map +0 -1
- package/lib-es/logic/getTransactionStatus.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateIntent.test.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { validateIntent } from "./validateIntent";
|
|
2
2
|
import * as utils from "./utils";
|
|
3
3
|
const mockGetBalance = jest.fn();
|
|
4
4
|
const mockGetServerInfos = jest.fn();
|
|
@@ -18,7 +18,7 @@ const reserveBase = 10000000n; // 10 XRP (drops)
|
|
|
18
18
|
const SENDER = "rPSCfmnX3t9jQJG5RNcZtSaP5UhExZDue4";
|
|
19
19
|
const RECIPIENT = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
|
|
20
20
|
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
21
|
-
describe("
|
|
21
|
+
describe("validateIntent", () => {
|
|
22
22
|
afterEach(() => {
|
|
23
23
|
jest.clearAllMocks();
|
|
24
24
|
});
|
|
@@ -37,14 +37,15 @@ describe("getTransactionStatus", () => {
|
|
|
37
37
|
locked: 0n,
|
|
38
38
|
},
|
|
39
39
|
]);
|
|
40
|
-
const result = await
|
|
40
|
+
const result = await validateIntent(
|
|
41
41
|
// account as any,
|
|
42
42
|
{
|
|
43
43
|
sender: SENDER,
|
|
44
44
|
amount: 20000000n,
|
|
45
|
-
fees: 10000n,
|
|
46
45
|
recipient: RECIPIENT,
|
|
47
46
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
47
|
+
}, {
|
|
48
|
+
value: 10000n, // fees
|
|
48
49
|
});
|
|
49
50
|
expect(result.errors).toEqual({});
|
|
50
51
|
expect(result.warnings).toEqual({});
|
|
@@ -65,14 +66,15 @@ describe("getTransactionStatus", () => {
|
|
|
65
66
|
locked: 0n,
|
|
66
67
|
},
|
|
67
68
|
]);
|
|
68
|
-
const result = await
|
|
69
|
+
const result = await validateIntent(
|
|
69
70
|
// account as any,
|
|
70
71
|
{
|
|
71
72
|
sender: SENDER,
|
|
72
73
|
amount: 1000000n,
|
|
73
|
-
fees: 200000n, // 20%
|
|
74
74
|
recipient: RECIPIENT,
|
|
75
75
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
76
|
+
}, {
|
|
77
|
+
value: 200000n, // fees
|
|
76
78
|
});
|
|
77
79
|
expect(result.warnings.feeTooHigh).toBeInstanceOf(Error);
|
|
78
80
|
expect(result.errors).toEqual({});
|
|
@@ -92,7 +94,7 @@ describe("getTransactionStatus", () => {
|
|
|
92
94
|
locked: 0n,
|
|
93
95
|
},
|
|
94
96
|
]);
|
|
95
|
-
const result = await
|
|
97
|
+
const result = await validateIntent(
|
|
96
98
|
// account as any,
|
|
97
99
|
{
|
|
98
100
|
sender: SENDER,
|
|
@@ -117,15 +119,14 @@ describe("getTransactionStatus", () => {
|
|
|
117
119
|
locked: 0n,
|
|
118
120
|
},
|
|
119
121
|
]);
|
|
120
|
-
const result = await
|
|
122
|
+
const result = await validateIntent(
|
|
121
123
|
// account as any,
|
|
122
124
|
{
|
|
123
125
|
sender: SENDER,
|
|
124
126
|
amount: 10000000n,
|
|
125
|
-
fees: 10000n,
|
|
126
127
|
recipient: SENDER,
|
|
127
128
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
128
|
-
});
|
|
129
|
+
}, { value: 10000n });
|
|
129
130
|
expect(result.errors.recipient?.name).toBe("InvalidAddressBecauseDestinationIsAlsoSource");
|
|
130
131
|
});
|
|
131
132
|
it("errors if recipient is new and amount is too low", async () => {
|
|
@@ -143,15 +144,14 @@ describe("getTransactionStatus", () => {
|
|
|
143
144
|
locked: 0n,
|
|
144
145
|
},
|
|
145
146
|
]);
|
|
146
|
-
const result = await
|
|
147
|
+
const result = await validateIntent(
|
|
147
148
|
// account as any,
|
|
148
149
|
{
|
|
149
150
|
sender: SENDER,
|
|
150
151
|
amount: 5000000n,
|
|
151
|
-
fees: 10000n,
|
|
152
152
|
recipient: RECIPIENT_NEW,
|
|
153
153
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
154
|
-
});
|
|
154
|
+
}, { value: 10000n });
|
|
155
155
|
expect(result.errors.amount?.name).toBe("NotEnoughBalanceBecauseDestinationNotCreated");
|
|
156
156
|
});
|
|
157
157
|
it("errors if amount is zero", async () => {
|
|
@@ -169,15 +169,14 @@ describe("getTransactionStatus", () => {
|
|
|
169
169
|
locked: 0n,
|
|
170
170
|
},
|
|
171
171
|
]);
|
|
172
|
-
const result = await
|
|
172
|
+
const result = await validateIntent(
|
|
173
173
|
// account as any,
|
|
174
174
|
{
|
|
175
175
|
sender: SENDER,
|
|
176
176
|
amount: 0n,
|
|
177
|
-
fees: 10000n,
|
|
178
177
|
recipient: RECIPIENT,
|
|
179
178
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
180
|
-
});
|
|
179
|
+
}, { value: 10000n });
|
|
181
180
|
expect(result.errors.amount?.name).toBe("AmountRequired");
|
|
182
181
|
});
|
|
183
182
|
it("errors if recipient is invalid", async () => {
|
|
@@ -195,15 +194,14 @@ describe("getTransactionStatus", () => {
|
|
|
195
194
|
locked: 0n,
|
|
196
195
|
},
|
|
197
196
|
]);
|
|
198
|
-
const result = await
|
|
197
|
+
const result = await validateIntent(
|
|
199
198
|
// account as any,
|
|
200
199
|
{
|
|
201
200
|
sender: SENDER,
|
|
202
201
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
203
202
|
amount: 1000000n,
|
|
204
|
-
fees: 10000n,
|
|
205
203
|
recipient: "not-an-address",
|
|
206
|
-
});
|
|
204
|
+
}, { value: 10000n });
|
|
207
205
|
expect(result.errors.recipient?.name).toBe("InvalidAddress");
|
|
208
206
|
});
|
|
209
207
|
it("errors if recipient is missing", async () => {
|
|
@@ -221,16 +219,15 @@ describe("getTransactionStatus", () => {
|
|
|
221
219
|
locked: 0n,
|
|
222
220
|
},
|
|
223
221
|
]);
|
|
224
|
-
const result = await
|
|
222
|
+
const result = await validateIntent(
|
|
225
223
|
// account as any,
|
|
226
224
|
{
|
|
227
225
|
sender: SENDER,
|
|
228
226
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
229
227
|
amount: 1000000n,
|
|
230
|
-
fees: 10000n,
|
|
231
228
|
recipient: "",
|
|
232
|
-
});
|
|
229
|
+
}, { value: 10000n });
|
|
233
230
|
expect(result.errors.recipient?.name).toBe("RecipientRequired");
|
|
234
231
|
});
|
|
235
232
|
});
|
|
236
|
-
//# sourceMappingURL=
|
|
233
|
+
//# sourceMappingURL=validateIntent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateIntent.test.js","sourceRoot":"","sources":["../../src/logic/validateIntent.test.ts"],"names":[],"mappings":"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"}
|
package/lib-es/types/model.d.ts
CHANGED
|
@@ -16,12 +16,11 @@ export type XrpMemoValueMap = {
|
|
|
16
16
|
memos: string[];
|
|
17
17
|
};
|
|
18
18
|
export type XrpMapMemo = TypedMapMemo<XrpMemoValueMap>;
|
|
19
|
-
type Order = "asc" | "desc";
|
|
19
|
+
export type Order = "asc" | "desc";
|
|
20
20
|
export type ListOperationsOptions = {
|
|
21
21
|
limit?: number;
|
|
22
22
|
token?: string;
|
|
23
23
|
order?: Order;
|
|
24
24
|
minHeight?: number;
|
|
25
25
|
};
|
|
26
|
-
export {};
|
|
27
26
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAEvD,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAEvD,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnC,MAAM,MAAM,qBAAqB,GAAG;IAElC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-xrp",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.3.0-nightly.1",
|
|
4
4
|
"description": "Ledger XRP Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -103,13 +103,13 @@
|
|
|
103
103
|
"invariant": "^2.2.4",
|
|
104
104
|
"ripple-address-codec": "^5.0.0",
|
|
105
105
|
"ripple-binary-codec": "^1.3.0",
|
|
106
|
-
"@ledgerhq/coin-framework": "^6.
|
|
107
|
-
"@ledgerhq/cryptoassets": "^13.
|
|
108
|
-
"@ledgerhq/devices": "8.5.0",
|
|
109
|
-
"@ledgerhq/
|
|
110
|
-
"@ledgerhq/
|
|
111
|
-
"@ledgerhq/
|
|
112
|
-
"@ledgerhq/
|
|
106
|
+
"@ledgerhq/coin-framework": "^6.3.0-nightly.1",
|
|
107
|
+
"@ledgerhq/cryptoassets": "^13.27.0-nightly.0",
|
|
108
|
+
"@ledgerhq/devices": "8.5.1-nightly.0",
|
|
109
|
+
"@ledgerhq/errors": "^6.25.0-nightly.0",
|
|
110
|
+
"@ledgerhq/live-network": "^2.0.16-nightly.1",
|
|
111
|
+
"@ledgerhq/types-live": "^6.83.0-nightly.0",
|
|
112
|
+
"@ledgerhq/logs": "^6.13.0"
|
|
113
113
|
},
|
|
114
114
|
"devDependencies": {
|
|
115
115
|
"@faker-js/faker": "^8.4.1",
|
|
@@ -122,12 +122,12 @@
|
|
|
122
122
|
"ts-jest": "^29.1.1",
|
|
123
123
|
"typescript": "^5.4.5",
|
|
124
124
|
"@ledgerhq/disable-network-setup": "^0.0.0",
|
|
125
|
-
"@ledgerhq/types-cryptoassets": "^7.
|
|
125
|
+
"@ledgerhq/types-cryptoassets": "^7.26.0-nightly.1"
|
|
126
126
|
},
|
|
127
127
|
"scripts": {
|
|
128
128
|
"clean": "rimraf lib lib-es",
|
|
129
129
|
"build": "tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es",
|
|
130
|
-
"coverage": "jest --coverage
|
|
130
|
+
"coverage": "jest --coverage",
|
|
131
131
|
"prewatch": "pnpm build",
|
|
132
132
|
"watch": "tsc --watch",
|
|
133
133
|
"watch:es": "tsc --watch -m esnext --moduleResolution bundler --outDir lib-es",
|
|
@@ -33,7 +33,7 @@ describe("Xrp Api", () => {
|
|
|
33
33
|
describe("listOperations", () => {
|
|
34
34
|
it.skip("returns a list regarding address parameter", async () => {
|
|
35
35
|
// When
|
|
36
|
-
const [tx, _] = await api.listOperations(SENDER, { minHeight: 200 });
|
|
36
|
+
const [tx, _] = await api.listOperations(SENDER, { minHeight: 200, order: "asc" });
|
|
37
37
|
|
|
38
38
|
// https://blockexplorer.one/xrp/testnet/address/rh1HPuRVsYYvThxG2Bs1MfjmrVC73S16Fb
|
|
39
39
|
// as of 2025-03-18, the address has 287 transactions
|
|
@@ -51,7 +51,10 @@ describe("Xrp Api", () => {
|
|
|
51
51
|
const SENDER_WITH_TRANSACTIONS = "rUxSkt6hQpWxXQwTNRUCYYRQ7BC2yRA3F8";
|
|
52
52
|
|
|
53
53
|
// When
|
|
54
|
-
const [ops, _] = await api.listOperations(SENDER_WITH_TRANSACTIONS, {
|
|
54
|
+
const [ops, _] = await api.listOperations(SENDER_WITH_TRANSACTIONS, {
|
|
55
|
+
minHeight: 0,
|
|
56
|
+
order: "asc",
|
|
57
|
+
});
|
|
55
58
|
// Then
|
|
56
59
|
const checkSet = new Set(ops.map(elt => elt.tx.hash));
|
|
57
60
|
expect(checkSet.size).toEqual(ops.length);
|
|
@@ -64,6 +67,17 @@ describe("Xrp Api", () => {
|
|
|
64
67
|
// so here we are checking that this limit is bypassed
|
|
65
68
|
expect(ops.length).toBeGreaterThan(200);
|
|
66
69
|
});
|
|
70
|
+
|
|
71
|
+
it("returns operations from latest, but in asc order", async () => {
|
|
72
|
+
// When
|
|
73
|
+
const [txDesc] = await api.listOperations(SENDER, { minHeight: 0, order: "desc" });
|
|
74
|
+
|
|
75
|
+
// Then
|
|
76
|
+
// Check if the result is sorted in ascending order
|
|
77
|
+
expect(txDesc[0].tx.block.height).toBeGreaterThanOrEqual(
|
|
78
|
+
txDesc[txDesc.length - 1].tx.block.height,
|
|
79
|
+
);
|
|
80
|
+
});
|
|
67
81
|
});
|
|
68
82
|
|
|
69
83
|
describe("lastBlock", () => {
|
package/src/api/index.test.ts
CHANGED
|
@@ -106,7 +106,7 @@ describe("listOperations", () => {
|
|
|
106
106
|
const txs = givenTxs(BigInt(10), BigInt(10), "src", "dest");
|
|
107
107
|
// each time it's called it returns a marker, so in theory it would loop forever
|
|
108
108
|
mockGetTransactions.mockResolvedValue(mockNetworkTxs(txs, defaultMarker));
|
|
109
|
-
const [results, _] = await api.listOperations("src", { minHeight: 0 });
|
|
109
|
+
const [results, _] = await api.listOperations("src", { minHeight: 0, order: "asc" });
|
|
110
110
|
|
|
111
111
|
// called 10 times because there is a hard limit of 10 iterations in case something goes wrong
|
|
112
112
|
// with interpretation of the token (bug / explorer api changed ...)
|
|
@@ -122,7 +122,7 @@ describe("listOperations", () => {
|
|
|
122
122
|
.mockReturnValueOnce(mockNetworkTxs(txs, defaultMarker))
|
|
123
123
|
.mockReturnValueOnce(mockNetworkTxs(txs, undefined));
|
|
124
124
|
|
|
125
|
-
const [results, _] = await api.listOperations("src", { minHeight: 0 });
|
|
125
|
+
const [results, _] = await api.listOperations("src", { minHeight: 0, order: "asc" });
|
|
126
126
|
|
|
127
127
|
// called 2 times because the second time there is no marker
|
|
128
128
|
expect(mockGetServerInfos).toHaveBeenCalledTimes(2);
|
|
@@ -171,7 +171,7 @@ describe("listOperations", () => {
|
|
|
171
171
|
mockGetTransactions.mockResolvedValue(mockNetworkTxs([], undefined));
|
|
172
172
|
|
|
173
173
|
// When
|
|
174
|
-
const [results, _] = await api.listOperations(address, { minHeight: 0 });
|
|
174
|
+
const [results, _] = await api.listOperations(address, { minHeight: 0, order: "asc" });
|
|
175
175
|
|
|
176
176
|
// Then
|
|
177
177
|
// called twice because the marker is set the first time
|
|
@@ -291,7 +291,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
291
291
|
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
292
292
|
expect.any(Object),
|
|
293
293
|
expect.objectContaining({
|
|
294
|
-
|
|
294
|
+
fees: customFees,
|
|
295
295
|
}),
|
|
296
296
|
undefined,
|
|
297
297
|
);
|
|
@@ -303,7 +303,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
303
303
|
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
304
304
|
expect.any(Object),
|
|
305
305
|
expect.objectContaining({
|
|
306
|
-
|
|
306
|
+
fees: DEFAULT_ESTIMATED_FEES,
|
|
307
307
|
}),
|
|
308
308
|
undefined,
|
|
309
309
|
);
|
package/src/api/index.ts
CHANGED
|
@@ -23,10 +23,11 @@ import {
|
|
|
23
23
|
getNextValidSequence,
|
|
24
24
|
lastBlock,
|
|
25
25
|
listOperations,
|
|
26
|
-
|
|
26
|
+
validateIntent,
|
|
27
27
|
MemoInput,
|
|
28
28
|
} from "../logic";
|
|
29
29
|
import { ListOperationsOptions, XrpMapMemo } from "../types";
|
|
30
|
+
import { Order } from "../types/model";
|
|
30
31
|
|
|
31
32
|
export function createApi(config: XrpConfig): Api<XrpMapMemo> {
|
|
32
33
|
coinConfig.setCoinConfig(() => ({ ...config, status: { type: "active" } }));
|
|
@@ -39,7 +40,7 @@ export function createApi(config: XrpConfig): Api<XrpMapMemo> {
|
|
|
39
40
|
getBalance,
|
|
40
41
|
lastBlock,
|
|
41
42
|
listOperations: operations,
|
|
42
|
-
validateIntent
|
|
43
|
+
validateIntent,
|
|
43
44
|
getBlock(_height): Promise<Block> {
|
|
44
45
|
throw new Error("getBlock is not supported");
|
|
45
46
|
},
|
|
@@ -115,12 +116,13 @@ type PaginationState = {
|
|
|
115
116
|
async function operationsFromHeight(
|
|
116
117
|
address: string,
|
|
117
118
|
minHeight: number,
|
|
119
|
+
order: Order = "asc",
|
|
118
120
|
): Promise<[Operation[], string]> {
|
|
119
121
|
async function fetchNextPage(state: PaginationState): Promise<PaginationState> {
|
|
120
122
|
const options: ListOperationsOptions = {
|
|
121
123
|
limit: state.pageSize,
|
|
122
124
|
minHeight: state.minHeight,
|
|
123
|
-
order:
|
|
125
|
+
order: order,
|
|
124
126
|
};
|
|
125
127
|
if (state.apiNextCursor) {
|
|
126
128
|
options.token = state.apiNextCursor;
|
|
@@ -162,9 +164,9 @@ async function operationsFromHeight(
|
|
|
162
164
|
|
|
163
165
|
// NOTE: double check
|
|
164
166
|
async function operations(address: string, pagination: Pagination): Promise<[Operation[], string]> {
|
|
165
|
-
const { minHeight, lastPagingToken } = pagination;
|
|
167
|
+
const { minHeight, lastPagingToken, order } = pagination;
|
|
166
168
|
if (minHeight) {
|
|
167
|
-
return await operationsFromHeight(address, minHeight);
|
|
169
|
+
return await operationsFromHeight(address, minHeight, order);
|
|
168
170
|
}
|
|
169
171
|
const isInitSync = lastPagingToken === "";
|
|
170
172
|
|
|
@@ -172,5 +174,5 @@ async function operations(address: string, pagination: Pagination): Promise<[Ope
|
|
|
172
174
|
minHeight: isInitSync ? 0 : parseInt(lastPagingToken || "0", 10),
|
|
173
175
|
};
|
|
174
176
|
// TODO token must be implemented properly (waiting ack from the design document)
|
|
175
|
-
return await operationsFromHeight(address, newPagination.minHeight);
|
|
177
|
+
return await operationsFromHeight(address, newPagination.minHeight, order);
|
|
176
178
|
}
|
package/src/logic/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { getBalance } from "./getBalance";
|
|
|
7
7
|
export { getAccountInfo } from "./getAccountInfo";
|
|
8
8
|
export { lastBlock } from "./lastBlock";
|
|
9
9
|
export { listOperations } from "./listOperations";
|
|
10
|
-
export {
|
|
10
|
+
export { validateIntent } from "./validateIntent";
|
|
11
11
|
export { RIPPLE_EPOCH, cachedRecipientIsNew, getNextValidSequence } from "./utils";
|
|
12
12
|
|
|
13
13
|
export { parseAPIValue } from "./common";
|
|
@@ -41,7 +41,7 @@ describe("listOperations", () => {
|
|
|
41
41
|
// Given
|
|
42
42
|
mockNetworkGetTransactions.mockResolvedValue(mockNetworkTxs([]));
|
|
43
43
|
// When
|
|
44
|
-
const [results, token] = await listOperations("any address", { minHeight: 0 });
|
|
44
|
+
const [results, token] = await listOperations("any address", { minHeight: 0, order: "asc" });
|
|
45
45
|
// Then
|
|
46
46
|
expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
|
|
47
47
|
expect(mockNetworkGetTransactions).toHaveBeenCalledTimes(1);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { validateIntent } from "./validateIntent";
|
|
2
2
|
import * as utils from "./utils";
|
|
3
3
|
|
|
4
4
|
const mockGetBalance = jest.fn();
|
|
@@ -26,7 +26,7 @@ const SENDER = "rPSCfmnX3t9jQJG5RNcZtSaP5UhExZDue4";
|
|
|
26
26
|
const RECIPIENT = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
|
|
27
27
|
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
28
28
|
|
|
29
|
-
describe("
|
|
29
|
+
describe("validateIntent", () => {
|
|
30
30
|
afterEach(() => {
|
|
31
31
|
jest.clearAllMocks();
|
|
32
32
|
});
|
|
@@ -47,15 +47,17 @@ describe("getTransactionStatus", () => {
|
|
|
47
47
|
},
|
|
48
48
|
]);
|
|
49
49
|
|
|
50
|
-
const result = await
|
|
50
|
+
const result = await validateIntent(
|
|
51
51
|
// account as any,
|
|
52
52
|
{
|
|
53
53
|
sender: SENDER,
|
|
54
54
|
amount: 20_000_000n,
|
|
55
|
-
fees: 10_000n,
|
|
56
55
|
recipient: RECIPIENT,
|
|
57
56
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
58
57
|
} as any,
|
|
58
|
+
{
|
|
59
|
+
value: 10_000n, // fees
|
|
60
|
+
},
|
|
59
61
|
);
|
|
60
62
|
|
|
61
63
|
expect(result.errors).toEqual({});
|
|
@@ -79,15 +81,17 @@ describe("getTransactionStatus", () => {
|
|
|
79
81
|
},
|
|
80
82
|
]);
|
|
81
83
|
|
|
82
|
-
const result = await
|
|
84
|
+
const result = await validateIntent(
|
|
83
85
|
// account as any,
|
|
84
86
|
{
|
|
85
87
|
sender: SENDER,
|
|
86
88
|
amount: 1_000_000n,
|
|
87
|
-
fees: 200_000n, // 20%
|
|
88
89
|
recipient: RECIPIENT,
|
|
89
90
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
90
91
|
} as any,
|
|
92
|
+
{
|
|
93
|
+
value: 200_000n, // fees
|
|
94
|
+
},
|
|
91
95
|
);
|
|
92
96
|
|
|
93
97
|
expect(result.warnings.feeTooHigh).toBeInstanceOf(Error);
|
|
@@ -110,7 +114,7 @@ describe("getTransactionStatus", () => {
|
|
|
110
114
|
},
|
|
111
115
|
]);
|
|
112
116
|
|
|
113
|
-
const result = await
|
|
117
|
+
const result = await validateIntent(
|
|
114
118
|
// account as any,
|
|
115
119
|
{
|
|
116
120
|
sender: SENDER,
|
|
@@ -139,15 +143,15 @@ describe("getTransactionStatus", () => {
|
|
|
139
143
|
},
|
|
140
144
|
]);
|
|
141
145
|
|
|
142
|
-
const result = await
|
|
146
|
+
const result = await validateIntent(
|
|
143
147
|
// account as any,
|
|
144
148
|
{
|
|
145
149
|
sender: SENDER,
|
|
146
150
|
amount: 10_000_000n,
|
|
147
|
-
fees: 10_000n,
|
|
148
151
|
recipient: SENDER,
|
|
149
152
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
150
153
|
} as any,
|
|
154
|
+
{ value: 10_000n }, // fees
|
|
151
155
|
);
|
|
152
156
|
|
|
153
157
|
expect(result.errors.recipient?.name).toBe("InvalidAddressBecauseDestinationIsAlsoSource");
|
|
@@ -169,15 +173,15 @@ describe("getTransactionStatus", () => {
|
|
|
169
173
|
},
|
|
170
174
|
]);
|
|
171
175
|
|
|
172
|
-
const result = await
|
|
176
|
+
const result = await validateIntent(
|
|
173
177
|
// account as any,
|
|
174
178
|
{
|
|
175
179
|
sender: SENDER,
|
|
176
180
|
amount: 5_000_000n,
|
|
177
|
-
fees: 10_000n,
|
|
178
181
|
recipient: RECIPIENT_NEW,
|
|
179
182
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
180
183
|
} as any,
|
|
184
|
+
{ value: 10_000n }, // fees
|
|
181
185
|
);
|
|
182
186
|
|
|
183
187
|
expect(result.errors.amount?.name).toBe("NotEnoughBalanceBecauseDestinationNotCreated");
|
|
@@ -199,15 +203,15 @@ describe("getTransactionStatus", () => {
|
|
|
199
203
|
},
|
|
200
204
|
]);
|
|
201
205
|
|
|
202
|
-
const result = await
|
|
206
|
+
const result = await validateIntent(
|
|
203
207
|
// account as any,
|
|
204
208
|
{
|
|
205
209
|
sender: SENDER,
|
|
206
210
|
amount: 0n,
|
|
207
|
-
fees: 10_000n,
|
|
208
211
|
recipient: RECIPIENT,
|
|
209
212
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
210
213
|
} as any,
|
|
214
|
+
{ value: 10_000n }, // fees
|
|
211
215
|
);
|
|
212
216
|
|
|
213
217
|
expect(result.errors.amount?.name).toBe("AmountRequired");
|
|
@@ -229,15 +233,15 @@ describe("getTransactionStatus", () => {
|
|
|
229
233
|
},
|
|
230
234
|
]);
|
|
231
235
|
|
|
232
|
-
const result = await
|
|
236
|
+
const result = await validateIntent(
|
|
233
237
|
// account as any,
|
|
234
238
|
{
|
|
235
239
|
sender: SENDER,
|
|
236
240
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
237
241
|
amount: 1_000_000n,
|
|
238
|
-
fees: 10_000n,
|
|
239
242
|
recipient: "not-an-address",
|
|
240
243
|
} as any,
|
|
244
|
+
{ value: 10_000n }, // fees
|
|
241
245
|
);
|
|
242
246
|
|
|
243
247
|
expect(result.errors.recipient?.name).toBe("InvalidAddress");
|
|
@@ -259,15 +263,15 @@ describe("getTransactionStatus", () => {
|
|
|
259
263
|
},
|
|
260
264
|
]);
|
|
261
265
|
|
|
262
|
-
const result = await
|
|
266
|
+
const result = await validateIntent(
|
|
263
267
|
// account as any,
|
|
264
268
|
{
|
|
265
269
|
sender: SENDER,
|
|
266
270
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
267
271
|
amount: 1_000_000n,
|
|
268
|
-
fees: 10_000n,
|
|
269
272
|
recipient: "",
|
|
270
273
|
} as any,
|
|
274
|
+
{ value: 10_000n }, // fees
|
|
271
275
|
);
|
|
272
276
|
|
|
273
277
|
expect(result.errors.recipient?.name).toBe("RecipientRequired");
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AmountRequired,
|
|
3
3
|
FeeNotLoaded,
|
|
4
|
-
FeeRequired,
|
|
5
4
|
FeeTooHigh,
|
|
6
5
|
InvalidAddress,
|
|
7
6
|
InvalidAddressBecauseDestinationIsAlsoSource,
|
|
@@ -14,12 +13,17 @@ import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
|
|
|
14
13
|
import { getServerInfos } from "../network";
|
|
15
14
|
import { cachedRecipientIsNew } from "./utils";
|
|
16
15
|
import { parseAPIValue } from "./common";
|
|
17
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
TransactionValidation,
|
|
18
|
+
TransactionIntent,
|
|
19
|
+
FeeEstimation,
|
|
20
|
+
} from "@ledgerhq/coin-framework/api/types";
|
|
18
21
|
import { XrpMapMemo } from "../types";
|
|
19
22
|
import { getBalance } from "./getBalance";
|
|
20
23
|
|
|
21
|
-
export const
|
|
24
|
+
export const validateIntent = async (
|
|
22
25
|
transactionIntent: TransactionIntent<XrpMapMemo>,
|
|
26
|
+
customFees?: FeeEstimation,
|
|
23
27
|
): Promise<TransactionValidation> => {
|
|
24
28
|
const errors: Record<string, Error> = {};
|
|
25
29
|
const warnings: Record<string, Error> = {};
|
|
@@ -27,7 +31,7 @@ export const getTransactionStatus = async (
|
|
|
27
31
|
const reserveBaseXRP = parseAPIValue(
|
|
28
32
|
serverInfos.info.validated_ledger.reserve_base_xrp.toString(),
|
|
29
33
|
);
|
|
30
|
-
const estimatedFees =
|
|
34
|
+
const estimatedFees = customFees?.value || 0n;
|
|
31
35
|
const totalSpent = transactionIntent.amount + estimatedFees;
|
|
32
36
|
const amount = transactionIntent.amount;
|
|
33
37
|
|
|
@@ -41,10 +45,8 @@ export const getTransactionStatus = async (
|
|
|
41
45
|
throw Error("Shouldn't happen");
|
|
42
46
|
}
|
|
43
47
|
|
|
44
|
-
if (!
|
|
48
|
+
if (!estimatedFees) {
|
|
45
49
|
errors.fee = new FeeNotLoaded();
|
|
46
|
-
} else if (transactionIntent.fees == 0n) {
|
|
47
|
-
errors.fee = new FeeRequired();
|
|
48
50
|
} else if (totalSpent > nativeBalance.value - BigInt(reserveBaseXRP.toString())) {
|
|
49
51
|
errors.amount = new NotEnoughSpendableBalance("", {
|
|
50
52
|
minimumAmount: transactionIntent.asset.unit
|
|
@@ -81,7 +83,7 @@ export const getTransactionStatus = async (
|
|
|
81
83
|
});
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
if (!errors.amount && amount
|
|
86
|
+
if (!errors.amount && amount === 0n) {
|
|
85
87
|
errors.amount = new AmountRequired();
|
|
86
88
|
}
|
|
87
89
|
|
package/src/types/model.ts
CHANGED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { TransactionValidation, TransactionIntent } from "@ledgerhq/coin-framework/api/types";
|
|
2
|
-
import { XrpMapMemo } from "../types";
|
|
3
|
-
export declare const getTransactionStatus: (transactionIntent: TransactionIntent<XrpMapMemo>) => Promise<TransactionValidation>;
|
|
4
|
-
//# sourceMappingURL=getTransactionStatus.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getTransactionStatus.d.ts","sourceRoot":"","sources":["../../src/logic/getTransactionStatus.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,CAAC,UAAU,CAAC,KAC/C,OAAO,CAAC,qBAAqB,CAwE/B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/logic/getTransactionStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getTransactionStatus.test.d.ts","sourceRoot":"","sources":["../../src/logic/getTransactionStatus.test.ts"],"names":[],"mappings":""}
|