@ledgerhq/coin-xrp 7.4.0-nightly.4 → 7.4.0-nightly.6

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.4.0-nightly.3 build /home/runner/work/ledger-live/ledger-live/libs/coin-modules/coin-xrp
2
+ > @ledgerhq/coin-xrp@7.4.0-nightly.5 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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @ledgerhq/coin-xrp
2
2
 
3
+ ## 7.4.0-nightly.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`65c128a`](https://github.com/LedgerHQ/ledger-live/commit/65c128a93f07857b421bed3696bc9984f860ada9)]:
8
+ - @ledgerhq/cryptoassets@13.28.0-nightly.3
9
+ - @ledgerhq/coin-framework@6.4.0-nightly.5
10
+
11
+ ## 7.4.0-nightly.5
12
+
13
+ ### Minor Changes
14
+
15
+ - [#11770](https://github.com/LedgerHQ/ledger-live/pull/11770) [`81a2bc9`](https://github.com/LedgerHQ/ledger-live/commit/81a2bc980d25aec3b2445aa2004aa8a72a60cea1) Thanks [@qperrot](https://github.com/qperrot)! - Prevent negative XRP spendable balance
16
+
3
17
  ## 7.4.0-nightly.4
4
18
 
5
19
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.d.ts","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAI7D,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkBpE"}
1
+ {"version":3,"file":"getBalance.d.ts","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAK7D,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAqBpE"}
@@ -1,15 +1,21 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.getBalance = getBalance;
4
7
  const network_1 = require("../network");
5
8
  const common_1 = require("./common");
9
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
6
10
  async function getBalance(address) {
7
11
  const accountInfo = await (0, network_1.getAccountInfo)(address);
8
12
  const serverInfo = await (0, network_1.getServerInfos)();
9
13
  const reserveMinXRP = (0, common_1.parseAPIValue)(serverInfo.info.validated_ledger.reserve_base_xrp.toString());
10
14
  const reservePerTrustline = (0, common_1.parseAPIValue)(serverInfo.info.validated_ledger.reserve_inc_xrp.toString());
11
15
  const trustlines = accountInfo.ownerCount;
12
- const locked = reserveMinXRP.plus(reservePerTrustline.times(trustlines));
16
+ const locked = accountInfo.balance === "0"
17
+ ? new bignumber_js_1.default(0)
18
+ : reserveMinXRP.plus(reservePerTrustline.times(trustlines));
13
19
  return [
14
20
  {
15
21
  value: BigInt(accountInfo.balance),
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.js","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":";;AAIA,gCAkBC;AArBD,wCAA4D;AAC5D,qCAAyC;AAElC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAc,EAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAc,GAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,IAAA,sBAAa,EAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,MAAM,mBAAmB,GAAG,IAAA,sBAAa,EACvC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,QAAQ,EAAE,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAE1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACzE,OAAO;QACL;YACE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAClC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;SAClC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getBalance.js","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":";;;;;AAKA,gCAqBC;AAzBD,wCAA4D;AAC5D,qCAAyC;AACzC,gEAAqC;AAE9B,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAc,EAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAc,GAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,IAAA,sBAAa,EAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,MAAM,mBAAmB,GAAG,IAAA,sBAAa,EACvC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,QAAQ,EAAE,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAE1C,MAAM,MAAM,GACV,WAAW,CAAC,OAAO,KAAK,GAAG;QACzB,CAAC,CAAC,IAAI,sBAAS,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,OAAO;QACL;YACE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAClC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;SAClC;KACF,CAAC;AACJ,CAAC"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const faker_1 = require("@faker-js/faker");
4
4
  const getBalance_1 = require("./getBalance");
5
+ const address = "ACCOUNT_ADDRESS";
5
6
  const mockGetAccountInfo = jest.fn();
6
7
  const mockGetServerInfos = jest.fn();
7
8
  jest.mock("../network", () => ({
@@ -24,9 +25,8 @@ describe("getBalance", () => {
24
25
  });
25
26
  // Given
26
27
  const balance = faker_1.faker.number.bigInt(100_000_000);
27
- const address = "ACCOUNT_ADDRESS";
28
28
  mockGetAccountInfo.mockResolvedValue({
29
- balance,
29
+ balance: balance.toString(),
30
30
  ownerCount: 0,
31
31
  });
32
32
  // When
@@ -37,5 +37,27 @@ describe("getBalance", () => {
37
37
  expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
38
38
  expect(result).toEqual([{ value: balance, asset: { type: "native" }, locked: 23000000n }]);
39
39
  });
40
+ it("returns from account with empty balance", async () => {
41
+ mockGetServerInfos.mockResolvedValue({
42
+ info: {
43
+ validated_ledger: {
44
+ reserve_base_xrp: 23,
45
+ reserve_inc_xrp: 5,
46
+ },
47
+ },
48
+ });
49
+ // Given
50
+ mockGetAccountInfo.mockResolvedValue({
51
+ balance: "0",
52
+ ownerCount: 0,
53
+ });
54
+ // When
55
+ const result = await (0, getBalance_1.getBalance)(address);
56
+ // Then
57
+ expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
58
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
59
+ expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
60
+ expect(result).toEqual([{ value: 0n, asset: { type: "native" }, locked: 0n }]);
61
+ });
40
62
  });
41
63
  //# sourceMappingURL=getBalance.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.test.js","sourceRoot":"","sources":["../../src/logic/getBalance.test.ts"],"names":[],"mappings":";;AAAA,2CAAwC;AACxC,6CAA0C;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACrC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;IAChE,cAAc,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;CAC3C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,CAAC,SAAS,EAAE,CAAC;QAC/B,kBAAkB,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,kBAAkB,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE;gBACJ,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,EAAE;oBACpB,eAAe,EAAE,CAAC;iBACnB;aACF;SACF,CAAC,CAAC;QACH,QAAQ;QACR,MAAM,OAAO,GAAG,aAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,iBAAiB,CAAC;QAClC,kBAAkB,CAAC,iBAAiB,CAAC;YACnC,OAAO;YACP,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC;QAEzC,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"getBalance.test.js","sourceRoot":"","sources":["../../src/logic/getBalance.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.d.ts","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAI7D,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkBpE"}
1
+ {"version":3,"file":"getBalance.d.ts","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAK7D,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAqBpE"}
@@ -1,12 +1,15 @@
1
1
  import { getAccountInfo, getServerInfos } from "../network";
2
2
  import { parseAPIValue } from "./common";
3
+ import BigNumber from "bignumber.js";
3
4
  export async function getBalance(address) {
4
5
  const accountInfo = await getAccountInfo(address);
5
6
  const serverInfo = await getServerInfos();
6
7
  const reserveMinXRP = parseAPIValue(serverInfo.info.validated_ledger.reserve_base_xrp.toString());
7
8
  const reservePerTrustline = parseAPIValue(serverInfo.info.validated_ledger.reserve_inc_xrp.toString());
8
9
  const trustlines = accountInfo.ownerCount;
9
- const locked = reserveMinXRP.plus(reservePerTrustline.times(trustlines));
10
+ const locked = accountInfo.balance === "0"
11
+ ? new BigNumber(0)
12
+ : reserveMinXRP.plus(reservePerTrustline.times(trustlines));
10
13
  return [
11
14
  {
12
15
  value: BigInt(accountInfo.balance),
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.js","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,MAAM,mBAAmB,GAAG,aAAa,CACvC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,QAAQ,EAAE,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAE1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACzE,OAAO;QACL;YACE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAClC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;SAClC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getBalance.js","sourceRoot":"","sources":["../../src/logic/getBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,MAAM,mBAAmB,GAAG,aAAa,CACvC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,QAAQ,EAAE,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;IAE1C,MAAM,MAAM,GACV,WAAW,CAAC,OAAO,KAAK,GAAG;QACzB,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,OAAO;QACL;YACE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAClC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;SAClC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { faker } from "@faker-js/faker";
2
2
  import { getBalance } from "./getBalance";
3
+ const address = "ACCOUNT_ADDRESS";
3
4
  const mockGetAccountInfo = jest.fn();
4
5
  const mockGetServerInfos = jest.fn();
5
6
  jest.mock("../network", () => ({
@@ -22,9 +23,8 @@ describe("getBalance", () => {
22
23
  });
23
24
  // Given
24
25
  const balance = faker.number.bigInt(100_000_000);
25
- const address = "ACCOUNT_ADDRESS";
26
26
  mockGetAccountInfo.mockResolvedValue({
27
- balance,
27
+ balance: balance.toString(),
28
28
  ownerCount: 0,
29
29
  });
30
30
  // When
@@ -35,5 +35,27 @@ describe("getBalance", () => {
35
35
  expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
36
36
  expect(result).toEqual([{ value: balance, asset: { type: "native" }, locked: 23000000n }]);
37
37
  });
38
+ it("returns from account with empty balance", async () => {
39
+ mockGetServerInfos.mockResolvedValue({
40
+ info: {
41
+ validated_ledger: {
42
+ reserve_base_xrp: 23,
43
+ reserve_inc_xrp: 5,
44
+ },
45
+ },
46
+ });
47
+ // Given
48
+ mockGetAccountInfo.mockResolvedValue({
49
+ balance: "0",
50
+ ownerCount: 0,
51
+ });
52
+ // When
53
+ const result = await getBalance(address);
54
+ // Then
55
+ expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
56
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
57
+ expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
58
+ expect(result).toEqual([{ value: 0n, asset: { type: "native" }, locked: 0n }]);
59
+ });
38
60
  });
39
61
  //# sourceMappingURL=getBalance.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getBalance.test.js","sourceRoot":"","sources":["../../src/logic/getBalance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACrC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;IAChE,cAAc,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;CAC3C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,CAAC,SAAS,EAAE,CAAC;QAC/B,kBAAkB,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,kBAAkB,CAAC,iBAAiB,CAAC;YACnC,IAAI,EAAE;gBACJ,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,EAAE;oBACpB,eAAe,EAAE,CAAC;iBACnB;aACF;SACF,CAAC,CAAC;QACH,QAAQ;QACR,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,iBAAiB,CAAC;QAClC,kBAAkB,CAAC,iBAAiB,CAAC;YACnC,OAAO;YACP,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO;QACP,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"getBalance.test.js","sourceRoot":"","sources":["../../src/logic/getBalance.test.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.4.0-nightly.4",
3
+ "version": "7.4.0-nightly.6",
4
4
  "description": "Ledger XRP Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -103,12 +103,12 @@
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.4.0-nightly.4",
107
- "@ledgerhq/cryptoassets": "^13.28.0-nightly.2",
106
+ "@ledgerhq/coin-framework": "^6.4.0-nightly.5",
107
+ "@ledgerhq/cryptoassets": "^13.28.0-nightly.3",
108
108
  "@ledgerhq/devices": "8.5.1",
109
109
  "@ledgerhq/errors": "^6.25.0",
110
- "@ledgerhq/types-live": "^6.84.0-nightly.1",
111
110
  "@ledgerhq/live-network": "^2.0.17-nightly.1",
111
+ "@ledgerhq/types-live": "^6.84.0-nightly.1",
112
112
  "@ledgerhq/logs": "^6.13.0"
113
113
  },
114
114
  "devDependencies": {
@@ -1,6 +1,7 @@
1
1
  import { faker } from "@faker-js/faker";
2
2
  import { getBalance } from "./getBalance";
3
3
 
4
+ const address = "ACCOUNT_ADDRESS";
4
5
  const mockGetAccountInfo = jest.fn();
5
6
  const mockGetServerInfos = jest.fn();
6
7
  jest.mock("../network", () => ({
@@ -25,9 +26,8 @@ describe("getBalance", () => {
25
26
  });
26
27
  // Given
27
28
  const balance = faker.number.bigInt(100_000_000);
28
- const address = "ACCOUNT_ADDRESS";
29
29
  mockGetAccountInfo.mockResolvedValue({
30
- balance,
30
+ balance: balance.toString(),
31
31
  ownerCount: 0,
32
32
  });
33
33
 
@@ -40,4 +40,28 @@ describe("getBalance", () => {
40
40
  expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
41
41
  expect(result).toEqual([{ value: balance, asset: { type: "native" }, locked: 23000000n }]);
42
42
  });
43
+
44
+ it("returns from account with empty balance", async () => {
45
+ mockGetServerInfos.mockResolvedValue({
46
+ info: {
47
+ validated_ledger: {
48
+ reserve_base_xrp: 23,
49
+ reserve_inc_xrp: 5,
50
+ },
51
+ },
52
+ });
53
+ // Given
54
+ mockGetAccountInfo.mockResolvedValue({
55
+ balance: "0",
56
+ ownerCount: 0,
57
+ });
58
+
59
+ // When
60
+ const result = await getBalance(address);
61
+ // Then
62
+ expect(mockGetAccountInfo).toHaveBeenCalledTimes(1);
63
+ expect(mockGetServerInfos).toHaveBeenCalledTimes(1);
64
+ expect(mockGetAccountInfo.mock.lastCall[0]).toEqual(address);
65
+ expect(result).toEqual([{ value: 0n, asset: { type: "native" }, locked: 0n }]);
66
+ });
43
67
  });
@@ -1,6 +1,7 @@
1
1
  import { Balance } from "@ledgerhq/coin-framework/api/types";
2
2
  import { getAccountInfo, getServerInfos } from "../network";
3
3
  import { parseAPIValue } from "./common";
4
+ import BigNumber from "bignumber.js";
4
5
 
5
6
  export async function getBalance(address: string): Promise<Balance[]> {
6
7
  const accountInfo = await getAccountInfo(address);
@@ -12,7 +13,10 @@ export async function getBalance(address: string): Promise<Balance[]> {
12
13
  );
13
14
  const trustlines = accountInfo.ownerCount;
14
15
 
15
- const locked = reserveMinXRP.plus(reservePerTrustline.times(trustlines));
16
+ const locked =
17
+ accountInfo.balance === "0"
18
+ ? new BigNumber(0)
19
+ : reserveMinXRP.plus(reservePerTrustline.times(trustlines));
16
20
  return [
17
21
  {
18
22
  value: BigInt(accountInfo.balance),