@ledgerhq/coin-canton 0.12.0-nightly.20251211024123 → 0.12.0-nightly.20251213023821

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 (94) hide show
  1. package/CHANGELOG.md +15 -9
  2. package/lib/bridge/buildSubAccounts.d.ts +23 -0
  3. package/lib/bridge/buildSubAccounts.d.ts.map +1 -0
  4. package/lib/bridge/buildSubAccounts.js +80 -0
  5. package/lib/bridge/buildSubAccounts.js.map +1 -0
  6. package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
  7. package/lib/bridge/getTransactionStatus.js +45 -24
  8. package/lib/bridge/getTransactionStatus.js.map +1 -1
  9. package/lib/bridge/index.d.ts.map +1 -1
  10. package/lib/bridge/index.js +2 -0
  11. package/lib/bridge/index.js.map +1 -1
  12. package/lib/bridge/prepareTransaction.d.ts.map +1 -1
  13. package/lib/bridge/prepareTransaction.js +19 -3
  14. package/lib/bridge/prepareTransaction.js.map +1 -1
  15. package/lib/bridge/signOperation.d.ts.map +1 -1
  16. package/lib/bridge/signOperation.js +3 -0
  17. package/lib/bridge/signOperation.js.map +1 -1
  18. package/lib/bridge/sync.d.ts +3 -0
  19. package/lib/bridge/sync.d.ts.map +1 -1
  20. package/lib/bridge/sync.js +115 -19
  21. package/lib/bridge/sync.js.map +1 -1
  22. package/lib/bridge/validateAddress.d.ts +3 -0
  23. package/lib/bridge/validateAddress.d.ts.map +1 -0
  24. package/lib/bridge/validateAddress.js +8 -0
  25. package/lib/bridge/validateAddress.js.map +1 -0
  26. package/lib/common-logic/account/getBalance.d.ts +1 -0
  27. package/lib/common-logic/account/getBalance.d.ts.map +1 -1
  28. package/lib/common-logic/account/getBalance.js +1 -0
  29. package/lib/common-logic/account/getBalance.js.map +1 -1
  30. package/lib/common-logic/transaction/craftTransaction.d.ts +1 -0
  31. package/lib/common-logic/transaction/craftTransaction.d.ts.map +1 -1
  32. package/lib/common-logic/transaction/craftTransaction.js +3 -0
  33. package/lib/common-logic/transaction/craftTransaction.js.map +1 -1
  34. package/lib/network/gateway.d.ts +30 -12
  35. package/lib/network/gateway.d.ts.map +1 -1
  36. package/lib/network/gateway.js +44 -1
  37. package/lib/network/gateway.js.map +1 -1
  38. package/lib/types/bridge.d.ts +2 -0
  39. package/lib/types/bridge.d.ts.map +1 -1
  40. package/lib-es/bridge/buildSubAccounts.d.ts +23 -0
  41. package/lib-es/bridge/buildSubAccounts.d.ts.map +1 -0
  42. package/lib-es/bridge/buildSubAccounts.js +74 -0
  43. package/lib-es/bridge/buildSubAccounts.js.map +1 -0
  44. package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
  45. package/lib-es/bridge/getTransactionStatus.js +46 -25
  46. package/lib-es/bridge/getTransactionStatus.js.map +1 -1
  47. package/lib-es/bridge/index.d.ts.map +1 -1
  48. package/lib-es/bridge/index.js +2 -0
  49. package/lib-es/bridge/index.js.map +1 -1
  50. package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
  51. package/lib-es/bridge/prepareTransaction.js +19 -3
  52. package/lib-es/bridge/prepareTransaction.js.map +1 -1
  53. package/lib-es/bridge/signOperation.d.ts.map +1 -1
  54. package/lib-es/bridge/signOperation.js +3 -0
  55. package/lib-es/bridge/signOperation.js.map +1 -1
  56. package/lib-es/bridge/sync.d.ts +3 -0
  57. package/lib-es/bridge/sync.d.ts.map +1 -1
  58. package/lib-es/bridge/sync.js +115 -20
  59. package/lib-es/bridge/sync.js.map +1 -1
  60. package/lib-es/bridge/validateAddress.d.ts +3 -0
  61. package/lib-es/bridge/validateAddress.d.ts.map +1 -0
  62. package/lib-es/bridge/validateAddress.js +5 -0
  63. package/lib-es/bridge/validateAddress.js.map +1 -0
  64. package/lib-es/common-logic/account/getBalance.d.ts +1 -0
  65. package/lib-es/common-logic/account/getBalance.d.ts.map +1 -1
  66. package/lib-es/common-logic/account/getBalance.js +1 -0
  67. package/lib-es/common-logic/account/getBalance.js.map +1 -1
  68. package/lib-es/common-logic/transaction/craftTransaction.d.ts +1 -0
  69. package/lib-es/common-logic/transaction/craftTransaction.d.ts.map +1 -1
  70. package/lib-es/common-logic/transaction/craftTransaction.js +3 -0
  71. package/lib-es/common-logic/transaction/craftTransaction.js.map +1 -1
  72. package/lib-es/network/gateway.d.ts +30 -12
  73. package/lib-es/network/gateway.d.ts.map +1 -1
  74. package/lib-es/network/gateway.js +41 -0
  75. package/lib-es/network/gateway.js.map +1 -1
  76. package/lib-es/types/bridge.d.ts +2 -0
  77. package/lib-es/types/bridge.d.ts.map +1 -1
  78. package/package.json +9 -9
  79. package/src/bridge/buildSubAccounts.test.ts +120 -0
  80. package/src/bridge/buildSubAccounts.ts +132 -0
  81. package/src/bridge/getTransactionStatus.ts +53 -22
  82. package/src/bridge/index.ts +2 -0
  83. package/src/bridge/prepareTransaction.ts +29 -4
  84. package/src/bridge/signOperation.ts +4 -0
  85. package/src/bridge/sync.test.ts +237 -191
  86. package/src/bridge/sync.ts +154 -24
  87. package/src/bridge/validateAddress.test.ts +25 -0
  88. package/src/bridge/validateAddress.ts +9 -0
  89. package/src/common-logic/account/getBalance.ts +2 -0
  90. package/src/common-logic/transaction/craftTransaction.ts +5 -0
  91. package/src/network/gateway.test.ts +169 -0
  92. package/src/network/gateway.ts +83 -12
  93. package/src/types/bridge.ts +2 -0
  94. package/tsconfig.json +7 -2
