UNPKG

@ledgerhq/coin-stellar

Version:
69 lines 2.93 kB
import { encodeAccountId } from "@ledgerhq/coin-framework/account/index"; import { inferSubOperations } from "@ledgerhq/coin-framework/serialization/index"; import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers"; import { fetchAccount, fetchAllOperations } from "../network"; import { buildSubAccounts } from "./tokens"; import { StellarBurnAddressError } from "../types"; import { STELLAR_BURN_ADDRESS } from "./logic"; import { getEnv } from "@ledgerhq/live-env"; export const getAccountShape = async (info, syncConfig) => { const { address, currency, initialAccount, derivationMode } = info; // FIXME Workaround for burn address, see https://ledgerhq.atlassian.net/browse/LIVE-4014 if (address === STELLAR_BURN_ADDRESS) throw new StellarBurnAddressError(); const accountId = encodeAccountId({ type: "js", version: "2", currencyId: currency.id, xpubOrAddress: address, derivationMode, }); const { blockHeight, balance, spendableBalance, assets } = await fetchAccount(address); const oldOperations = (initialAccount?.operations || []); const lastPagingToken = oldOperations[0]?.extra.pagingToken || ""; const isInitSync = lastPagingToken === ""; const newOperations = (await fetchAllOperations(accountId, address, isInitSync ? "desc" : "asc", lastPagingToken, /** * For an account with a particularly high number of historical transactions, * retrieving all the data would take a considerable amount of time and is likely to * fail due to poor network connection quality or other reasons. Therefore, we set a * limit on the number of retrieval operations here. * If users want to access historical records from earlier, I would suggest they use a professional blockchain explorer. */ isInitSync ? getEnv("API_STELLAR_HORIZON_INITIAL_FETCH_MAX_OPERATIONS") : undefined)) || []; const allOperations = mergeOps(oldOperations, newOperations); const assetOperations = []; allOperations.forEach(operation => { if (operation?.extra?.assetCode && operation?.extra?.assetIssuer && !["OPT_IN", "OPT_OUT"].includes(operation.type)) { assetOperations.push(operation); } }); const subAccounts = buildSubAccounts({ currency, accountId, assets, syncConfig, operations: assetOperations, }) || []; const shape = { id: accountId, balance, spendableBalance, operationsCount: allOperations.length, blockHeight, subAccounts, }; return { ...shape, operations: allOperations.map(op => { const subOperations = inferSubOperations(op.hash, subAccounts); return { ...op, subOperations, }; }), }; }; //# sourceMappingURL=synchronization.js.map