@ledgerhq/coin-canton 0.9.0-nightly.3 → 0.9.0-nightly.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.unimportedrc.json +2 -1
  3. package/CHANGELOG.md +29 -0
  4. package/lib/bridge/estimateMaxSpendable.d.ts +2 -2
  5. package/lib/bridge/estimateMaxSpendable.d.ts.map +1 -1
  6. package/lib/bridge/estimateMaxSpendable.js +2 -3
  7. package/lib/bridge/estimateMaxSpendable.js.map +1 -1
  8. package/lib/bridge/getTransactionStatus.d.ts +5 -3
  9. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  10. package/lib/bridge/getTransactionStatus.js +26 -5
  11. package/lib/bridge/getTransactionStatus.js.map +1 -1
  12. package/lib/bridge/index.d.ts +2 -2
  13. package/lib/bridge/index.d.ts.map +1 -1
  14. package/lib/bridge/index.js +3 -3
  15. package/lib/bridge/index.js.map +1 -1
  16. package/lib/bridge/prepareTransaction.js +1 -1
  17. package/lib/bridge/prepareTransaction.js.map +1 -1
  18. package/lib/bridge/serialization.d.ts +4 -0
  19. package/lib/bridge/serialization.d.ts.map +1 -0
  20. package/lib/bridge/serialization.js +36 -0
  21. package/lib/bridge/serialization.js.map +1 -0
  22. package/lib/bridge/sync.d.ts.map +1 -1
  23. package/lib/bridge/sync.js +13 -5
  24. package/lib/bridge/sync.js.map +1 -1
  25. package/lib/bridge/transaction.js +1 -1
  26. package/lib/bridge/transaction.js.map +1 -1
  27. package/lib/common-logic/account/getBalance.d.ts +5 -1
  28. package/lib/common-logic/account/getBalance.d.ts.map +1 -1
  29. package/lib/common-logic/account/getBalance.js +2 -0
  30. package/lib/common-logic/account/getBalance.js.map +1 -1
  31. package/lib/common-logic/transaction/craftTransaction.js +1 -1
  32. package/lib/common-logic/transaction/craftTransaction.js.map +1 -1
  33. package/lib/network/gateway.d.ts +1 -0
  34. package/lib/network/gateway.d.ts.map +1 -1
  35. package/lib/network/gateway.js.map +1 -1
  36. package/lib/test/fixtures.d.ts +5 -0
  37. package/lib/test/fixtures.d.ts.map +1 -0
  38. package/lib/test/fixtures.js +57 -0
  39. package/lib/test/fixtures.js.map +1 -0
  40. package/lib/types/bridge.d.ts +14 -2
  41. package/lib/types/bridge.d.ts.map +1 -1
  42. package/lib/types/errors.d.ts +6 -0
  43. package/lib/types/errors.d.ts.map +1 -1
  44. package/lib/types/errors.js +3 -1
  45. package/lib/types/errors.js.map +1 -1
  46. package/lib/types/index.d.ts +1 -0
  47. package/lib/types/index.d.ts.map +1 -1
  48. package/lib/types/index.js +1 -0
  49. package/lib/types/index.js.map +1 -1
  50. package/lib-es/bridge/estimateMaxSpendable.d.ts +2 -2
  51. package/lib-es/bridge/estimateMaxSpendable.d.ts.map +1 -1
  52. package/lib-es/bridge/estimateMaxSpendable.js +2 -3
  53. package/lib-es/bridge/estimateMaxSpendable.js.map +1 -1
  54. package/lib-es/bridge/getTransactionStatus.d.ts +5 -3
  55. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  56. package/lib-es/bridge/getTransactionStatus.js +26 -5
  57. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  58. package/lib-es/bridge/index.d.ts +2 -2
  59. package/lib-es/bridge/index.d.ts.map +1 -1
  60. package/lib-es/bridge/index.js +3 -3
  61. package/lib-es/bridge/index.js.map +1 -1
  62. package/lib-es/bridge/prepareTransaction.js +1 -1
  63. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  64. package/lib-es/bridge/serialization.d.ts +4 -0
  65. package/lib-es/bridge/serialization.d.ts.map +1 -0
  66. package/lib-es/bridge/serialization.js +32 -0
  67. package/lib-es/bridge/serialization.js.map +1 -0
  68. package/lib-es/bridge/sync.d.ts.map +1 -1
  69. package/lib-es/bridge/sync.js +13 -5
  70. package/lib-es/bridge/sync.js.map +1 -1
  71. package/lib-es/bridge/transaction.js +1 -1
  72. package/lib-es/bridge/transaction.js.map +1 -1
  73. package/lib-es/common-logic/account/getBalance.d.ts +5 -1
  74. package/lib-es/common-logic/account/getBalance.d.ts.map +1 -1
  75. package/lib-es/common-logic/account/getBalance.js +2 -0
  76. package/lib-es/common-logic/account/getBalance.js.map +1 -1
  77. package/lib-es/common-logic/transaction/craftTransaction.js +1 -1
  78. package/lib-es/common-logic/transaction/craftTransaction.js.map +1 -1
  79. package/lib-es/network/gateway.d.ts +1 -0
  80. package/lib-es/network/gateway.d.ts.map +1 -1
  81. package/lib-es/network/gateway.js.map +1 -1
  82. package/lib-es/test/fixtures.d.ts +5 -0
  83. package/lib-es/test/fixtures.d.ts.map +1 -0
  84. package/lib-es/test/fixtures.js +49 -0
  85. package/lib-es/test/fixtures.js.map +1 -0
  86. package/lib-es/types/bridge.d.ts +14 -2
  87. package/lib-es/types/bridge.d.ts.map +1 -1
  88. package/lib-es/types/errors.d.ts +6 -0
  89. package/lib-es/types/errors.d.ts.map +1 -1
  90. package/lib-es/types/errors.js +2 -0
  91. package/lib-es/types/errors.js.map +1 -1
  92. package/lib-es/types/index.d.ts +1 -0
  93. package/lib-es/types/index.d.ts.map +1 -1
  94. package/lib-es/types/index.js +1 -0
  95. package/lib-es/types/index.js.map +1 -1
  96. package/package.json +7 -7
  97. package/src/bridge/estimateMaxSpendable.ts +6 -8
  98. package/src/bridge/getTransactionStatus.test.ts +84 -146
  99. package/src/bridge/getTransactionStatus.ts +42 -7
  100. package/src/bridge/index.ts +6 -5
  101. package/src/bridge/onboard.integ.test.ts +8 -31
  102. package/src/bridge/prepareTransaction.ts +1 -1
  103. package/src/bridge/serialization.ts +44 -0
  104. package/src/bridge/signOperation.test.ts +3 -9
  105. package/src/bridge/sync.test.ts +4 -0
  106. package/src/bridge/sync.ts +17 -6
  107. package/src/bridge/transaction.ts +1 -1
  108. package/src/common-logic/account/getBalance.ts +12 -2
  109. package/src/common-logic/account/getBalance.unit.test.ts +7 -1
  110. package/src/common-logic/transaction/craftTransaction.ts +1 -1
  111. package/src/network/gateway.ts +1 -0
  112. package/src/test/fixtures.ts +53 -0
  113. package/src/types/bridge.ts +15 -2
  114. package/src/types/errors.ts +3 -0
  115. package/src/types/index.ts +1 -0
