@ledgerhq/coin-tezos
Version:
74 lines • 2.86 kB
JavaScript
// SPDX-FileCopyrightText: © 2026 LEDGER SAS
// SPDX-License-Identifier: Apache-2.0
import { makeLRUCache } from '@ledgerhq/live-network/cache';
import network from '@ledgerhq/live-network/network';
import { log } from '@ledgerhq/logs';
import { ledgerValidatorAddress } from './bakers.whitelist-default';
export const cache = makeLRUCache(async (config) => {
const bakers = [];
const TEZOS_API_BASE_URL = config.baker.url;
const { data } = await network({
url: `${TEZOS_API_BASE_URL}/v3/bakers`,
});
if (data && Array.isArray(data)) {
log('tezos/bakers', 'found ' + data.length + ' bakers');
data
.filter((raw) => raw.status === 'active' && raw.delegation.enabled)
.forEach((raw) => {
const baker = asBaker(raw);
if (baker) {
bakers.push(baker);
}
});
bakers.sort((a, b) => (a.name > b.name ? 1 : -1));
}
const ledgerBakerIndex = bakers.findIndex((baker) => baker.address === ledgerValidatorAddress);
const [ledgerBaker] = bakers.splice(ledgerBakerIndex, 1);
log('tezos/bakers', 'loaded ' + bakers.length + ' bakers');
return [ledgerBaker, ...bakers];
}, (config) => config.baker.url);
let _lastBakers = [];
export const fetchAllBakers = async (config) => {
const allBakers = await cache.force(config);
_lastBakers = allBakers;
return allBakers;
};
function whitelist(all, addresses) {
return all.filter((baker) => addresses.includes(baker.address));
}
export const listBakersWithDefault = (whitelistAddresses) => {
return whitelist(_lastBakers, whitelistAddresses);
};
export const listBakers = async (config, whitelistAddresses) => {
_lastBakers = await cache(config);
return whitelist(_lastBakers, whitelistAddresses);
};
export function getBakerSync(addr) {
return _lastBakers.find((baker) => baker.address === addr);
}
export async function loadBaker(config, addr) {
const cacheBaker = getBakerSync(addr);
if (cacheBaker)
return cacheBaker;
const bakers = await cache(config);
const baker = bakers.find((baker) => baker.address === addr);
return baker;
}
export const asBaker = (data) => {
const { address, name, delegation } = data;
if (typeof name === 'string' &&
typeof address === 'string' &&
typeof delegation.freeSpace === 'number' &&
typeof delegation.estimatedApy === 'number' &&
delegation.estimatedApy >= 0 &&
delegation.estimatedApy <= 1) {
return {
name,
address,
logoURL: `https://services.tzkt.io/v1/avatars/${address}`,
nominalYield: `${Math.floor(10000 * delegation.estimatedApy) / 100} %`,
capacityStatus: delegation.freeSpace <= 0 ? 'full' : 'normal',
};
}
};
//# sourceMappingURL=bakers.js.map