@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
89 lines (75 loc) • 2.51 kB
text/typescript
import type { MultiversXAccount, MultiversXProvider } from "./types";
import { MultiversXDelegation, MultiversXPreloadData } from "./types";
import { MULTIVERSX_LEDGER_VALIDATOR_ADDRESS } from "./constants";
import { hasMinimumDelegableBalance } from "@ledgerhq/coin-multiversx/helpers/hasMinimumDelegableBalance";
interface AccountBannerHiddenState {
bannerType: "hidden";
}
interface AccountBannerDelegateState {
bannerType: "delegate";
}
interface AccountBannerRedelegateState {
bannerType: "redelegate";
worstDelegation: MultiversXDelegation;
}
export type AccountBannerState =
| AccountBannerDelegateState
| AccountBannerRedelegateState
| AccountBannerHiddenState;
function getWorstValidator(
delegations: MultiversXDelegation[],
validators: MultiversXProvider[],
ledgerValidator: MultiversXProvider,
) {
return delegations.reduce((worstValidator, delegation) => {
const validator = validators.find(validator => validator.contract === delegation.contract);
if (validator && validator.aprValue < worstValidator.aprValue) {
return validator;
}
return worstValidator;
}, ledgerValidator);
}
export function getAccountBannerState(
account: MultiversXAccount,
multiversxPreloadData: MultiversXPreloadData,
): AccountBannerState {
const { validators } = multiversxPreloadData;
const multiversxResources = account.multiversxResources
? account.multiversxResources
: { delegations: [] as MultiversXDelegation[] };
const hasDelegations = multiversxResources.delegations.length > 0;
const ledgerValidator = validators.find(
validator => validator.contract === MULTIVERSX_LEDGER_VALIDATOR_ADDRESS,
);
// // if Ledger doesn't provide validator, we don't display banner
if (!ledgerValidator) {
return {
bannerType: "hidden",
};
}
if (hasDelegations) {
const worstValidator: MultiversXProvider = getWorstValidator(
multiversxResources.delegations,
validators,
ledgerValidator,
);
if (worstValidator.contract !== ledgerValidator.contract) {
const worstDelegation = multiversxResources.delegations.find(
delegation => delegation.contract === worstValidator.contract,
);
if (!worstDelegation) return { bannerType: "hidden" };
return {
bannerType: "redelegate",
worstDelegation,
};
}
}
if (hasMinimumDelegableBalance(account)) {
return {
bannerType: "delegate",
};
}
return {
bannerType: "hidden",
};
}