@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
79 lines (70 loc) • 2.47 kB
text/typescript
import { getCurrentSolanaPreloadData } from "@ledgerhq/coin-solana/preload-data";
import { stakeActions } from "@ledgerhq/coin-solana/logic";
import { LEDGER_VALIDATORS_VOTE_ACCOUNTS } from "@ledgerhq/coin-solana/utils";
import type { SolanaAccount } from "@ledgerhq/coin-solana/types";
import type { ValidatorsAppValidator } from "@ledgerhq/coin-solana/network/validator-app/index";
import { isAccountEmpty } from "../../account";
export interface AccountBannerState {
display: boolean;
redelegate: boolean;
stakeAccAddr: string;
ledgerValidator: ValidatorsAppValidator | undefined;
}
export function getAccountBannerState(account: SolanaAccount): AccountBannerState {
// Group current validator
const solanaResources = account.solanaResources ? account.solanaResources : { stakes: [] };
const delegations = solanaResources?.stakes.map(delegation => {
return delegation;
});
// Get ledger validator data
const { validators } = getCurrentSolanaPreloadData(account.currency) ?? {
validators: [],
};
const ledgerValidator = validators.find(validator =>
LEDGER_VALIDATORS_VOTE_ACCOUNTS.includes(validator.voteAccount),
);
// If Ledger doesn't provide validator, we don't display banner
if (!ledgerValidator) {
return {
display: false,
redelegate: false,
stakeAccAddr: "",
ledgerValidator,
};
}
let redelegate = false;
let stakeAccAddr = "";
let display = false;
// Find user current worst validator (default validator is ledger)
let worstValidator = ledgerValidator;
for (const delegation of delegations) {
const validatorAdress = delegation.delegation?.voteAccAddr;
const validator = validators.find(validator => validator.voteAccount === validatorAdress);
const actions = stakeActions(delegation);
const isValidRedelegation =
validator &&
!LEDGER_VALIDATORS_VOTE_ACCOUNTS.includes(validatorAdress) &&
worstValidator.commission <= validator.commission &&
actions.includes("deactivate");
if (isValidRedelegation) {
stakeAccAddr = delegation.stakeAccAddr;
worstValidator = validator;
}
}
if (worstValidator) {
if (LEDGER_VALIDATORS_VOTE_ACCOUNTS.includes(worstValidator?.voteAccount)) {
if (!isAccountEmpty(account)) {
display = true;
}
} else {
redelegate = true;
display = true;
}
}
return {
display,
redelegate,
stakeAccAddr,
ledgerValidator,
};
}