UNPKG

@ledgerhq/coin-tezos

Version:
74 lines 2.86 kB
// 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