@ledgerhq/coin-canton 0.12.0-nightly.20251210120335 → 0.12.0-nightly.20251212024049
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -9
- package/lib/bridge/buildSubAccounts.d.ts +23 -0
- package/lib/bridge/buildSubAccounts.d.ts.map +1 -0
- package/lib/bridge/buildSubAccounts.js +80 -0
- package/lib/bridge/buildSubAccounts.js.map +1 -0
- package/lib/bridge/getTransactionStatus.d.ts.map +1 -1
- package/lib/bridge/getTransactionStatus.js +45 -24
- package/lib/bridge/getTransactionStatus.js.map +1 -1
- package/lib/bridge/index.d.ts.map +1 -1
- package/lib/bridge/index.js +2 -0
- package/lib/bridge/index.js.map +1 -1
- package/lib/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib/bridge/prepareTransaction.js +19 -3
- package/lib/bridge/prepareTransaction.js.map +1 -1
- package/lib/bridge/signOperation.d.ts.map +1 -1
- package/lib/bridge/signOperation.js +3 -0
- package/lib/bridge/signOperation.js.map +1 -1
- package/lib/bridge/sync.d.ts +3 -0
- package/lib/bridge/sync.d.ts.map +1 -1
- package/lib/bridge/sync.js +115 -19
- package/lib/bridge/sync.js.map +1 -1
- package/lib/bridge/validateAddress.d.ts +3 -0
- package/lib/bridge/validateAddress.d.ts.map +1 -0
- package/lib/bridge/validateAddress.js +8 -0
- package/lib/bridge/validateAddress.js.map +1 -0
- package/lib/common-logic/account/getBalance.d.ts +1 -0
- package/lib/common-logic/account/getBalance.d.ts.map +1 -1
- package/lib/common-logic/account/getBalance.js +1 -0
- package/lib/common-logic/account/getBalance.js.map +1 -1
- package/lib/common-logic/transaction/craftTransaction.d.ts +1 -0
- package/lib/common-logic/transaction/craftTransaction.d.ts.map +1 -1
- package/lib/common-logic/transaction/craftTransaction.js +3 -0
- package/lib/common-logic/transaction/craftTransaction.js.map +1 -1
- package/lib/network/gateway.d.ts +30 -12
- package/lib/network/gateway.d.ts.map +1 -1
- package/lib/network/gateway.js +44 -1
- package/lib/network/gateway.js.map +1 -1
- package/lib/types/bridge.d.ts +2 -0
- package/lib/types/bridge.d.ts.map +1 -1
- package/lib-es/bridge/buildSubAccounts.d.ts +23 -0
- package/lib-es/bridge/buildSubAccounts.d.ts.map +1 -0
- package/lib-es/bridge/buildSubAccounts.js +74 -0
- package/lib-es/bridge/buildSubAccounts.js.map +1 -0
- package/lib-es/bridge/getTransactionStatus.d.ts.map +1 -1
- package/lib-es/bridge/getTransactionStatus.js +46 -25
- package/lib-es/bridge/getTransactionStatus.js.map +1 -1
- package/lib-es/bridge/index.d.ts.map +1 -1
- package/lib-es/bridge/index.js +2 -0
- package/lib-es/bridge/index.js.map +1 -1
- package/lib-es/bridge/prepareTransaction.d.ts.map +1 -1
- package/lib-es/bridge/prepareTransaction.js +19 -3
- package/lib-es/bridge/prepareTransaction.js.map +1 -1
- package/lib-es/bridge/signOperation.d.ts.map +1 -1
- package/lib-es/bridge/signOperation.js +3 -0
- package/lib-es/bridge/signOperation.js.map +1 -1
- package/lib-es/bridge/sync.d.ts +3 -0
- package/lib-es/bridge/sync.d.ts.map +1 -1
- package/lib-es/bridge/sync.js +115 -20
- package/lib-es/bridge/sync.js.map +1 -1
- package/lib-es/bridge/validateAddress.d.ts +3 -0
- package/lib-es/bridge/validateAddress.d.ts.map +1 -0
- package/lib-es/bridge/validateAddress.js +5 -0
- package/lib-es/bridge/validateAddress.js.map +1 -0
- package/lib-es/common-logic/account/getBalance.d.ts +1 -0
- package/lib-es/common-logic/account/getBalance.d.ts.map +1 -1
- package/lib-es/common-logic/account/getBalance.js +1 -0
- package/lib-es/common-logic/account/getBalance.js.map +1 -1
- package/lib-es/common-logic/transaction/craftTransaction.d.ts +1 -0
- package/lib-es/common-logic/transaction/craftTransaction.d.ts.map +1 -1
- package/lib-es/common-logic/transaction/craftTransaction.js +3 -0
- package/lib-es/common-logic/transaction/craftTransaction.js.map +1 -1
- package/lib-es/network/gateway.d.ts +30 -12
- package/lib-es/network/gateway.d.ts.map +1 -1
- package/lib-es/network/gateway.js +41 -0
- package/lib-es/network/gateway.js.map +1 -1
- package/lib-es/types/bridge.d.ts +2 -0
- package/lib-es/types/bridge.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/bridge/buildSubAccounts.test.ts +120 -0
- package/src/bridge/buildSubAccounts.ts +132 -0
- package/src/bridge/getTransactionStatus.ts +53 -22
- package/src/bridge/index.ts +2 -0
- package/src/bridge/prepareTransaction.ts +29 -4
- package/src/bridge/signOperation.ts +4 -0
- package/src/bridge/sync.test.ts +237 -191
- package/src/bridge/sync.ts +154 -24
- package/src/bridge/validateAddress.test.ts +25 -0
- package/src/bridge/validateAddress.ts +9 -0
- package/src/common-logic/account/getBalance.ts +2 -0
- package/src/common-logic/transaction/craftTransaction.ts +5 -0
- package/src/network/gateway.test.ts +169 -0
- package/src/network/gateway.ts +83 -12
- package/src/types/bridge.ts +2 -0
- 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":"
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,4CAA4C,EAC5C,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAIL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,UAAU,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAC/C,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAIL,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IACzD,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAE3C,uGAAuG;IACvG,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,
|
|
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;
|
|
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"}
|
package/lib-es/bridge/index.js
CHANGED
|
@@ -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;
|
|
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,
|
|
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
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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;
|
|
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,
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"signOperation.js","sourceRoot":"","sources":["../../src/bridge/signOperation.ts"],"names":[],"mappings":"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"}
|
package/lib-es/bridge/sync.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/lib-es/bridge/sync.js
CHANGED
|
@@ -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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
const
|
|
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,
|
|
181
|
+
const spendableBalance = BigNumber.max(0, unlockedAmount.minus(reserveMin));
|
|
112
182
|
const instrumentUtxoCounts = {};
|
|
113
|
-
for (const [
|
|
114
|
-
instrumentUtxoCounts[
|
|
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:
|
|
229
|
+
operationsCount: mainAccountOperations.length,
|
|
136
230
|
balance: totalBalance,
|
|
137
|
-
subAccounts:
|
|
231
|
+
subAccounts: filteredSubAccounts,
|
|
138
232
|
cantonResources,
|
|
139
233
|
});
|
|
140
234
|
const blockHeight = await getLedgerEnd(currency);
|
|
141
|
-
const creationDate =
|
|
142
|
-
? new Date(Math.min(...
|
|
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:
|
|
247
|
+
operations: mainAccountOperations,
|
|
248
|
+
operationsCount: mainAccountOperations.length,
|
|
155
249
|
spendableBalance,
|
|
250
|
+
subAccounts: filteredSubAccounts,
|
|
156
251
|
xpub: xpubOrAddress,
|
|
157
252
|
used,
|
|
158
253
|
cantonResources,
|