UNPKG

@ledgerhq/coin-tezos

Version:
127 lines 5.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.hydrateBakers = exports.asBaker = exports.listBakers = exports.listBakersWithDefault = exports.fetchAllBakers = exports.cache = void 0; exports.getBakerSync = getBakerSync; exports.getAccountDelegationSync = getAccountDelegationSync; exports.isAccountDelegating = isAccountDelegating; exports.loadBaker = loadBaker; exports.loadAccountDelegation = loadAccountDelegation; const cache_1 = require("@ledgerhq/live-network/cache"); const network_1 = __importDefault(require("@ledgerhq/live-network/network")); const logs_1 = require("@ledgerhq/logs"); const bakers_whitelist_default_1 = require("./bakers.whitelist-default"); const config_1 = __importDefault(require("../config")); exports.cache = (0, cache_1.makeLRUCache)(async () => { const bakers = []; const TEZOS_API_BASE_URL = config_1.default.getCoinConfig().baker.url; const { data } = await (0, network_1.default)({ url: `${TEZOS_API_BASE_URL}/v3/bakers`, }); if (data && Array.isArray(data)) { (0, logs_1.log)("tezos/bakers", "found " + data.length + " bakers"); data .filter(raw => raw.status === "active" && raw.delegation.enabled) .forEach(raw => { const baker = (0, exports.asBaker)(raw); if (baker) { bakers.push(baker); } }); bakers.sort((a, b) => (a.name > b.name ? 1 : -1)); } const ledgerBakerIndex = bakers.findIndex(baker => baker.address === bakers_whitelist_default_1.ledgerValidatorAddress); const [ledgerBaker] = bakers.splice(ledgerBakerIndex, 1); (0, logs_1.log)("tezos/bakers", "loaded " + bakers.length + " bakers"); return [ledgerBaker, ...bakers]; }, () => ""); let _lastBakers = []; const fetchAllBakers = async () => { const allBakers = await exports.cache.force(); _lastBakers = allBakers; return allBakers; }; exports.fetchAllBakers = fetchAllBakers; function whitelist(all, addresses) { return all.filter(baker => addresses.includes(baker.address)); } const listBakersWithDefault = (whitelistAddresses) => { return whitelist(_lastBakers, whitelistAddresses); }; exports.listBakersWithDefault = listBakersWithDefault; const listBakers = async (whitelistAddresses) => { _lastBakers = await (0, exports.cache)(); return whitelist(_lastBakers, whitelistAddresses); }; exports.listBakers = listBakers; function getBakerSync(addr) { return _lastBakers.find(baker => baker.address === addr); } function getAccountDelegationSync(account) { const op = account.operations.find(op => !op.hasFailed && (op.type === "DELEGATE" || op.type === "UNDELEGATE")); const pendingOp = account.pendingOperations .filter(op => !account.operations.some(o => op.hash === o.hash)) .find(op => op.type === "DELEGATE" || op.type === "UNDELEGATE"); const isPending = !!pendingOp; const operation = pendingOp && pendingOp.type === "DELEGATE" ? pendingOp : op; if (!operation || operation.type === "UNDELEGATE") { return null; } const recentOps = account.operations .filter(op => op.date > operation.date) .concat(account.pendingOperations); const sendShouldWarnDelegation = !recentOps.some(op => op.type === "OUT"); const receiveShouldWarnDelegation = !recentOps.some(op => op.type === "IN"); return { isPending, operation, address: operation.recipients[0], baker: null, sendShouldWarnDelegation, receiveShouldWarnDelegation, }; } function isAccountDelegating(account) { return !!getAccountDelegationSync(account); } async function loadBaker(addr) { const cacheBaker = getBakerSync(addr); if (cacheBaker) return cacheBaker; const bakers = await (0, exports.cache)(); const baker = bakers.find(baker => baker.address === addr); return baker; } async function loadAccountDelegation(account) { const delegation = getAccountDelegationSync(account); if (!delegation) return null; const baker = await loadBaker(delegation.address); return { ...delegation, baker }; } 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", }; } }; exports.asBaker = asBaker; const hydrateBakers = (bakers) => { (0, logs_1.log)("tezos/bakers", "hydrate " + bakers.length + " bakers"); exports.cache.hydrate("", bakers); }; exports.hydrateBakers = hydrateBakers; //# sourceMappingURL=bakers.js.map