@@ -0,0 +1,23 @@
1
+ import { Operation } from "@ledgerhq/types-live";
2
+ import type { TokenAccount } from "@ledgerhq/types-live";
3
+ import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
4
+ import { type TransferProposal } from "../network/gateway";
5
+ export type CantonTokenAccount = TokenAccount & {
6
+ cantonResources: {
7
+ pendingTransferProposals: TransferProposal[];
8
+ };
9
+ };
10
+ export declare function buildSubAccounts({ accountId, tokenBalances, existingSubAccounts, allOperations, pendingTransferProposals, calTokens, }: {
11
+ accountId: string;
12
+ calTokens: Map<string, string>;
13
+ tokenBalances: Array<{
14
+ adminId: string;
15
+ totalBalance: bigint;
16
+ spendableBalance: bigint;
17
+ token: TokenCurrency;
18
+ }>;
19
+ existingSubAccounts: TokenAccount[];
20
+ allOperations: Operation[];
21
+ pendingTransferProposals: TransferProposal[];
22
+ }): CantonTokenAccount[];
23
+ //# sourceMappingURL=buildSubAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSubAccounts.d.ts","sourceRoot":"","sources":["../../src/bridge/buildSubAccounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAC9C,eAAe,EAAE;QAAE,wBAAwB,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;CACnE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,wBAAwB,EACxB,SAAS,GACV,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,aAAa,EAAE,KAAK,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,aAAa,CAAC;KACtB,CAAC,CAAC;IACH,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,wBAAwB,EAAE,gBAAgB,EAAE,CAAC;CAC9C,GAAG,kBAAkB,EAAE,CA6CvB"}
@@ -0,0 +1,74 @@
1
+ import BigNumber from "bignumber.js";
2
+ import { encodeTokenAccountId, emptyHistoryCache } from "@ledgerhq/coin-framework/account/index";
3
+ import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
4
+ import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
5
+ export function buildSubAccounts({ accountId, tokenBalances, existingSubAccounts, allOperations, pendingTransferProposals, calTokens, }) {
6
+ if (tokenBalances.length === 0)
7
+ return [];
8
+ const tokenAccounts = [];
9
+ const existingAccountByTicker = {};
10
+ const existingAccountTickers = [];
11
+ for (const existingSubAccount of existingSubAccounts) {
12
+ if (existingSubAccount.type === "TokenAccount") {
13
+ const { ticker } = existingSubAccount.token;
14
+ existingAccountTickers.push(ticker);
15
+ existingAccountByTicker[ticker] = existingSubAccount;
16
+ }
17
+ }
18
+ for (const { totalBalance, spendableBalance, token, adminId } of tokenBalances) {
19
+ const initialTokenAccount = existingAccountByTicker[token.ticker];
20
+ const instrumentId = calTokens.get(token.id) || token.name;
21
+ // Filter operations for this specific instrument (both id and admin must match)
22
+ const tokenOperations = allOperations.filter(op => {
23
+ const extra = op.extra;
24
+ return extra?.instrumentId === instrumentId && extra?.instrumentAdmin === adminId;
25
+ });
26
+ // Filter pending transfer proposals for this specific instrument
27
+ const tokenPendingTransferProposals = pendingTransferProposals.filter(proposal => proposal.instrument_id === instrumentId && proposal.instrument_admin === adminId);
28
+ const tokenAccount = buildSubAccount({
29
+ totalBalance: new BigNumber(totalBalance.toString()),
30
+ spendableBalance: new BigNumber(spendableBalance.toString()),
31
+ accountId,
32
+ initialTokenAccount,
33
+ parentAccountId: accountId,
34
+ token,
35
+ operations: tokenOperations,
36
+ pendingTransferProposals: tokenPendingTransferProposals,
37
+ });
38
+ if (tokenAccount)
39
+ tokenAccounts.push(tokenAccount);
40
+ }
41
+ return tokenAccounts;
42
+ }
43
+ function buildSubAccount({ totalBalance, spendableBalance, accountId, initialTokenAccount, parentAccountId, token, operations, pendingTransferProposals, }) {
44
+ const subAccountId = encodeTokenAccountId(accountId, token);
45
+ // Merge old operations with new ones and update accountId for sub-account
46
+ const oldOperations = initialTokenAccount?.operations || [];
47
+ const newOperations = operations.map(op => ({
48
+ ...op,
49
+ id: encodeOperationId(subAccountId, op.hash, op.type),
50
+ accountId: subAccountId,
51
+ }));
52
+ const mergedOperations = mergeOps(oldOperations, newOperations);
53
+ const creationDate = mergedOperations.length > 0
54
+ ? new Date(Math.min(...mergedOperations.map(op => op.date.getTime())))
55
+ : new Date();
56
+ return {
57
+ type: "TokenAccount",
58
+ id: subAccountId,
59
+ parentId: parentAccountId,
60
+ token,
61
+ balance: totalBalance,
62
+ spendableBalance,
63
+ operationsCount: mergedOperations.length,
64
+ operations: mergedOperations,
65
+ creationDate,
66
+ pendingOperations: initialTokenAccount?.pendingOperations || [],
67
+ balanceHistoryCache: initialTokenAccount?.balanceHistoryCache || emptyHistoryCache,
68
+ swapHistory: [],
69
+ cantonResources: {
70
+ pendingTransferProposals,
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=buildSubAccounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSubAccounts.js","sourceRoot":"","sources":["../../src/bridge/buildSubAccounts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTransactionStatus.d.ts","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,aAAa,EAGd,MAAM,UAAU,CAAC;AAOlB,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAC9C,WAAW,EACX,aAAa,EACb,iBAAiB,CAClB,CAAC,sBAAsB,CAqEvB,CAAC;AAkCF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAqBpF"}
1
+ {"version":3,"file":"getTransactionStatus.d.ts","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,aAAa,EAGd,MAAM,UAAU,CAAC;AAOlB,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAC9C,WAAW,EACX,aAAa,EACb,iBAAiB,CAClB,CAAC,sBAAsB,CA+FvB,CAAC;AAqCF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAqBpF"}
@@ -1,4 +1,4 @@
1
- import { AmountRequired, FeeNotLoaded, FeeTooHigh, InvalidAddress, NotEnoughBalanceBecauseDestinationNotCreated, NotEnoughSpendableBalance, RecipientRequired, } from "@ledgerhq/errors";
1
+ import { AmountRequired, FeeNotLoaded, FeeTooHigh, InvalidAddress, NotEnoughBalance, NotEnoughBalanceBecauseDestinationNotCreated, NotEnoughBalanceInParentAccount, NotEnoughSpendableBalance, RecipientRequired, } from "@ledgerhq/errors";
2
2
  import BigNumber from "bignumber.js";
3
3
  import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
4
4
  import { TooManyUtxosCritical, TooManyUtxosWarning, } from "../types";
@@ -15,9 +15,17 @@ export const getTransactionStatus = async (account, transaction) => {
15
15
  // reserveAmount is the minimum amount of currency that an account must hold in order to stay activated
16
16
  const reserveAmount = new BigNumber(coinConfig.getCoinConfig(account.currency).minReserve || 0);
17
17
  const estimatedFees = new BigNumber(transaction.fee || 0);
18
- const totalSpent = new BigNumber(transaction.amount).plus(estimatedFees);
19
18
  const amount = new BigNumber(transaction.amount);
20
- if (amount.gt(0) && estimatedFees.times(10).gt(amount)) {
19
+ const isTokenTransaction = !!transaction.subAccountId;
20
+ // For token transactions, fees are paid from parent account, so totalSpent is just amount
21
+ const totalSpent = isTokenTransaction ? amount : amount.plus(estimatedFees);
22
+ // Get the account balance to check against (subAccount for tokens, main account for native)
23
+ let accountBalance = account.spendableBalance;
24
+ if (isTokenTransaction && account.subAccounts) {
25
+ const subAccount = account.subAccounts.find(sub => sub.type === "TokenAccount" && sub.id === transaction.subAccountId);
26
+ accountBalance = subAccount?.spendableBalance ?? new BigNumber(0);
27
+ }
28
+ if (amount.gt(0) && estimatedFees.times(10).gt(amount) && !isTokenTransaction) {
21
29
  // if the fee is more than 10 times the amount, we warn the user that fee is high compared to what he is sending
22
30
  warnings.feeTooHigh = new FeeTooHigh();
23
31
  }
@@ -25,26 +33,6 @@ export const getTransactionStatus = async (account, transaction) => {
25
33
  // if the fee is not loaded, we can't do much
26
34
  errors.fee = new FeeNotLoaded();
27
35
  }
28
- else if (totalSpent.gt(account.balance.minus(reserveAmount))) {
29
- // if the total spent is greater than the balance minus the reserve amount, tx is invalid
30
- errors.amount = new NotEnoughSpendableBalance("", {
31
- minimumAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
32
- disableRounding: true,
33
- useGrouping: false,
34
- showCode: true,
35
- }),
36
- });
37
- }
38
- else if (transaction.recipient && transaction.amount.lt(reserveAmount)) {
39
- // if we send an amount lower than reserve amount AND target account is new, we need to warn the user that the target account will not be activated
40
- errors.amount = new NotEnoughBalanceBecauseDestinationNotCreated("", {
41
- minimalAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
42
- disableRounding: true,
43
- useGrouping: false,
44
- showCode: true,
45
- }),
46
- });
47
- }
48
36
  if (!transaction.recipient) {
49
37
  errors.recipient = new RecipientRequired("");
50
38
  }
@@ -54,10 +42,40 @@ export const getTransactionStatus = async (account, transaction) => {
54
42
  currencyName: account.currency.name,
55
43
  });
