@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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @ledgerhq/coin-xrp@7.10.1 build /home/runner/work/ledger-live/ledger-live/libs/coin-modules/coin-xrp
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
 
@@ -16,9 +16,6 @@
16
16
  "**/*.test.{js,jsx,ts,tsx}"
17
17
  ],
18
18
  "ignoreUnresolved": [
19
- "@jest/expect-utils",
20
- "@jest/get-type",
21
- "jest-util",
22
19
  "jest-get-type",
23
20
  "jest-matcher-utils",
24
21
  "jest-message-util"
package/CHANGELOG.md CHANGED
@@ -1,21 +1,41 @@
1
1
  # @ledgerhq/coin-xrp
2
2
 
3
- ## 7.11.0-nightly.20260110024039
3
+ ## 7.11.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - [#13396](https://github.com/LedgerHQ/ledger-live/pull/13396) [`b9a3e43`](https://github.com/LedgerHQ/ledger-live/commit/b9a3e431be33943ab4feb4294d6a7f27b966e61b) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Update Jest to v30
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), [`537a975`](https://github.com/LedgerHQ/ledger-live/commit/537a975536ca3669d3b88371e1e1f651c4cb9a1b), [`cbcae7c`](https://github.com/LedgerHQ/ledger-live/commit/cbcae7c0ba9b54b1167d26e4227bd2b847207cb9), [`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), [`cf08174`](https://github.com/LedgerHQ/ledger-live/commit/cf0817462e9f0210fceff29ec60b0699e4e69b71), [`b9a3e43`](https://github.com/LedgerHQ/ledger-live/commit/b9a3e431be33943ab4feb4294d6a7f27b966e61b), [`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), [`7f05536`](https://github.com/LedgerHQ/ledger-live/commit/7f0553665e9c8721f263825cc79994bfc6729d9b)]:
12
- - @ledgerhq/cryptoassets@13.36.0-nightly.20260110024039
13
- - @ledgerhq/coin-framework@6.12.0-nightly.20260110024039
14
- - @ledgerhq/types-live@6.92.0-nightly.20260110024039
15
- - @ledgerhq/devices@8.9.0-nightly.20260110024039
16
- - @ledgerhq/errors@6.29.0-nightly.20260110024039
17
- - @ledgerhq/logs@6.14.0-nightly.20260110024039
18
- - @ledgerhq/live-network@2.2.0-nightly.20260110024039
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: [
@@ -1,18 +1,9 @@
1
- /** @type {import('jest').Config} */
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,EACd,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAKtC,eAAO,MAAM,cAAc,sBACN,iBAAiB,CAAC,UAAU,CAAC,eACnC,aAAa,KACzB,OAAO,CAAC,qBAAqB,CAsE/B,CAAC"}
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 getBalance_1 = require("./getBalance");
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":"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"}
1
+ {"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/logic/validateIntent.ts"],"names":[],"mappings":";;;AAAA,6CAS0B;AAC1B,+DAA6D;AAC7D,qEAA+E;AAO/E,wCAA4C;AAE5C,mCAA+C;AAC/C,qCAAyC;AAElC,MAAM,cAAc,GAAG,KAAK,EACjC,iBAAgD,EAChD,QAAmB,EACnB,UAA0B,EACM,EAAE;IAClC,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAc,GAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAA,sBAAa,EAClC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAC9D,CAAC;IACF,MAAM,aAAa,GAAG,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,GAAG,aAAa,CAAC;IAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAExC,IAAI,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;QAC/C,QAAQ,CAAC,UAAU,GAAG,IAAI,mBAAU,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACpE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,GAAG,IAAI,qBAAY,EAAE,CAAC;IAClC,CAAC;SAAM,IAAI,UAAU,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;QAChF,MAAM,CAAC,MAAM,GAAG,IAAI,kCAAyB,CAAC,EAAE,EAAE;YAChD,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI;gBACzC,CAAC,CAAC,IAAA,0BAAkB,EAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;oBAC/D,eAAe,EAAE,IAAI;oBACrB,WAAW,EAAE,KAAK;oBAClB,QAAQ,EAAE,IAAI;iBACf,CAAC;gBACJ,CAAC,CAAC,cAAc;SACnB,CAAC,CAAC;IACL,CAAC;SAAM,IACL,iBAAiB,CAAC,SAAS;QAC3B,CAAC,MAAM,IAAA,4BAAoB,EAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzD,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,EAC5D,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,IAAI,qDAA4C,CAAC,EAAE,EAAE;YACnE,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI;gBACzC,CAAC,CAAC,IAAA,0BAAkB,EAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE;oBAC/D,eAAe,EAAE,IAAI;oBACrB,WAAW,EAAE,KAAK;oBAClB,QAAQ,EAAE,IAAI;iBACf,CAAC;gBACJ,CAAC,CAAC,cAAc;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,GAAG,IAAI,0BAAiB,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,iBAAiB,CAAC,MAAM,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;QACpE,MAAM,CAAC,SAAS,GAAG,IAAI,qDAA4C,EAAE,CAAC;IACxE,CAAC;SAAM,IAAI,CAAC,IAAA,4CAAqB,EAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,SAAS,GAAG,IAAI,uBAAc,CAAC,EAAE,EAAE;YACxC,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,GAAG,IAAI,uBAAc,EAAE,CAAC;IACvC,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;QACR,aAAa;QACb,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AAzEW,QAAA,cAAc,kBAyEzB"}
@@ -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,EACd,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAKtC,eAAO,MAAM,cAAc,sBACN,iBAAiB,CAAC,UAAU,CAAC,eACnC,aAAa,KACzB,OAAO,CAAC,qBAAqB,CAsE/B,CAAC"}
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
- import { getBalance } from "./getBalance";
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":"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"}
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-nightly.20260110024039",
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-nightly.20260110024039",
107
- "@ledgerhq/cryptoassets": "^13.36.0-nightly.20260110024039",
108
- "@ledgerhq/devices": "8.9.0-nightly.20260110024039",
109
- "@ledgerhq/errors": "^6.29.0-nightly.20260110024039",
110
- "@ledgerhq/live-network": "^2.2.0-nightly.20260110024039",
111
- "@ledgerhq/types-live": "^6.92.0-nightly.20260110024039",
112
- "@ledgerhq/logs": "^6.14.0-nightly.20260110024039"
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": "30.0.0",
117
+ "@types/jest": "^29.5.12",
118
118
  "dotenv": "^16.4.5",
119
- "expect": "30.2.0",
120
- "jest": "30.2.0",
119
+ "expect": "^27.4.6",
120
+ "jest": "^29.7.0",
121
121
  "ripple-keypairs": "^2.0.0",
122
- "@swc/jest": "0.2.39",
123
- "@swc/core": "1.15.8",
122
+ "ts-jest": "^29.1.1",
124
123
  "typescript": "^5.4.5",
125
- "@ledgerhq/types-cryptoassets": "^7.32.0-nightly.20260110024039",
126
- "@ledgerhq/disable-network-setup": "^0.2.0-nightly.20260110024039"
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 --passWithNoTests",
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"
@@ -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
- beforeAll(() => {
288
- mockCraftTransaction.mockImplementation((_address, _transaction, _publicKey) => {
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
- mockGetNextValidSequence.mockImplementation(_address => Promise.resolve(0));
280
+ beforeAll(() => {
281
+ jest
282
+ .spyOn(LogicFunctions, "getNextValidSequence")
283
+ .mockImplementation(_address => Promise.resolve(0));
293
284
 
294
- mockEstimateFees.mockImplementation(_networkInfo => {
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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(mockCraftTransaction).toHaveBeenCalledWith(
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.mock("./utils", () => ({
18
- ...jest.requireActual("./utils"),
19
- cachedRecipientIsNew: jest.fn((addr: string) => {
20
- if (addr === RECIPIENT_NEW) {
21
- return Promise.resolve(true);
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");