@ledgerhq/coin-tezos
Version:
79 lines • 3.37 kB
JavaScript
;
// SPDX-FileCopyrightText: © 2026 LEDGER SAS
// SPDX-License-Identifier: Apache-2.0
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBalance = getBalance;
const logs_1 = require("@ledgerhq/logs");
const types_1 = require("../network/types");
const tzkt_1 = require("../network/tzkt");
const utils_1 = require("../utils");
const getStakes_1 = require("./getStakes");
/** Returns `[native, ...stakes, ...tokens]` per the Paris upgrade. */
async function getBalance(context, address) {
const config = await context.config();
const api = (0, tzkt_1.createTzktApi)(config);
const [apiAccountResult, tokensBalancesResult] = await Promise.allSettled([
api.getAccountByAddress(address),
api.getTokensBalances(address),
]);
if (apiAccountResult.status !== 'fulfilled') {
throw apiAccountResult.reason;
}
const apiAccount = apiAccountResult.value;
const tokensBalancesRaw = tokensBalancesResult.status === 'fulfilled' ? tokensBalancesResult.value : [];
const tokensBalance = tokensBalancesRaw.map(({ balance, token }) => {
const magnitude = Number.parseInt(token.metadata?.decimals || '0', 10);
const name = token.metadata?.name ?? token.contract.alias ?? '';
const symbol = token.metadata?.symbol ?? token.contract.alias ?? '';
const unit = Number.isFinite(magnitude) && name && symbol
? {
magnitude,
name,
code: symbol,
}
: undefined;
return {
value: BigInt(balance),
asset: {
type: token.standard,
assetReference: `${token.contract.address}:${token.tokenId ?? '0'}`,
assetOwner: address,
name: token.contract.alias,
...(unit && { unit }),
},
};
});
// We don't compute native/stake balances for non-manager account types (empty / contract /
// ghost / rollup). KT1 contracts can hold XTZ, but they aren't user-facing wallet accounts
// here, so we report a 0 native balance alongside any token balances.
if (!(0, types_1.hasManagerKey)(apiAccount)) {
return [{ value: 0n, asset: { type: 'native' } }, ...tokensBalance];
}
const normalized = BigInt(apiAccount.balance);
const unstakeRequests = await (0, getStakes_1.fetchUnstakeRequests)(config, address, apiAccount).catch((error) => {
(0, logs_1.log)('coin:tezos', 'getBalance: fetchUnstakeRequests failed; degrading stakes to []', {
error,
address,
});
return [];
});
const stakes = (0, getStakes_1.buildStakesForAccount)(address, apiAccount, unstakeRequests);
const stakedBalance = BigInt(apiAccount.stakedBalance ?? 0);
const unstakedBalance = BigInt(apiAccount.unstakedBalance ?? 0);
const { locked } = (0, utils_1.partitionNativeBalance)(normalized, stakedBalance, unstakedBalance);
const stakeBalances = stakes.map((stake) => ({
value: stake.amount,
asset: { type: 'native' },
stake,
}));
return [
{
value: normalized,
asset: { type: 'native' },
...(locked > 0n && { locked }),
},
...stakeBalances,
...tokensBalance,
];
}
//# sourceMappingURL=getBalance.js.map