@ledgerhq/coin-xrp 7.11.0-nightly.20260110024039 → 7.11.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.
- package/.turbo/turbo-build.log +1 -1
- package/.unimportedrc.json +0 -3
- package/CHANGELOG.md +30 -10
- package/jest.config.js +2 -10
- package/jest.integ.config.js +3 -12
- package/lib/logic/validateIntent.d.ts +2 -2
- package/lib/logic/validateIntent.d.ts.map +1 -1
- package/lib/logic/validateIntent.js +1 -3
- package/lib/logic/validateIntent.js.map +1 -1
- package/lib-es/logic/validateIntent.d.ts +2 -2
- package/lib-es/logic/validateIntent.d.ts.map +1 -1
- package/lib-es/logic/validateIntent.js +1 -3
- package/lib-es/logic/validateIntent.js.map +1 -1
- package/package.json +15 -16
- package/src/api/index.test.ts +15 -28
- package/src/logic/validateIntent.test.ts +64 -67
- package/src/logic/validateIntent.ts +2 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/coin-xrp@7.
|
|
2
|
+
> @ledgerhq/coin-xrp@7.11.0 build /home/runner/work/ledger-live/ledger-live/libs/coin-modules/coin-xrp
|
|
3
3
|
> tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
|
|
4
4
|
|
package/.unimportedrc.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,21 +1,41 @@
|
|
|
1
1
|
# @ledgerhq/coin-xrp
|
|
2
2
|
|
|
3
|
-
## 7.11.0
|
|
3
|
+
## 7.11.0
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
|
-
- [#
|
|
7
|
+
- [#13651](https://github.com/LedgerHQ/ledger-live/pull/13651) [`398b3d8`](https://github.com/LedgerHQ/ledger-live/commit/398b3d85d2de4a520d5ae78a18135f8d163aad5b) Thanks [@francois-guerin-ledger](https://github.com/francois-guerin-ledger)! - fix(llc): do not recompute balances
|
|
8
8
|
|
|
9
9
|
### Patch Changes
|
|
10
10
|
|
|
11
|
-
- Updated dependencies [[`6e6a12c`](https://github.com/LedgerHQ/ledger-live/commit/6e6a12cdfd79b752839bf664bab5156cea9c9e23), [`
|
|
12
|
-
- @ledgerhq/cryptoassets@13.36.0
|
|
13
|
-
- @ledgerhq/coin-framework@6.12.0
|
|
14
|
-
- @ledgerhq/types-live@6.92.0
|
|
15
|
-
- @ledgerhq/devices@8.9.0
|
|
16
|
-
- @ledgerhq/
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
- Updated dependencies [[`6e6a12c`](https://github.com/LedgerHQ/ledger-live/commit/6e6a12cdfd79b752839bf664bab5156cea9c9e23), [`398b3d8`](https://github.com/LedgerHQ/ledger-live/commit/398b3d85d2de4a520d5ae78a18135f8d163aad5b), [`7e12cd3`](https://github.com/LedgerHQ/ledger-live/commit/7e12cd30f47d42cd8dac35cfa475abdd9ad44e19), [`a8c59da`](https://github.com/LedgerHQ/ledger-live/commit/a8c59da888c8cb3c200a9f62869ca54aba706cae), [`4455451`](https://github.com/LedgerHQ/ledger-live/commit/445545117cf0196d7c5a303df21041c23b91844c), [`8cb7d40`](https://github.com/LedgerHQ/ledger-live/commit/8cb7d40e0a55e47f42adc5cd522740cab1fd4de4), [`e57fa40`](https://github.com/LedgerHQ/ledger-live/commit/e57fa40a1bb480ebcc03120a1aab3b02e249bf8d), [`e844b3b`](https://github.com/LedgerHQ/ledger-live/commit/e844b3bd5f8a4b21cf94e0a598c22a2a42791490), [`c2d4259`](https://github.com/LedgerHQ/ledger-live/commit/c2d425989b600732f4fb0a88993e2673e93698a7), [`9e80ecc`](https://github.com/LedgerHQ/ledger-live/commit/9e80ecc5ef6da4f39a184d3c555c8d7c439754a8), [`ffa9e7e`](https://github.com/LedgerHQ/ledger-live/commit/ffa9e7e58dd60d0f568362a95e14ba5d130c2d07), [`4caf2ef`](https://github.com/LedgerHQ/ledger-live/commit/4caf2eff2aff2a6f1048ccf8e94295c954554ae1), [`c4045c7`](https://github.com/LedgerHQ/ledger-live/commit/c4045c714ee0fb1f02f6e75cae04e99cdea01ae4)]:
|
|
12
|
+
- @ledgerhq/cryptoassets@13.36.0
|
|
13
|
+
- @ledgerhq/coin-framework@6.12.0
|
|
14
|
+
- @ledgerhq/types-live@6.92.0
|
|
15
|
+
- @ledgerhq/devices@8.9.0
|
|
16
|
+
- @ledgerhq/live-network@2.1.5
|
|
17
|
+
|
|
18
|
+
## 7.11.0-next.1
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
22
|
+
- [#13651](https://github.com/LedgerHQ/ledger-live/pull/13651) [`398b3d8`](https://github.com/LedgerHQ/ledger-live/commit/398b3d85d2de4a520d5ae78a18135f8d163aad5b) Thanks [@francois-guerin-ledger](https://github.com/francois-guerin-ledger)! - fix(llc): do not recompute balances
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Updated dependencies [[`398b3d8`](https://github.com/LedgerHQ/ledger-live/commit/398b3d85d2de4a520d5ae78a18135f8d163aad5b)]:
|
|
27
|
+
- @ledgerhq/coin-framework@6.12.0-next.1
|
|
28
|
+
|
|
29
|
+
## 7.10.2-next.0
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- Updated dependencies [[`6e6a12c`](https://github.com/LedgerHQ/ledger-live/commit/6e6a12cdfd79b752839bf664bab5156cea9c9e23), [`7e12cd3`](https://github.com/LedgerHQ/ledger-live/commit/7e12cd30f47d42cd8dac35cfa475abdd9ad44e19), [`a8c59da`](https://github.com/LedgerHQ/ledger-live/commit/a8c59da888c8cb3c200a9f62869ca54aba706cae), [`4455451`](https://github.com/LedgerHQ/ledger-live/commit/445545117cf0196d7c5a303df21041c23b91844c), [`8cb7d40`](https://github.com/LedgerHQ/ledger-live/commit/8cb7d40e0a55e47f42adc5cd522740cab1fd4de4), [`e57fa40`](https://github.com/LedgerHQ/ledger-live/commit/e57fa40a1bb480ebcc03120a1aab3b02e249bf8d), [`e844b3b`](https://github.com/LedgerHQ/ledger-live/commit/e844b3bd5f8a4b21cf94e0a598c22a2a42791490), [`c2d4259`](https://github.com/LedgerHQ/ledger-live/commit/c2d425989b600732f4fb0a88993e2673e93698a7), [`9e80ecc`](https://github.com/LedgerHQ/ledger-live/commit/9e80ecc5ef6da4f39a184d3c555c8d7c439754a8), [`ffa9e7e`](https://github.com/LedgerHQ/ledger-live/commit/ffa9e7e58dd60d0f568362a95e14ba5d130c2d07), [`4caf2ef`](https://github.com/LedgerHQ/ledger-live/commit/4caf2eff2aff2a6f1048ccf8e94295c954554ae1), [`c4045c7`](https://github.com/LedgerHQ/ledger-live/commit/c4045c714ee0fb1f02f6e75cae04e99cdea01ae4)]:
|
|
34
|
+
- @ledgerhq/cryptoassets@13.36.0-next.0
|
|
35
|
+
- @ledgerhq/types-live@6.92.0-next.0
|
|
36
|
+
- @ledgerhq/devices@8.9.0-next.0
|
|
37
|
+
- @ledgerhq/coin-framework@6.11.2-next.0
|
|
38
|
+
- @ledgerhq/live-network@2.1.5-next.0
|
|
19
39
|
|
|
20
40
|
## 7.10.1
|
|
21
41
|
|
package/jest.config.js
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
|
+
/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
|
|
1
2
|
// `workerThreads: true` is required for validating object with `bigint` values
|
|
2
3
|
module.exports = {
|
|
4
|
+
preset: "ts-jest",
|
|
3
5
|
testEnvironment: "node",
|
|
4
|
-
transform: {
|
|
5
|
-
"^.+\\.(ts|tsx)$": [
|
|
6
|
-
"@swc/jest",
|
|
7
|
-
{
|
|
8
|
-
jsc: {
|
|
9
|
-
target: "esnext",
|
|
10
|
-
},
|
|
11
|
-
},
|
|
12
|
-
],
|
|
13
|
-
},
|
|
14
6
|
passWithNoTests: true,
|
|
15
7
|
testPathIgnorePatterns: ["lib/", "lib-es/", ".*\\.(integ|integration)\\.test\\.[tj]s"],
|
|
16
8
|
collectCoverageFrom: [
|
package/jest.integ.config.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
/** @type {import('jest').
|
|
1
|
+
/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
|
|
2
2
|
module.exports = {
|
|
3
|
+
preset: "ts-jest",
|
|
3
4
|
testEnvironment: "node",
|
|
4
5
|
testRegex: ".integ.test.ts$",
|
|
5
6
|
testPathIgnorePatterns: ["lib/", "lib-es/"],
|
|
7
|
+
setupFiles: ["dotenv/config"],
|
|
6
8
|
testTimeout: 60_000,
|
|
7
|
-
forceExit: true,
|
|
8
|
-
transform: {
|
|
9
|
-
"^.+\\.(t|j)sx?$": [
|
|
10
|
-
"@swc/jest",
|
|
11
|
-
{
|
|
12
|
-
jsc: {
|
|
13
|
-
target: "esnext",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
},
|
|
18
9
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TransactionValidation, TransactionIntent, FeeEstimation } from "@ledgerhq/coin-framework/api/types";
|
|
1
|
+
import { TransactionValidation, TransactionIntent, FeeEstimation, Balance } from "@ledgerhq/coin-framework/api/types";
|
|
2
2
|
import { XrpMapMemo } from "../types";
|
|
3
|
-
export declare const validateIntent: (transactionIntent: TransactionIntent<XrpMapMemo>, customFees?: FeeEstimation) => Promise<TransactionValidation>;
|
|
3
|
+
export declare const validateIntent: (transactionIntent: TransactionIntent<XrpMapMemo>, balances: Balance[], customFees?: FeeEstimation) => Promise<TransactionValidation>;
|
|
4
4
|
//# sourceMappingURL=validateIntent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,
|
|
1
|
+
{"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,eAAO,MAAM,cAAc,sBACN,iBAAiB,CAAC,UAAU,CAAC,YACtC,OAAO,EAAE,eACN,aAAa,KACzB,OAAO,CAAC,qBAAqB,CAqE/B,CAAC"}
|
|
@@ -7,8 +7,7 @@ const index_1 = require("@ledgerhq/coin-framework/currencies/index");
|
|
|
7
7
|
const network_1 = require("../network");
|
|
8
8
|
const utils_1 = require("./utils");
|
|
9
9
|
const common_1 = require("./common");
|
|
10
|
-
const
|
|
11
|
-
const validateIntent = async (transactionIntent, customFees) => {
|
|
10
|
+
const validateIntent = async (transactionIntent, balances, customFees) => {
|
|
12
11
|
const errors = {};
|
|
13
12
|
const warnings = {};
|
|
14
13
|
const serverInfos = await (0, network_1.getServerInfos)();
|
|
@@ -19,7 +18,6 @@ const validateIntent = async (transactionIntent, customFees) => {
|
|
|
19
18
|
if (amount > 0 && estimatedFees * 10n > amount) {
|
|
20
19
|
warnings.feeTooHigh = new errors_1.FeeTooHigh();
|
|
21
20
|
}
|
|
22
|
-
const balances = await (0, getBalance_1.getBalance)(transactionIntent.sender);
|
|
23
21
|
const nativeBalance = balances.find(b => b.asset.type === "native");
|
|
24
22
|
if (nativeBalance === undefined) {
|
|
25
23
|
throw Error("Shouldn't happen");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":";;;AAAA,6CAS0B;AAC1B,+DAA6D;AAC7D,qEAA+E;
|
|
1
|
+
{"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TransactionValidation, TransactionIntent, FeeEstimation } from "@ledgerhq/coin-framework/api/types";
|
|
1
|
+
import { TransactionValidation, TransactionIntent, FeeEstimation, Balance } from "@ledgerhq/coin-framework/api/types";
|
|
2
2
|
import { XrpMapMemo } from "../types";
|
|
3
|
-
export declare const validateIntent: (transactionIntent: TransactionIntent<XrpMapMemo>, customFees?: FeeEstimation) => Promise<TransactionValidation>;
|
|
3
|
+
export declare const validateIntent: (transactionIntent: TransactionIntent<XrpMapMemo>, balances: Balance[], customFees?: FeeEstimation) => Promise<TransactionValidation>;
|
|
4
4
|
//# sourceMappingURL=validateIntent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,
|
|
1
|
+
{"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,eAAO,MAAM,cAAc,sBACN,iBAAiB,CAAC,UAAU,CAAC,YACtC,OAAO,EAAE,eACN,aAAa,KACzB,OAAO,CAAC,qBAAqB,CAqE/B,CAAC"}
|
|
@@ -4,8 +4,7 @@ import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
|
|
|
4
4
|
import { getServerInfos } from "../network";
|
|
5
5
|
import { cachedRecipientIsNew } from "./utils";
|
|
6
6
|
import { parseAPIValue } from "./common";
|
|
7
|
-
|
|
8
|
-
export const validateIntent = async (transactionIntent, customFees) => {
|
|
7
|
+
export const validateIntent = async (transactionIntent, balances, customFees) => {
|
|
9
8
|
const errors = {};
|
|
10
9
|
const warnings = {};
|
|
11
10
|
const serverInfos = await getServerInfos();
|
|
@@ -16,7 +15,6 @@ export const validateIntent = async (transactionIntent, customFees) => {
|
|
|
16
15
|
if (amount > 0 && estimatedFees * 10n > amount) {
|
|
17
16
|
warnings.feeTooHigh = new FeeTooHigh();
|
|
18
17
|
}
|
|
19
|
-
const balances = await getBalance(transactionIntent.sender);
|
|
20
18
|
const nativeBalance = balances.find(b => b.asset.type === "native");
|
|
21
19
|
if (nativeBalance === undefined) {
|
|
22
20
|
throw Error("Shouldn't happen");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,4CAA4C,EAC5C,4CAA4C,EAC5C,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/logic/validateIntent.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": "7.11.0
|
|
3
|
+
"version": "7.11.0",
|
|
4
4
|
"description": "Ledger XRP Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -103,27 +103,26 @@
|
|
|
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.12.0
|
|
107
|
-
"@ledgerhq/cryptoassets": "^13.36.0
|
|
108
|
-
"@ledgerhq/devices": "8.9.0
|
|
109
|
-
"@ledgerhq/errors": "^6.
|
|
110
|
-
"@ledgerhq/live-network": "^2.
|
|
111
|
-
"@ledgerhq/types-live": "^6.92.0
|
|
112
|
-
"@ledgerhq/logs": "^6.
|
|
106
|
+
"@ledgerhq/coin-framework": "^6.12.0",
|
|
107
|
+
"@ledgerhq/cryptoassets": "^13.36.0",
|
|
108
|
+
"@ledgerhq/devices": "8.9.0",
|
|
109
|
+
"@ledgerhq/errors": "^6.28.0",
|
|
110
|
+
"@ledgerhq/live-network": "^2.1.5",
|
|
111
|
+
"@ledgerhq/types-live": "^6.92.0",
|
|
112
|
+
"@ledgerhq/logs": "^6.13.0"
|
|
113
113
|
},
|
|
114
114
|
"devDependencies": {
|
|
115
115
|
"@faker-js/faker": "^8.4.1",
|
|
116
116
|
"@types/invariant": "^2.2.37",
|
|
117
|
-
"@types/jest": "
|
|
117
|
+
"@types/jest": "^29.5.12",
|
|
118
118
|
"dotenv": "^16.4.5",
|
|
119
|
-
"expect": "
|
|
120
|
-
"jest": "
|
|
119
|
+
"expect": "^27.4.6",
|
|
120
|
+
"jest": "^29.7.0",
|
|
121
121
|
"ripple-keypairs": "^2.0.0",
|
|
122
|
-
"
|
|
123
|
-
"@swc/core": "1.15.8",
|
|
122
|
+
"ts-jest": "^29.1.1",
|
|
124
123
|
"typescript": "^5.4.5",
|
|
125
|
-
"@ledgerhq/
|
|
126
|
-
"@ledgerhq/
|
|
124
|
+
"@ledgerhq/disable-network-setup": "^0.1.0",
|
|
125
|
+
"@ledgerhq/types-cryptoassets": "^7.31.0"
|
|
127
126
|
},
|
|
128
127
|
"scripts": {
|
|
129
128
|
"clean": "rimraf lib lib-es",
|
|
@@ -138,7 +137,7 @@
|
|
|
138
137
|
"test": "jest",
|
|
139
138
|
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand",
|
|
140
139
|
"test-watch": "jest --watch",
|
|
141
|
-
"test-integ": "DOTENV_CONFIG_PATH=.env.integ.test jest --config=jest.integ.config.js
|
|
140
|
+
"test-integ": "DOTENV_CONFIG_PATH=.env.integ.test jest --config=jest.integ.config.js",
|
|
142
141
|
"test-integ:debug": "DOTENV_CONFIG_PATH=.env.integ.test node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --config=jest.integ.config.js",
|
|
143
142
|
"typecheck": "tsc --noEmit",
|
|
144
143
|
"unimported": "unimported"
|
package/src/api/index.test.ts
CHANGED
|
@@ -16,18 +16,6 @@ jest.mock("../network", () => ({
|
|
|
16
16
|
mockGetTransactions(address, options),
|
|
17
17
|
}));
|
|
18
18
|
|
|
19
|
-
// Module-level mocks for logic functions
|
|
20
|
-
const mockCraftTransaction = jest.fn();
|
|
21
|
-
const mockGetNextValidSequence = jest.fn();
|
|
22
|
-
const mockEstimateFees = jest.fn();
|
|
23
|
-
|
|
24
|
-
jest.mock("../logic", () => ({
|
|
25
|
-
...jest.requireActual("../logic"),
|
|
26
|
-
craftTransaction: (...args: unknown[]) => mockCraftTransaction(...args),
|
|
27
|
-
getNextValidSequence: (...args: unknown[]) => mockGetNextValidSequence(...args),
|
|
28
|
-
estimateFees: (...args: unknown[]) => mockEstimateFees(...args),
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
19
|
describe("listOperations", () => {
|
|
32
20
|
const api = createApi({ node: "https://localhost" });
|
|
33
21
|
|
|
@@ -283,15 +271,18 @@ describe("listOperations", () => {
|
|
|
283
271
|
describe("Testing craftTransaction function", () => {
|
|
284
272
|
const DEFAULT_ESTIMATED_FEES = 100n;
|
|
285
273
|
const api = createApi({ node: "https://localhost" });
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
274
|
+
const logicCraftTransactionSpy = jest
|
|
275
|
+
.spyOn(LogicFunctions, "craftTransaction")
|
|
276
|
+
.mockImplementation((_address, _transaction, _publicKey) => {
|
|
289
277
|
return Promise.resolve({ xrplTransaction: {} as never, serializedTransaction: "" });
|
|
290
278
|
});
|
|
291
279
|
|
|
292
|
-
|
|
280
|
+
beforeAll(() => {
|
|
281
|
+
jest
|
|
282
|
+
.spyOn(LogicFunctions, "getNextValidSequence")
|
|
283
|
+
.mockImplementation(_address => Promise.resolve(0));
|
|
293
284
|
|
|
294
|
-
|
|
285
|
+
jest.spyOn(LogicFunctions, "estimateFees").mockImplementation(_networkInfo => {
|
|
295
286
|
return Promise.resolve({
|
|
296
287
|
networkInfo: {} as NetworkInfo,
|
|
297
288
|
fees: DEFAULT_ESTIMATED_FEES,
|
|
@@ -299,10 +290,6 @@ describe("Testing craftTransaction function", () => {
|
|
|
299
290
|
});
|
|
300
291
|
});
|
|
301
292
|
|
|
302
|
-
afterEach(() => {
|
|
303
|
-
mockCraftTransaction.mockClear();
|
|
304
|
-
});
|
|
305
|
-
|
|
306
293
|
it("should use custom user fees when user provides it for crafting a transaction", async () => {
|
|
307
294
|
const customFees = 99n;
|
|
308
295
|
await api.craftTransaction(
|
|
@@ -312,7 +299,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
312
299
|
},
|
|
313
300
|
);
|
|
314
301
|
|
|
315
|
-
expect(
|
|
302
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
316
303
|
expect.any(Object),
|
|
317
304
|
expect.objectContaining({
|
|
318
305
|
fees: customFees,
|
|
@@ -327,7 +314,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
327
314
|
sender: "foo",
|
|
328
315
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
329
316
|
|
|
330
|
-
expect(
|
|
317
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
331
318
|
expect.any(Object),
|
|
332
319
|
expect.objectContaining({
|
|
333
320
|
fees: DEFAULT_ESTIMATED_FEES,
|
|
@@ -343,7 +330,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
343
330
|
senderPublicKey: "bar",
|
|
344
331
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
345
332
|
|
|
346
|
-
expect(
|
|
333
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
347
334
|
expect.any(Object),
|
|
348
335
|
expect.any(Object),
|
|
349
336
|
"bar",
|
|
@@ -360,7 +347,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
360
347
|
},
|
|
361
348
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
362
349
|
|
|
363
|
-
expect(
|
|
350
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
364
351
|
expect.any(Object),
|
|
365
352
|
expect.objectContaining({
|
|
366
353
|
// NOTE: before
|
|
@@ -377,7 +364,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
377
364
|
sender: "foo",
|
|
378
365
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
379
366
|
|
|
380
|
-
expect(
|
|
367
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
381
368
|
expect.any(Object),
|
|
382
369
|
expect.objectContaining({
|
|
383
370
|
memos: undefined,
|
|
@@ -396,7 +383,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
396
383
|
},
|
|
397
384
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
398
385
|
|
|
399
|
-
expect(
|
|
386
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
400
387
|
expect.any(Object),
|
|
401
388
|
expect.objectContaining({
|
|
402
389
|
memos: undefined,
|
|
@@ -415,7 +402,7 @@ describe("Testing craftTransaction function", () => {
|
|
|
415
402
|
},
|
|
416
403
|
} as SendTransactionIntent<XrpMapMemo>);
|
|
417
404
|
|
|
418
|
-
expect(
|
|
405
|
+
expect(logicCraftTransactionSpy).toHaveBeenCalledWith(
|
|
419
406
|
expect.any(Object),
|
|
420
407
|
expect.objectContaining({
|
|
421
408
|
destinationTag: 1337, // logic should convert `value: string` -> `number`
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { validateIntent } from "./validateIntent";
|
|
2
|
+
import * as utils from "./utils";
|
|
2
3
|
|
|
3
4
|
const mockGetBalance = jest.fn();
|
|
4
5
|
|
|
5
6
|
const mockGetServerInfos = jest.fn();
|
|
6
7
|
|
|
7
|
-
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
8
|
-
|
|
9
8
|
jest.mock("./getBalance", () => ({
|
|
10
9
|
getBalance: () => mockGetBalance(),
|
|
11
10
|
}));
|
|
@@ -14,20 +13,18 @@ jest.mock("../network", () => ({
|
|
|
14
13
|
getServerInfos: () => mockGetServerInfos(),
|
|
15
14
|
}));
|
|
16
15
|
|
|
17
|
-
jest.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return Promise.resolve(false);
|
|
24
|
-
}),
|
|
25
|
-
}));
|
|
16
|
+
jest.spyOn(utils, "cachedRecipientIsNew").mockImplementation(addr => {
|
|
17
|
+
if (addr === RECIPIENT_NEW) {
|
|
18
|
+
return Promise.resolve(true);
|
|
19
|
+
}
|
|
20
|
+
return Promise.resolve(false);
|
|
21
|
+
});
|
|
26
22
|
|
|
27
23
|
const reserveBase = 10_000_000n; // 10 XRP (drops)
|
|
28
24
|
|
|
29
25
|
const SENDER = "rPSCfmnX3t9jQJG5RNcZtSaP5UhExZDue4";
|
|
30
26
|
const RECIPIENT = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
|
|
27
|
+
const RECIPIENT_NEW = "rDKsbvy9uaNpPtvVFraJyNGfjvTw8xivgK";
|
|
31
28
|
|
|
32
29
|
describe("validateIntent", () => {
|
|
33
30
|
afterEach(() => {
|
|
@@ -42,13 +39,6 @@ describe("validateIntent", () => {
|
|
|
42
39
|
},
|
|
43
40
|
},
|
|
44
41
|
});
|
|
45
|
-
mockGetBalance.mockResolvedValue([
|
|
46
|
-
{
|
|
47
|
-
value: 50_000_000n,
|
|
48
|
-
asset: { type: "native" },
|
|
49
|
-
locked: 0n,
|
|
50
|
-
},
|
|
51
|
-
]);
|
|
52
42
|
|
|
53
43
|
const result = await validateIntent(
|
|
54
44
|
// account as any,
|
|
@@ -59,6 +49,13 @@ describe("validateIntent", () => {
|
|
|
59
49
|
recipient: RECIPIENT,
|
|
60
50
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
61
51
|
} as any,
|
|
52
|
+
[
|
|
53
|
+
{
|
|
54
|
+
value: 50_000_000n,
|
|
55
|
+
asset: { type: "native" },
|
|
56
|
+
locked: 0n,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
62
59
|
{
|
|
63
60
|
value: 10_000n, // fees
|
|
64
61
|
},
|
|
@@ -77,13 +74,6 @@ describe("validateIntent", () => {
|
|
|
77
74
|
},
|
|
78
75
|
},
|
|
79
76
|
});
|
|
80
|
-
mockGetBalance.mockResolvedValue([
|
|
81
|
-
{
|
|
82
|
-
value: 50_000_000n,
|
|
83
|
-
asset: { type: "native" },
|
|
84
|
-
locked: 0n,
|
|
85
|
-
},
|
|
86
|
-
]);
|
|
87
77
|
|
|
88
78
|
const result = await validateIntent(
|
|
89
79
|
// account as any,
|
|
@@ -94,6 +84,13 @@ describe("validateIntent", () => {
|
|
|
94
84
|
recipient: RECIPIENT,
|
|
95
85
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
96
86
|
} as any,
|
|
87
|
+
[
|
|
88
|
+
{
|
|
89
|
+
value: 50_000_000n,
|
|
90
|
+
asset: { type: "native" },
|
|
91
|
+
locked: 0n,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
97
94
|
{
|
|
98
95
|
value: 200_000n, // fees
|
|
99
96
|
},
|
|
@@ -111,13 +108,6 @@ describe("validateIntent", () => {
|
|
|
111
108
|
},
|
|
112
109
|
},
|
|
113
110
|
});
|
|
114
|
-
mockGetBalance.mockResolvedValue([
|
|
115
|
-
{
|
|
116
|
-
value: 30_000_000n,
|
|
117
|
-
asset: { type: "native" },
|
|
118
|
-
locked: 0n,
|
|
119
|
-
},
|
|
120
|
-
]);
|
|
121
111
|
|
|
122
112
|
const result = await validateIntent(
|
|
123
113
|
// account as any,
|
|
@@ -128,6 +118,13 @@ describe("validateIntent", () => {
|
|
|
128
118
|
recipient: RECIPIENT,
|
|
129
119
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
130
120
|
} as any,
|
|
121
|
+
[
|
|
122
|
+
{
|
|
123
|
+
value: 30_000_000n,
|
|
124
|
+
asset: { type: "native" },
|
|
125
|
+
locked: 0n,
|
|
126
|
+
},
|
|
127
|
+
],
|
|
131
128
|
);
|
|
132
129
|
|
|
133
130
|
expect(result.errors.fee?.name).toBe("FeeNotLoaded");
|
|
@@ -141,13 +138,6 @@ describe("validateIntent", () => {
|
|
|
141
138
|
},
|
|
142
139
|
},
|
|
143
140
|
});
|
|
144
|
-
mockGetBalance.mockResolvedValue([
|
|
145
|
-
{
|
|
146
|
-
value: 50_000_000n,
|
|
147
|
-
asset: { type: "native" },
|
|
148
|
-
locked: 0n,
|
|
149
|
-
},
|
|
150
|
-
]);
|
|
151
141
|
|
|
152
142
|
const result = await validateIntent(
|
|
153
143
|
// account as any,
|
|
@@ -158,6 +148,13 @@ describe("validateIntent", () => {
|
|
|
158
148
|
recipient: SENDER,
|
|
159
149
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
160
150
|
} as any,
|
|
151
|
+
[
|
|
152
|
+
{
|
|
153
|
+
value: 50_000_000n,
|
|
154
|
+
asset: { type: "native" },
|
|
155
|
+
locked: 0n,
|
|
156
|
+
},
|
|
157
|
+
],
|
|
161
158
|
{ value: 10_000n }, // fees
|
|
162
159
|
);
|
|
163
160
|
|
|
@@ -172,13 +169,6 @@ describe("validateIntent", () => {
|
|
|
172
169
|
},
|
|
173
170
|
},
|
|
174
171
|
});
|
|
175
|
-
mockGetBalance.mockResolvedValue([
|
|
176
|
-
{
|
|
177
|
-
value: 50_000_000n,
|
|
178
|
-
asset: { type: "native" },
|
|
179
|
-
locked: 0n,
|
|
180
|
-
},
|
|
181
|
-
]);
|
|
182
172
|
|
|
183
173
|
const result = await validateIntent(
|
|
184
174
|
// account as any,
|
|
@@ -189,6 +179,13 @@ describe("validateIntent", () => {
|
|
|
189
179
|
recipient: RECIPIENT_NEW,
|
|
190
180
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
191
181
|
} as any,
|
|
182
|
+
[
|
|
183
|
+
{
|
|
184
|
+
value: 50_000_000n,
|
|
185
|
+
asset: { type: "native" },
|
|
186
|
+
locked: 0n,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
192
189
|
{ value: 10_000n }, // fees
|
|
193
190
|
);
|
|
194
191
|
|
|
@@ -203,13 +200,6 @@ describe("validateIntent", () => {
|
|
|
203
200
|
},
|
|
204
201
|
},
|
|
205
202
|
});
|
|
206
|
-
mockGetBalance.mockResolvedValue([
|
|
207
|
-
{
|
|
208
|
-
value: 50_000_000n,
|
|
209
|
-
asset: { type: "native" },
|
|
210
|
-
locked: 0n,
|
|
211
|
-
},
|
|
212
|
-
]);
|
|
213
203
|
|
|
214
204
|
const result = await validateIntent(
|
|
215
205
|
// account as any,
|
|
@@ -220,6 +210,13 @@ describe("validateIntent", () => {
|
|
|
220
210
|
recipient: RECIPIENT,
|
|
221
211
|
asset: { unit: { code: "XRP", magnitude: 6 } },
|
|
222
212
|
} as any,
|
|
213
|
+
[
|
|
214
|
+
{
|
|
215
|
+
value: 50_000_000n,
|
|
216
|
+
asset: { type: "native" },
|
|
217
|
+
locked: 0n,
|
|
218
|
+
},
|
|
219
|
+
],
|
|
223
220
|
{ value: 10_000n }, // fees
|
|
224
221
|
);
|
|
225
222
|
|
|
@@ -234,13 +231,6 @@ describe("validateIntent", () => {
|
|
|
234
231
|
},
|
|
235
232
|
},
|
|
236
233
|
});
|
|
237
|
-
mockGetBalance.mockResolvedValue([
|
|
238
|
-
{
|
|
239
|
-
value: 50_000_000n,
|
|
240
|
-
asset: { type: "native" },
|
|
241
|
-
locked: 0n,
|
|
242
|
-
},
|
|
243
|
-
]);
|
|
244
234
|
|
|
245
235
|
const result = await validateIntent(
|
|
246
236
|
// account as any,
|
|
@@ -251,6 +241,13 @@ describe("validateIntent", () => {
|
|
|
251
241
|
amount: 1_000_000n,
|
|
252
242
|
recipient: "not-an-address",
|
|
253
243
|
} as any,
|
|
244
|
+
[
|
|
245
|
+
{
|
|
246
|
+
value: 50_000_000n,
|
|
247
|
+
asset: { type: "native" },
|
|
248
|
+
locked: 0n,
|
|
249
|
+
},
|
|
250
|
+
],
|
|
254
251
|
{ value: 10_000n }, // fees
|
|
255
252
|
);
|
|
256
253
|
|
|
@@ -265,13 +262,6 @@ describe("validateIntent", () => {
|
|
|
265
262
|
},
|
|
266
263
|
},
|
|
267
264
|
});
|
|
268
|
-
mockGetBalance.mockResolvedValue([
|
|
269
|
-
{
|
|
270
|
-
value: 50_000_000n,
|
|
271
|
-
asset: { type: "native" },
|
|
272
|
-
locked: 0n,
|
|
273
|
-
},
|
|
274
|
-
]);
|
|
275
265
|
|
|
276
266
|
const result = await validateIntent(
|
|
277
267
|
// account as any,
|
|
@@ -282,6 +272,13 @@ describe("validateIntent", () => {
|
|
|
282
272
|
amount: 1_000_000n,
|
|
283
273
|
recipient: "",
|
|
284
274
|
} as any,
|
|
275
|
+
[
|
|
276
|
+
{
|
|
277
|
+
value: 50_000_000n,
|
|
278
|
+
asset: { type: "native" },
|
|
279
|
+
locked: 0n,
|
|
280
|
+
},
|
|
281
|
+
],
|
|
285
282
|
{ value: 10_000n }, // fees
|
|
286
283
|
);
|
|
287
284
|
|
|
@@ -14,15 +14,16 @@ import {
|
|
|
14
14
|
TransactionValidation,
|
|
15
15
|
TransactionIntent,
|
|
16
16
|
FeeEstimation,
|
|
17
|
+
Balance,
|
|
17
18
|
} from "@ledgerhq/coin-framework/api/types";
|
|
18
19
|
import { getServerInfos } from "../network";
|
|
19
20
|
import { XrpMapMemo } from "../types";
|
|
20
21
|
import { cachedRecipientIsNew } from "./utils";
|
|
21
22
|
import { parseAPIValue } from "./common";
|
|
22
|
-
import { getBalance } from "./getBalance";
|
|
23
23
|
|
|
24
24
|
export const validateIntent = async (
|
|
25
25
|
transactionIntent: TransactionIntent<XrpMapMemo>,
|
|
26
|
+
balances: Balance[],
|
|
26
27
|
customFees?: FeeEstimation,
|
|
27
28
|
): Promise<TransactionValidation> => {
|
|
28
29
|
const errors: Record<string, Error> = {};
|
|
@@ -39,7 +40,6 @@ export const validateIntent = async (
|
|
|
39
40
|
warnings.feeTooHigh = new FeeTooHigh();
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
const balances = await getBalance(transactionIntent.sender);
|
|
43
43
|
const nativeBalance = balances.find(b => b.asset.type === "native");
|
|
44
44
|
if (nativeBalance === undefined) {
|
|
45
45
|
throw Error("Shouldn't happen");
|