Skip to content

Commit

Permalink
Bugfix/multiversx delegation amount miscalculation (LedgerHQ#4364)
Browse files Browse the repository at this point in the history
* Fixed withdraw modal and types (#17)

Co-authored-by: Alexandru Pislariu <57287326+AlexandruPislariu@users.noreply.github.com>

* Fixed the minimum staking balance calculation. (#18)

* Updated the calculation condition.

* Fixed the "delegationEnabled" flag.

* Updated the minimum balance instances with a singular helper function.

* Added changeset.

* Fixed missing import.

---------

Co-authored-by: Miro Mărgineanu <miro.margineanu@elrond.com>
  • Loading branch information
AlexandruPislariu and MiroMargineanu committed Aug 18, 2023
1 parent d0e10a7 commit a4648d5
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 36 deletions.
7 changes: 7 additions & 0 deletions .changeset/cyan-icons-doubt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"ledger-live-desktop": minor
"live-mobile": minor
"@ledgerhq/live-common": minor
---

Fixed improper minimum staking balance calculation.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";
import { useDispatch } from "react-redux";
import { areEarnRewardsEnabled } from "@ledgerhq/live-common/families/elrond/helpers/areEarnRewardsEnabled";
import { hasMinimumDelegableBalance } from "@ledgerhq/live-common/families/elrond/helpers/hasMinimumDelegableBalance";
import { useElrondRandomizedValidators } from "@ledgerhq/live-common/families/elrond/react";
import { openModal } from "~/renderer/actions/modals";
import IconCoins from "~/renderer/icons/Coins";
Expand All @@ -18,7 +18,7 @@ const AccountHeaderManageActions = (props: {
const dispatch = useDispatch();
const validators = useElrondRandomizedValidators();
const earnRewardEnabled = useMemo(
() => account.type === "Account" && areEarnRewardsEnabled(account),
() => account.type === "Account" && hasMinimumDelegableBalance(account),
[account],
);
const hasDelegations =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import styled from "styled-components";
import { BigNumber } from "bignumber.js";
import { useElrondRandomizedValidators } from "@ledgerhq/live-common/families/elrond/react";
import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate";
import { hasMinimumDelegableBalance } from "@ledgerhq/live-common/families/elrond/helpers/hasMinimumDelegableBalance";

import Text from "~/renderer/components/Text";
import Button from "~/renderer/components/Button";
import Box from "~/renderer/components/Box";
Expand Down Expand Up @@ -40,17 +42,10 @@ const Delegation = (props: DelegationPropsType) => {
const [delegationResources, setDelegationResources] = useState<DelegationType[]>(
account.elrondResources ? account.elrondResources.delegations : [],
);

const dispatch = useDispatch();
const delegationEnabled = useMemo(
(): boolean =>
BigNumber(
denominate({
input: account.spendableBalance.toString(),
showLastNonZeroDecimal: true,
}),
).gte(1),
[account.spendableBalance],
);
const delegationEnabled = hasMinimumDelegableBalance(account);

const findValidator = useCallback(
(validator: string) => validators.find(item => item.contract === validator),
[validators],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from "react";
import type { ElrondAccount } from "@ledgerhq/live-common/families/elrond/types";
import { getCurrentElrondPreloadData } from "@ledgerhq/live-common/families/elrond/preload";
import { randomizeProviders } from "@ledgerhq/live-common/families/elrond/helpers/randomizeProviders";
import { MIN_DELEGATION_AMOUNT } from "@ledgerhq/live-common/families/elrond/constants";
import { hasMinimumDelegableBalance } from "@ledgerhq/live-common/families/elrond/helpers/hasMinimumDelegableBalance";
import { IconsLegacy } from "@ledgerhq/native-ui";
import { Trans } from "react-i18next";

Expand Down Expand Up @@ -34,7 +34,7 @@ const getMainActions = ({
parentAccount,
parentRoute,
}: getActionsType): getActionsReturnType => {
const delegationEnabled = account.spendableBalance.isGreaterThanOrEqualTo(MIN_DELEGATION_AMOUNT);
const delegationEnabled = hasMinimumDelegableBalance(account);

/*
* Get a list of all the providers, randomize, and also the screen, conditionally, based on existing amount of delegations.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import React, { useCallback, useMemo } from "react";
import { MIN_DELEGATION_AMOUNT } from "@ledgerhq/live-common/families/elrond/constants";
import { useNavigation } from "@react-navigation/native";
import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { BigNumber } from "bignumber.js";
import { hasMinimumDelegableBalance } from "@ledgerhq/live-common/families/elrond/helpers/hasMinimumDelegableBalance";
import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index";

import BigNumber from "bignumber.js";
import type { StackNavigationProp } from "@react-navigation/stack";

import type { NavigationType } from "../../../../types";
import type { DelegationsPropsType } from "./types";

import AccountDelegationInfo from "../../../../../../components/AccountDelegationInfo";
import AccountSectionLabel from "../../../../../../components/AccountSectionLabel";
import IlluRewards from "../../../../../../icons/images/Rewards";
Expand Down Expand Up @@ -38,10 +37,7 @@ const Delegations = (props: DelegationsPropsType) => {
* Enabled delegations only if the spendable balance is above 1 EGLD.
*/

const delegationEnabled = useMemo(
() => account.spendableBalance.isGreaterThanOrEqualTo(MIN_DELEGATION_AMOUNT),
[account.spendableBalance],
);
const delegationEnabled = hasMinimumDelegableBalance(account);

/*
* Trigger the delegation flow, opening conditionally a screen based on the amount of existing delegations.
Expand Down
4 changes: 2 additions & 2 deletions libs/ledger-live-common/src/families/elrond/banner.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { ElrondAccount, ElrondProvider } from "./types";
import { ElrondDelegation, ElrondPreloadData } from "./types";
import { ELROND_LEDGER_VALIDATOR_ADDRESS } from "./constants";
import { areEarnRewardsEnabled } from "./helpers/areEarnRewardsEnabled";
import { hasMinimumDelegableBalance } from "./helpers/hasMinimumDelegableBalance";

interface AccountBannerHiddenState {
bannerType: "hidden";
Expand Down Expand Up @@ -76,7 +76,7 @@ export function getAccountBannerState(
}
}

if (areEarnRewardsEnabled(account)) {
if (hasMinimumDelegableBalance(account)) {
return {
bannerType: "delegate",
};
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Account } from "@ledgerhq/types-live";

import { MIN_DELEGATION_AMOUNT } from "../constants";

export const hasMinimumDelegableBalance = (account: Account) =>
account.spendableBalance.isGreaterThanOrEqualTo(MIN_DELEGATION_AMOUNT);

0 comments on commit a4648d5

Please sign in to comment.