@ledgerhq/coin-icon
Version: 
Ledger Icon Coin integration
60 lines • 2.34 kB
JavaScript
import { encodeAccountId } from "@ledgerhq/coin-framework/account/accountId";
import { mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
import { getAccount, getCurrentBlockHeight, getOperations } from "./api";
import BigNumber from "bignumber.js";
import { getDelegation } from "./api/node";
import { convertICXtoLoop } from "./logic";
export const getAccountShape = async (info) => {
    const { address, initialAccount, currency, derivationMode } = info;
    const accountId = encodeAccountId({
        type: "js",
        version: "2",
        currencyId: currency.id,
        xpubOrAddress: address,
        derivationMode,
    });
    try {
        const oldOperations = initialAccount?.operations || [];
        const blockHeight = await getCurrentBlockHeight(currency);
        const iconAccount = await getAccount(info.address, currency);
        // Merge new operations with the previously synced ones
        const newOperations = await getOperations(accountId, address, 0, // skip === 0 is the lastest transaction
        currency, iconAccount?.contract_updated_block - oldOperations.length);
        const operations = mergeOps(oldOperations, newOperations);
        const delegationData = await getDelegation(address, currency);
        const iconResources = {
            nonce: 0,
            totalDelegated: delegationData.totalDelegated,
            votingPower: delegationData.votingPower,
        };
        const balance = convertICXtoLoop(iconAccount?.balance || 0);
        const spendableBalance = balance
            .minus(iconResources.totalDelegated)
            .minus(iconResources.votingPower);
        return {
            id: accountId,
            balance,
            spendableBalance,
            operationsCount: operations.length,
            blockHeight,
            iconResources,
            operations,
        };
    }
    catch (error) {
        return {
            id: accountId,
            balance: new BigNumber(0),
            spendableBalance: new BigNumber(0),
            operationsCount: 0,
            iconResources: {
                nonce: 0,
                totalDelegated: new BigNumber(0),
                votingPower: new BigNumber(0),
            },
            blockHeight: 0,
            operations: [],
        };
    }
};
//# sourceMappingURL=synchronization.js.map