@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
79 lines (69 loc) • 2.33 kB
text/typescript
import { getCurrentNearPreloadData } from "@ledgerhq/coin-near/preload";
import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/coin-near/constants";
import { canStake, canUnstake } from "@ledgerhq/coin-near/logic";
import type { NearAccount, NearValidatorItem } from "@ledgerhq/coin-near/types";
export interface AccountBannerState {
display: boolean;
redelegate: boolean;
validatorId: string;
ledgerValidator: NearValidatorItem | undefined;
}
export function getAccountBannerState(account: NearAccount): AccountBannerState {
// Group current validator
const nearResources = account.nearResources ? account.nearResources : { stakingPositions: [] };
const delegations = nearResources?.stakingPositions.map(delegation => {
return delegation;
});
// Get ledger validator data
const { validators } = getCurrentNearPreloadData() ?? {
validators: [],
};
const ledgerValidator = validators.find(
validator => validator.validatorAddress === FIGMENT_NEAR_VALIDATOR_ADDRESS,
);
// If Ledger doesn't provide validator, we don't display banner
if (!ledgerValidator) {
return {
display: false,
redelegate: false,
validatorId: "",
ledgerValidator: undefined,
};
}
let redelegate = false;
let validatorId = "";
let display = false;
// Find user current worst validator (default validator is ledger)
let worstValidator = ledgerValidator;
for (const delegation of delegations) {
const validatorAdress = delegation?.validatorId;
const validator = validators.find(validator => validator.validatorAddress === validatorAdress);
const isValidRedelegation =
validator &&
validatorAdress !== ledgerValidator.validatorAddress &&
validator.commission &&
worstValidator.commission &&
worstValidator?.commission <= validator?.commission &&
canUnstake(delegation);
if (isValidRedelegation) {
validatorId = delegation.validatorId;
worstValidator = validator;
}
}
if (worstValidator) {
if (worstValidator?.validatorAddress === ledgerValidator?.validatorAddress) {
if (canStake(account)) {
display = true;
}
} else {
redelegate = true;
display = true;
}
}
return {
display,
redelegate,
validatorId,
ledgerValidator,
};
}