56
44
  }
57
- if (!errors.amount && amount.eq(0)) {
45
+ if (amount.eq(0)) {
58
46
  // if the amount is 0, we prevent the user from sending the tx (even if it's technically feasible)
59
47
  errors.amount = new AmountRequired();
60
48
  }
49
+ // For token transactions, check that parent account has enough native balance to pay fees
50
+ if (isTokenTransaction && estimatedFees.gt(account.balance)) {
51
+ errors.amount = new NotEnoughBalanceInParentAccount();
52
+ }
53
+ // Check if total spent exceeds available balance
54
+ if (!errors.amount && totalSpent.gt(accountBalance)) {
55
+ errors.amount = new NotEnoughBalance();
56
+ }
57
+ // For native coin transactions, check reserve amount constraints
58
+ if (!isTokenTransaction && !errors.amount) {
59
+ if (totalSpent.gt(account.balance.minus(reserveAmount))) {
60
+ errors.amount = new NotEnoughSpendableBalance("", {
61
+ minimumAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
62
+ disableRounding: true,
63
+ useGrouping: false,
64
+ showCode: true,
65
+ }),
66
+ });
67
+ }
68
+ else if (transaction.recipient && amount.lt(reserveAmount)) {
69
+ // if we send an amount lower than reserve amount AND target account is new, we need to warn the user that the target account will not be activated
70
+ errors.amount = new NotEnoughBalanceBecauseDestinationNotCreated("", {
71
+ minimalAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
72
+ disableRounding: true,
73
+ useGrouping: false,
74
+ showCode: true,
75
+ }),
76
+ });
77
+ }
78
+ }
61
79
  const utxoWarning = validateUtxoCount(account, transaction);
