@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
83 lines (74 loc) • 2.64 kB
text/typescript
import cryptoFactory from "@ledgerhq/coin-cosmos/chain/chain";
import { getCurrentCosmosPreloadData } from "@ledgerhq/coin-cosmos/preloadedData";
import { canDelegate, canRedelegate } from "./logic";
import type { CosmosAccount, CosmosValidatorItem } from "./types";
export interface AccountBannerState {
display: boolean;
redelegate: boolean;
validatorSrcAddress: string;
ledgerValidator: CosmosValidatorItem | undefined;
}
export function getAccountBannerState(account: CosmosAccount): AccountBannerState {
// Group current validator
const cosmosResources = account.cosmosResources
? account.cosmosResources
: { delegations: [], redelegations: [] };
const delegationAddresses = cosmosResources.delegations.map(delegation => {
return delegation.validatorAddress;
});
const redelegationAddresses = cosmosResources.redelegations.map(redelegation => {
return redelegation.validatorDstAddress;
});
const validatorAdresses = [...delegationAddresses, ...redelegationAddresses];
const LEDGER_VALIDATOR_ADDRESS = cryptoFactory(account.currency.id).ledgerValidator;
// Get ledger validator data
const { validators } = getCurrentCosmosPreloadData()[account.currency.id] ?? {
validators: [],
};
const ledgerValidator = validators.find(
validator => validator.validatorAddress === LEDGER_VALIDATOR_ADDRESS,
);
// if Ledger doesn't provide validator, we don't display banner
if (!ledgerValidator) {
return {
display: false,
redelegate: false,
validatorSrcAddress: "",
ledgerValidator,
};
}
// Find user current worst validator (default validator is ledger)
let worstValidator = ledgerValidator;
for (let i = 0; i < validatorAdresses.length; i++) {
const validatorAdress = validatorAdresses[i];
const validator = validators.find(validator => validator.validatorAddress === validatorAdress);
if (
validator &&
worstValidator.commission < validator.commission &&
canRedelegate(account, validator)
) {
worstValidator = validator;
}
}
let redelegate = false;
let validatorSrcAddress = "";
let display = false;
if (worstValidator?.validatorAddress === ledgerValidator?.validatorAddress) {
// Not found worst validator than ledger
if (canDelegate(account)) {
// Delegate remaining ATOM (not staked)
display = true;
}
} else {
// Redelegate to the worst validator
display = true;
redelegate = true;
validatorSrcAddress = worstValidator.validatorAddress;
}
return {
display,
redelegate,
validatorSrcAddress,
ledgerValidator,
};
}