@@ -4,7 +4,8 @@ import { encodeAccountId } from "@ledgerhq/coin-framework/account/index";
4
4
  import { GetAccountShape, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
5
5
  import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
6
6
  import { SignerContext } from "@ledgerhq/coin-framework/signer";
7
- import { getBalance, getLedgerEnd, getOperations, type OperationInfo } from "../network/gateway";
7
+ import { getLedgerEnd, getOperations, type OperationInfo } from "../network/gateway";
8
+ import { getBalance, type CantonBalance } from "../common-logic/account/getBalance";
8
9
  import coinConfig from "../config";
9
10
  import resolver from "../signer";
10
11
  import { CantonAccount, CantonSigner } from "../types";
@@ -108,19 +109,26 @@ export function makeGetAccountShape(
108
109
  const balances = xpubOrAddress ? await getBalance(currency, xpubOrAddress) : [];
109
110
 
110
111
  const balancesData = (balances || []).reduce(
111
- (acc, { amount, instrument_id, locked }) => {
112
- acc[instrument_id] = { amount, locked };
112
+ (acc, balance) => {
113
+ acc[balance.instrumentId] = balance;
113
114
  return acc;
114
115
  },
115
- {} as Record<string, { amount: string; locked: boolean }>,
116
+ {} as Record<string, CantonBalance>,
116
117
  );
117
118
 
118
- const unlockedAmount = new BigNumber(balancesData[nativeInstrumentId]?.amount || "0");
119
- const lockedAmount = new BigNumber(balancesData[`Locked${nativeInstrumentId}`]?.amount || "0");
119
+ const unlockedAmount = new BigNumber(balancesData[nativeInstrumentId]?.value.toString() || "0");
120
+ const lockedAmount = new BigNumber(
121
+ balancesData[`Locked${nativeInstrumentId}`]?.value.toString() || "0",
122
+ );
120
123
  const totalBalance = unlockedAmount.plus(lockedAmount);
121
124
  const reserveMin = new BigNumber(coinConfig.getCoinConfig(currency).minReserve || 0);
122
125
  const spendableBalance = BigNumber.max(0, unlockedAmount.minus(reserveMin));
123
126
 
127
+ const instrumentUtxoCounts: Record<string, number> = {};
128
+ for (const [instrumentId, balance] of Object.entries(balancesData)) {
129
+ instrumentUtxoCounts[instrumentId] = balance.utxoCount;
130
+ }
131
+
124
132
  let operations: Operation[] = [];
125
133
  if (xpubOrAddress) {
126
134
  const oldOperations = initialAccount?.operations || [];
@@ -159,6 +167,9 @@ export function makeGetAccountShape(
159
167
  spendableBalance,
160
168
  xpub: xpubOrAddress,
161
169
  used,
170
+ cantonResources: {
171
+ instrumentUtxoCounts,
172
+ },
162
173
  };
163
174
 
164
175
  return shape;
@@ -48,7 +48,7 @@ export const toTransactionRaw = (t: Transaction): TransactionRaw => {
48
48
  return {
49
49
  ...common,
50
50
  family: t.family,
51
- fee: t.fee ? t.fee.toString() : null,
51
+ fee: t.fee ? t.fee.toFixed() : null,
52
52
  tokenId: t.tokenId,
53
53
  };
54
54
  };
@@ -3,12 +3,17 @@ import { getBalance as gatewayGetBalance, type InstrumentBalance } from "../../n
3
3
  import coinConfig from "../../config";
4
4
  import { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
5
5
 
6
+ export type CantonBalance = Balance & {
7
+ utxoCount: number;
8
+ instrumentId: string;
9
+ };
10
+
6
11
  const useGateway = (currency: CryptoCurrency) =>
7
12
  coinConfig.getCoinConfig(currency).useGateway === true;
8
13
  const getNativeId = (currency: CryptoCurrency) =>
9
14
  coinConfig.getCoinConfig(currency).nativeInstrumentId;
10
15
 
11
- function adaptInstrument(currency: CryptoCurrency, instrument: InstrumentBalance): Balance {
16
+ function adaptInstrument(currency: CryptoCurrency, instrument: InstrumentBalance): CantonBalance {
12
17
  return {
13
18
  value: BigInt(instrument.amount),
14
19
  locked: instrument.locked === true ? BigInt(instrument.amount) : BigInt(0),
@@ -16,10 +21,15 @@ function adaptInstrument(currency: CryptoCurrency, instrument: InstrumentBalance
16
21
  getNativeId(currency) === instrument.instrument_id
17
22
  ? { type: "native" }
18
23
  : { type: "token", assetReference: instrument.instrument_id },
24
+ utxoCount: instrument.utxo_count,
25
+ instrumentId: instrument.instrument_id,
19
26
  };
20
27
  }
21
28
 
22
- export async function getBalance(currency: CryptoCurrency, partyId: string): Promise<Balance[]> {
29
+ export async function getBalance(
30
+ currency: CryptoCurrency,
31
+ partyId: string,
32
+ ): Promise<CantonBalance[]> {
23
33
  if (useGateway(currency))
24
34
  return (await gatewayGetBalance(currency, partyId)).map(instrument =>
25
35
  adaptInstrument(currency, instrument),
@@ -29,11 +29,13 @@ describe("getBalance", () => {
29
29
  {
30
30
  instrument_id: "native-id",
31
31
  amount: "1000",
32
+ utxo_count: 1,
32
33
  locked: false,
33
34
  },
34
35
  {
35
36
  instrument_id: "token-123",
36
37
  amount: "5000",
38
+ utxo_count: 1,
37
39
  locked: true,
38
40
  },
39
41
  ];
@@ -43,16 +45,20 @@ describe("getBalance", () => {
43
45
  const result = await getBalance(mockCurrency, "party-id");
44
46
 
45
47
  expect(getBalanceFromNetwork).toHaveBeenCalledWith(mockCurrency, "party-id");
46
- expect(result).toEqual<Balance[]>([
48
+ expect(result).toEqual([
47
49
  {
48
50
  value: BigInt(1000),
49
51
  locked: BigInt(0),
50
52
  asset: { type: "native" },
53
+ utxoCount: 1,
54
+ instrumentId: "native-id",
51
55
  },
52
56
  {
53
57
  value: BigInt(5000),
54
58
  locked: BigInt(5000),
55
59
  asset: { type: "token", assetReference: "token-123" },
60
+ utxoCount: 1,
61
+ instrumentId: "token-123",
56
62
  },
57
63
  ]);
58
64
  });
@@ -27,7 +27,7 @@ export async function craftTransaction(
27
27
  }> {
28
28
  const params: PrepareTransferRequest = {
29
29
  recipient: transaction.recipient || "",
30
- amount: transaction.amount.toString(),
30
+ amount: transaction.amount.toFixed(),
31
31
  type: "token-transfer-request" as const,
32
32
  execute_before_secs: transaction.expireInSeconds,
33
33
  instrument_id: transaction.tokenId,
@@ -91,6 +91,7 @@ export type InstrumentBalance = {
91
91
  instrument_id: string;
92
92
  amount: string;
93
93
  locked: boolean;
94
+ utxo_count: number;
94
95
  };
95
96
 
96
97
  type PartyInfo = {
@@ -0,0 +1,53 @@
1
+ import BigNumber from "bignumber.js";
2
+ import { Account } from "@ledgerhq/types-live";
3
+ import { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
4
+ import { getDerivationScheme, runDerivationScheme } from "@ledgerhq/coin-framework/derivation";
5
+ import { createEmptyHistoryCache } from "@ledgerhq/coin-framework/account";
6
+
7
+ export const createMockCantonCurrency = (): CryptoCurrency => {
8
+ const mockCurrency = {
9
+ id: "canton_network",
10
+ name: "Canton",
11
+ type: "CryptoCurrency",
12
+ family: "canton",
13
+ units: [{ name: "Canton", code: "CANTON", magnitude: 38 }],
14
+ ticker: "CANTON",
15
+ scheme: "canton",
16
+ color: "#000000",
17
+ managerAppName: "Canton",
18
+ coinType: 6767,
19
+ explorerViews: [],
20
+ } satisfies CryptoCurrency;
21
+ return mockCurrency;
22
+ };
23
+
24
+ export const createMockAccount = (overrides: Partial<Account> = {}): Account => {
25
+ const currency = createMockCantonCurrency();
26
+ const derivationMode = "canton" as const;
27
+ const scheme = getDerivationScheme({ derivationMode, currency });
28
+ const freshAddressPath = runDerivationScheme(scheme, currency, { account: 0 });
29
+
30
+ return {
31
+ id: "js:2:canton_network:test-address:canton",
32
+ type: "Account",
33
+ used: true,
34
+ currency,
35
+ derivationMode,
36
+ index: 0,
37
+ freshAddress: "test_address",
38
+ freshAddressPath,
39
+ creationDate: new Date(),
40
+ lastSyncDate: new Date(),
41
+ balance: new BigNumber(0),
42
+ spendableBalance: new BigNumber(0),
43
+ seedIdentifier: "test_seed",
44
+ blockHeight: 0,
45
+ operationsCount: 0,
46
+ operations: [],
47
+ pendingOperations: [],
48
+ balanceHistoryCache: createEmptyHistoryCache(),
49
+ swapHistory: [],
50
+ subAccounts: [],
51
+ ...overrides,
52
+ };
53
+ };
@@ -48,6 +48,7 @@ export type Transaction = TransactionCommon & {
48
48
  fee: BigNumber | null | undefined;
49
49
  memo?: string;
50
50
  tokenId: string;
51
+ expireInSeconds?: number;
51
52
  };
52
53
 
53
54
  export type TransactionRaw = TransactionCommonRaw & {
@@ -55,10 +56,22 @@ export type TransactionRaw = TransactionCommonRaw & {
55
56
  fee: string | null | undefined;
56
57
  memo?: string;
57
58
  tokenId: string;
59
+ expireInSeconds?: number;
58
60
  };
59
61
 
60
62
  export type TransactionStatus = TransactionStatusCommon;
61
63
  export type TransactionStatusRaw = TransactionStatusCommonRaw;
62
64
 
63
- export type CantonAccount = Account;
64
- export type CantonAccountRaw = AccountRaw;
65
+ export type CantonResources = {
66
+ instrumentUtxoCounts: Record<string, number>;
67
+ };
68
+ export type CantonResourcesRaw = {
69
+ instrumentUtxoCounts: Record<string, number>;
70
+ };
71
+
72
+ export type CantonAccount = Account & {
73
+ cantonResources: CantonResources;
74
+ };
75
+ export type CantonAccountRaw = AccountRaw & {
76
+ cantonResources: CantonResourcesRaw;
77
+ };
@@ -1,3 +1,6 @@
1
1
  import { createCustomErrorClass } from "@ledgerhq/errors";
2
2
 
3
3
  export const SimulationError = createCustomErrorClass("SimulationError");
4
+
5
+ export const TooManyUtxosCritical = createCustomErrorClass("TooManyUtxosCritical");
6
+ export const TooManyUtxosWarning = createCustomErrorClass("TooManyUtxosWarning");
@@ -1,3 +1,4 @@
1
1
  export * from "./bridge";
2
+ export * from "./errors";
2
3
  export * from "./onboard";
3
4
  export * from "./signer";