62
80
  if (utxoWarning) {
63
81
  warnings.tooManyUtxos = utxoWarning;
@@ -89,7 +107,10 @@ function validateUtxoCount(account, transaction) {
89
107
  return null;
90
108
  }
91
109
  const { instrumentUtxoCounts } = account.cantonResources;
92
- const instrumentUtxoCount = instrumentUtxoCounts[transaction.tokenId] || 0;
110
+ const instrumentKey = transaction.instrumentAdmin
111
+ ? `${transaction.tokenId}-${transaction.instrumentAdmin}`
112
+ : transaction.tokenId;
113
+ const instrumentUtxoCount = instrumentUtxoCounts[instrumentKey] || 0;
93
114
  if (instrumentUtxoCount > TO_MANY_UTXOS_CRITICAL_COUNT) {
94
115
  return new TooManyUtxosCritical();
95
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/bridge/getTransactionStatus.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAa5C,wBAAgB,aAAa,CAC3B,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,EAC1C,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC;;;EAkDzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAc5C,wBAAgB,aAAa,CAC3B,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,EAC1C,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC;;;EAmDzC"}
@@ -13,6 +13,7 @@ import { updateTransaction } from "./updateTransaction";
13
13
  import { buildOnboardAccount, buildAuthorizePreapproval } from "./onboard";
14
14
  import { buildTransferInstruction } from "./acceptOffer";
15
15
  import { assignToAccountRaw, assignFromAccountRaw } from "./serialization";
16
+ import { validateAddress } from "./validateAddress";
16
17
  export function createBridges(signerContext, coinConfig) {
17
18
  cantonCoinConfig.setCoinConfig(coinConfig);
18
19
  const getAddress = resolver(signerContext);
@@ -50,6 +51,7 @@ export function createBridges(signerContext, coinConfig) {
50
51
  assignToAccountRaw,
51
52
  assignFromAccountRaw,
52
53
  getSerializedAddressParameters,
54
+ validateAddress,
53
55
  };
54
56
  return {
55
57
  currencyBridge,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,mDAAmD,CAAC;AAClF,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,gBAAgB,EAChB,QAAQ,GACT,MAAM,2CAA2C,CAAC;AAInD,OAAO,gBAA2C,MAAM,WAAW,CAAC;AACpE,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,MAAM,UAAU,aAAa,CAC3B,aAA0C,EAC1C,UAAwC;IAExC,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,wBAAwB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IAExE,MAAM,YAAY,GAAG,gBAAgB,CAAC;QACpC,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC;QACnD,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAyB;QAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,YAAY;QACZ,cAAc;QACd,oBAAoB;QACpB,mBAAmB;KACpB,CAAC;IAEF,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE/E,MAAM,aAAa,GAA8C;QAC/D,SAAS;QACT,iBAAiB;QACjB,iBAAiB;QACjB,kBAAkB;QAClB,oBAAoB;QACpB,oBAAoB;QACpB,IAAI;QACJ,OAAO;QACP,aAAa;QACb,gBAAgB,EAAE,GAAG,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,kBAAkB;QAClB,oBAAoB;QACpB,8BAA8B;KAC/B,CAAC;IAEF,OAAO;QACL,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,mDAAmD,CAAC;AAClF,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,gBAAgB,EAChB,QAAQ,GACT,MAAM,2CAA2C,CAAC;AAInD,OAAO,gBAA2C,MAAM,WAAW,CAAC;AACpE,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,UAAU,aAAa,CAC3B,aAA0C,EAC1C,UAAwC;IAExC,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,wBAAwB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IAExE,MAAM,YAAY,GAAG,gBAAgB,CAAC;QACpC,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC;QACnD,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAyB;QAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,YAAY;QACZ,cAAc;QACd,oBAAoB;QACpB,mBAAmB;KACpB,CAAC;IAEF,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE/E,MAAM,aAAa,GAA8C;QAC/D,SAAS;QACT,iBAAiB;QACjB,iBAAiB;QACjB,kBAAkB;QAClB,oBAAoB;QACpB,oBAAoB;QACpB,IAAI;QACJ,OAAO;QACP,aAAa;QACb,gBAAgB,EAAE,GAAG,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,kBAAkB;QAClB,oBAAoB;QACpB,8BAA8B;QAC9B,eAAe;KAChB,CAAC;IAEF,OAAO;QACL,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"prepareTransaction.d.ts","sourceRoot":"","sources":["../../src/bridge/prepareTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAMvC,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAa/E,CAAC"}
1
+ {"version":3,"file":"prepareTransaction.d.ts","sourceRoot":"","sources":["../../src/bridge/prepareTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAWvC,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAiC/E,CAAC"}
@@ -2,12 +2,28 @@ import { estimateFees } from "../common-logic";
2
2
  import BigNumber from "bignumber.js";
3
3
  import { updateTransaction } from "./updateTransaction";
4
4
  import coinConfig from "../config";
5
+ import { getCalTokensCached } from "../network/gateway";
5
6
  export const prepareTransaction = async (account, transaction) => {
6
7
  const amount = transaction.amount || BigNumber(0);
7
8
  const fee = BigNumber((await estimateFees(account.currency, BigInt(amount.toFixed()))).toString());
8
- if (!transaction.tokenId) {
9
- transaction.tokenId = coinConfig.getCoinConfig(account.currency).nativeInstrumentId;
9
+ let tokenId = transaction.tokenId;
10
+ let instrumentAdmin;
11
+ if (transaction.subAccountId && account.subAccounts) {
12
+ const subAccount = account.subAccounts.find((sub) => sub.type === "TokenAccount" && sub.id === transaction.subAccountId);
13
+ if (subAccount) {
14
+ const calTokens = await getCalTokensCached(account.currency);
15
+ tokenId = calTokens.get(subAccount.token.id) || subAccount.token.name;
16
+ instrumentAdmin = subAccount.token.contractAddress;
17
+ }
10
18
  }
11
- return updateTransaction(transaction, { fee });
19
+ // Default to native instrument if no tokenId set
20
+ if (!tokenId) {
21
+ tokenId = coinConfig.getCoinConfig(account.currency).nativeInstrumentId;
22
+ }
23
+ return updateTransaction(transaction, {
24
+ fee,
25
+ tokenId,
26
+ ...(instrumentAdmin !== undefined && { instrumentAdmin }),
27
+ });
12
28
  };
13
29
  //# sourceMappingURL=prepareTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prepareTransaction.js","sourceRoot":"","sources":["../../src/bridge/prepareTransaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,UAAU,MAAM,WAAW,CAAC;AAEnC,MAAM,CAAC,MAAM,kBAAkB,GAAqD,KAAK,EACvF,OAAO,EACP,WAAW,EACX,EAAE;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,SAAS,CACnB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC5E,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC;IACtF,CAAC;IACD,OAAO,iBAAiB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC"}
1
+ {"version":3,"file":"prepareTransaction.js","sourceRoot":"","sources":["../../src/bridge/prepareTransaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,UAAU,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,CAAC,MAAM,kBAAkB,GAAqD,KAAK,EACvF,OAAO,EACP,WAAW,EACX,EAAE;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,SAAS,CACnB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC5E,CAAC;IAEF,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAClC,IAAI,eAAmC,CAAC;IACxC,IAAI,WAAW,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CACzC,CAAC,GAAG,EAA6B,EAAE,CACjC,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CACrE,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7D,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;YACtE,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC;QACrD,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC;IAC1E,CAAC;IAED,OAAO,iBAAiB,CAAC,WAAW,EAAE;QACpC,GAAG;QACH,OAAO;QACP,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,eAAe,EAAE,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"signOperation.d.ts","sourceRoot":"","sources":["../../src/bridge/signOperation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAa,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAKhE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,kBAAkB,GAC5B,eAAe,aAAa,CAAC,YAAY,CAAC,KAAG,aAAa,CAAC,WAAW,CAAC,CAAC,eAAe,CA6FpF,CAAC"}
1
+ {"version":3,"file":"signOperation.d.ts","sourceRoot":"","sources":["../../src/bridge/signOperation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAa,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAKhE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErD,eAAO,MAAM,kBAAkB,GAC5B,eAAe,aAAa,CAAC,YAAY,CAAC,KAAG,aAAa,CAAC,WAAW,CAAC,CAAC,eAAe,CAiGpF,CAAC"}
@@ -23,6 +23,9 @@ export const buildSignOperation = (signerContext) => ({ account, deviceId, trans
23
23
  expireInSeconds: 60 * 60,
24
24
  tokenId: transaction.tokenId,
25
25
  };
26
+ if (transaction.instrumentAdmin) {
27
+ params.instrumentAdmin = transaction.instrumentAdmin;
28
+ }
26
29
  if (transaction.memo) {
27
30
  params.memo = transaction.memo;
28
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"signOperation.js","sourceRoot":"","sources":["../../src/bridge/signOperation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signOperation.js","sourceRoot":"","sources":["../../src/bridge/signOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,aAA0C,EAA+C,EAAE,CAC5F,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CACrC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE;IACjB,KAAK,UAAU,IAAI;QACjB,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC;QAC5B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,YAAY,EAAE,CAAC;QAEnC,IAAI,CAAC;YACH,8EAA8E;YAC9E,CAAC,CAAC,IAAI,CAAC;gBACL,IAAI,EAAE,4BAA4B;aACnC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBAC7D,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;gBAC/D,MAAM,OAAO,GAAG,IAAI,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC;gBAC1D,MAAM,MAAM,GAOR;oBACF,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,eAAe,EAAE,EAAE,GAAG,EAAE;oBACxB,OAAO,EAAE,WAAW,CAAC,OAAO;iBAC7B,CAAC;gBACF,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;oBAChC,MAAM,CAAC,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC;gBACvD,CAAC;gBACD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;gBACjC,CAAC;gBAED,MAAM,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAC/E,OAAO,CAAC,QAAQ,EAChB;oBACE,OAAO;iBACR,EACD,MAAM,CACP,CAAC;gBAEF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE;oBAClE,IAAI,EAAE,iBAAiB;oBACvB,UAAU,EAAE,qBAAqB;oBACjC,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBAEH,OAAO,OAAO,CAAC,qBAAqB,EAAE,GAAG,SAAS,YAAY,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YAEH,CAAC,CAAC,IAAI,CAAC;gBACL,IAAI,EAAE,0BAA0B;aACjC,CAAC,CAAC;YAEH,gIAAgI;YAChI,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,MAAM,SAAS,GAAc;gBAC3B,EAAE,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;gBAC9C,IAAI;gBACJ,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,GAAG;gBACH,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC/B,UAAU,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;gBACnC,IAAI,EAAE,IAAI,IAAI,EAAE;gBAChB,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,CAAC,CAAC,IAAI,CAAC;gBACL,IAAI,EAAE,QAAQ;gBACd,eAAe,EAAE;oBACf,SAAS;oBACT,SAAS;iBACV;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gBACvB,MAAM,YAAY,GACf,CAAmD,EAAE,IAAI,EAAE,aAAa;oBACzE,CAAC,CAAC,OAAO,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,CACT,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAClB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAChB,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1,5 +1,8 @@
1
+ import { TokenAccount } from "@ledgerhq/types-live";
2
+ import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
1
3
  import { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers";
2
4
  import { SignerContext } from "@ledgerhq/coin-framework/signer";
3
5
  import { CantonAccount, CantonSigner } from "../types";
6
+ export declare function filterDisabledTokenAccounts(currency: CryptoCurrency, subAccounts: TokenAccount[] | undefined): Promise<TokenAccount[]>;
4
7
  export declare function makeGetAccountShape(signerContext: SignerContext<CantonSigner>): GetAccountShape<CantonAccount>;
5
8
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/bridge/sync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AAEtF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAUhE,OAAO,EAAE,aAAa,EAAmB,YAAY,EAAE,MAAM,UAAU,CAAC;AA0ExE,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,GACzC,eAAe,CAAC,aAAa,CAAC,CAsHhC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/bridge/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAElF,OAAO,EAAE,eAAe,EAAY,MAAM,2CAA2C,CAAC;AAEtF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAYhE,OAAO,EAAE,aAAa,EAAmB,YAAY,EAAE,MAAM,UAAU,CAAC;AAmFxE,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,YAAY,EAAE,GAAG,SAAS,GACtC,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBzB;AAED,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,GACzC,eAAe,CAAC,aAAa,CAAC,CA+MhC"}
@@ -2,14 +2,18 @@ import BigNumber from "bignumber.js";
2
2
  import { encodeAccountId } from "@ledgerhq/coin-framework/account/index";
3
3
  import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
4
4
  import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
5
- import { getLedgerEnd, getOperations, getPendingTransferProposals, } from "../network/gateway";
5
+ import { getLedgerEnd, getOperations, getPendingTransferProposals, getEnabledInstrumentsCached, getCalTokensCached, } from "../network/gateway";
6
6
  import { getBalance } from "../common-logic/account/getBalance";
7
7
  import coinConfig from "../config";
8
8
  import resolver from "../signer";
9
9
  import { isAccountOnboarded } from "./onboard";
10
10
  import { isCantonAccountEmpty } from "../helpers";
11
+ import { getCryptoAssetsStore } from "@ledgerhq/cryptoassets/state";
12
+ import { buildSubAccounts } from "./buildSubAccounts";
13
+ const SEPARATOR = "____";
14
+ const getKey = (id, adminId) => `${id}${SEPARATOR}${adminId}`;
11
15
  const txInfoToOperationAdapter = (accountId, partyId) => (txInfo) => {
12
- const { transaction_hash, uid, block: { height, hash }, senders, recipients, transaction_timestamp, fee: { value: fee }, transfers: [{ value: transferValue, details }], } = txInfo;
16
+ const { asset: { instrumentId, instrumentAdmin }, transaction_hash, uid, block: { height, hash }, senders, recipients, transaction_timestamp, fee: { value: fee }, transfers: [{ value: transferValue, details }], } = txInfo;
13
17
  let type = "UNKNOWN";
14
18
  if (details.operationType === "transfer-proposal") {
15
19
  type = "TRANSFER_PROPOSAL";
@@ -55,6 +59,8 @@ const txInfoToOperationAdapter = (accountId, partyId) => (txInfo) => {
55
59
  extra: {
56
60
  uid,
57
61
  memo,
62
+ instrumentId,
63
+ instrumentAdmin,
58
64
  },
59
65
  };
60
66
  return op;
@@ -62,6 +68,27 @@ const txInfoToOperationAdapter = (accountId, partyId) => (txInfo) => {
62
68
  const filterOperations = (transactions, accountId, partyId) => {
63
69
  return transactions.map(txInfoToOperationAdapter(accountId, partyId));
64
70
  };
71
+ export async function filterDisabledTokenAccounts(currency, subAccounts) {
72
+ if (!subAccounts || subAccounts.length === 0) {
73
+ return [];
74
+ }
75
+ let enabledInstruments;
76
+ try {
77
+ const enabledList = await getEnabledInstrumentsCached(currency);
78
+ enabledInstruments = new Set(enabledList);
79
+ }
80
+ catch (error) {
81
+ // If API fails, hide all token accounts
82
+ return [];
83
+ }
84
+ return subAccounts.filter(subAccount => {
85
+ const instrumentId = subAccount.token.contractAddress;
86
+ if (!instrumentId) {
87
+ return false;
88
+ }
89
+ return enabledInstruments.has(instrumentId);
90
+ });
91
+ }
65
92
  export function makeGetAccountShape(signerContext) {
66
93
  return async (info) => {
67
94
  const { address, currency, derivationMode, derivationPath, initialAccount } = info;
@@ -95,24 +122,75 @@ export function makeGetAccountShape(signerContext) {
95
122
  const pendingTransferProposals = xpubOrAddress
96
123
  ? await getPendingTransferProposals(currency, xpubOrAddress)
97
124
  : [];
98
- const balancesData = (balances || []).reduce((acc, balance) => {
99
- if (balance.locked) {
100
- acc[`Locked${balance.instrumentId}`] = balance;
125
+ // Aggregate all balances by instrument (unlocked + locked)
126
+ const aggregatedBalances = new Map();
127
+ const proposalInstrumentKeys = new Set(pendingTransferProposals.map(proposal => getKey(proposal.instrument_id, proposal.instrument_admin)));
128
+ for (const key of proposalInstrumentKeys) {
129
+ if (aggregatedBalances.has(key))
130
+ continue;
131
+ const [instrumentId, adminId] = key.split(SEPARATOR);
132
+ balances.push({
133
+ value: 0n,
134
+ locked: 0n,
135
+ utxoCount: 0,
136
+ instrumentId,
137
+ adminId,
138
+ asset: { type: "token", assetReference: instrumentId },
139
+ });
140
+ }
141
+ const tokensByKey = new Map();
142
+ for await (const balance of balances) {
143
+ const token = await getCryptoAssetsStore().findTokenByAddressInCurrency(balance.adminId, currency.id);
144
+ if (!token)
145
+ continue;
146
+ tokensByKey.set(getKey(balance.instrumentId, balance.adminId), token);
147
+ }
148
+ for await (const balance of balances) {
149
+ const isNative = balance.instrumentId === nativeInstrumentId;
150
+ // Use just instrumentId for native (no admin), composite key for tokens
151
+ const balanceKey = isNative
152
+ ? nativeInstrumentId
153
+ : getKey(balance.instrumentId, balance.adminId);
154
+ const token = isNative ? null : tokensByKey.get(balanceKey) ?? null;
155
+ const existing = aggregatedBalances.get(balanceKey);
156
+ if (existing) {
157
+ if (balance.locked) {
158
+ existing.lockedBalance += balance.value;
159
+ }
160
+ else {
161
+ existing.unlockedBalance += balance.value;
162
+ }
163
+ existing.utxoCount += balance.utxoCount;
101
164
  }
102
165
  else {
103
- acc[balance.instrumentId] = balance;
166
+ aggregatedBalances.set(balanceKey, {
167
+ unlockedBalance: balance.locked ? 0n : balance.value,
168
+ lockedBalance: balance.locked ? balance.value : 0n,
169
+ utxoCount: balance.utxoCount,
170
+ token,
171
+ adminId: balance.adminId,
172
+ });
104
173
  }
105
- return acc;
106
- }, {});
107
- const unlockedAmount = new BigNumber(balancesData[nativeInstrumentId]?.value.toString() || "0");
108
- const lockedAmount = new BigNumber(balancesData[`Locked${nativeInstrumentId}`]?.value.toString() || "0");
174
+ }
175
+ // Find native balance (token is null for native)
176
+ const nativeBalance = Array.from(aggregatedBalances.values()).find(data => data.token === null);
177
+ const unlockedAmount = new BigNumber((nativeBalance?.unlockedBalance ?? 0n).toString());
178
+ const lockedAmount = new BigNumber((nativeBalance?.lockedBalance ?? 0n).toString());
109
179
  const totalBalance = unlockedAmount.plus(lockedAmount);
110
180
  const reserveMin = new BigNumber(coinConfig.getCoinConfig(currency).minReserve || 0);
111
- const spendableBalance = BigNumber.max(0, totalBalance.minus(reserveMin));
181
+ const spendableBalance = BigNumber.max(0, unlockedAmount.minus(reserveMin));
112
182
  const instrumentUtxoCounts = {};
113
- for (const [instrumentId, balance] of Object.entries(balancesData)) {
114
- instrumentUtxoCounts[instrumentId] = balance.utxoCount;
183
+ for (const [key, data] of aggregatedBalances) {
184
+ instrumentUtxoCounts[key] = data.utxoCount;
115
185
  }
186
+ const tokenBalances = Array.from(aggregatedBalances.entries())
187
+ .filter(([, data]) => data.token !== null)
188
+ .map(([, { unlockedBalance, lockedBalance, token, adminId }]) => ({
189
+ totalBalance: unlockedBalance + lockedBalance,
190
+ spendableBalance: unlockedBalance,
191
+ token: token,
192
+ adminId,
193
+ }));
116
194
  let operations = [];
117
195
  if (xpubOrAddress) {
118
196
  const oldOperations = initialAccount?.operations || [];
@@ -124,22 +202,38 @@ export function makeGetAccountShape(signerContext) {
124
202
  const newOperations = filterOperations(transactionData.operations, accountId, xpubOrAddress);
125
203
  operations = mergeOps(oldOperations, newOperations);
126
204
  }
205
+ // Filter main account operations (native instrument only)
206
+ const mainAccountOperations = operations.filter(op => {
207
+ const extra = op.extra;
208
+ return extra?.instrumentId === nativeInstrumentId;
209
+ });
210
+ // Build sub-accounts for tokens with their filtered operations
211
+ const calTokens = await getCalTokensCached(currency);
212
+ const subAccounts = buildSubAccounts({
213
+ accountId,
214
+ tokenBalances,
215
+ existingSubAccounts: initialAccount?.subAccounts ?? [],
216
+ allOperations: operations,
217
+ pendingTransferProposals,
218
+ calTokens,
219
+ });
127
220
  const cantonResources = {
128
221
  isOnboarded,
129
222
  instrumentUtxoCounts,
130
- pendingTransferProposals,
223
+ pendingTransferProposals: pendingTransferProposals.filter(proposal => proposal.instrument_id === nativeInstrumentId),
131
224
  ...(publicKey && { publicKey }),
132
225
  xpub: xpubOrAddress,
133
226
  };
227
+ const filteredSubAccounts = await filterDisabledTokenAccounts(currency, subAccounts);
134
228
  const used = !isCantonAccountEmpty({
135
- operationsCount: operations.length,
229
+ operationsCount: mainAccountOperations.length,
136
230
  balance: totalBalance,
137
- subAccounts: initialAccount?.subAccounts ?? [],
231
+ subAccounts: filteredSubAccounts,
138
232
  cantonResources,
139
233
  });
140
234
  const blockHeight = await getLedgerEnd(currency);
141
- const creationDate = operations.length > 0
142
- ? new Date(Math.min(...operations.map(op => op.date.getTime())))
235
+ const creationDate = mainAccountOperations.length > 0
236
+ ? new Date(Math.min(...mainAccountOperations.map(op => op.date.getTime())))
143
237
  : new Date();
144
238
  const shape = {
145
239
  id: accountId,
@@ -150,9 +244,10 @@ export function makeGetAccountShape(signerContext) {
150
244
  lastSyncDate: new Date(),
151
245
  freshAddress: address,
152
246
  seedIdentifier: address,
153
- operations,
154
- operationsCount: operations.length,
247
+ operations: mainAccountOperations,
248
+ operationsCount: mainAccountOperations.length,
155
249
  spendableBalance,
250
+ subAccounts: filteredSubAccounts,
156
251
  xpub: xpubOrAddress,
157
252
  used,
158
253
  cantonResources,