From 7e673509df5f19a07881a42bdabf8394db7b6f20 Mon Sep 17 00:00:00 2001 From: Arjun Porwal <65214523+ap211unitech@users.noreply.github.com> Date: Tue, 27 May 2025 10:53:09 +0530 Subject: [PATCH] fix: improve amount error calculation by considering OpenGov-related locks (#11578) --- .../page-staking2/src/Pools/useAmountError.ts | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/page-staking2/src/Pools/useAmountError.ts b/packages/page-staking2/src/Pools/useAmountError.ts index fb91366171..830f800a06 100644 --- a/packages/page-staking2/src/Pools/useAmountError.ts +++ b/packages/page-staking2/src/Pools/useAmountError.ts @@ -7,16 +7,35 @@ import type { BN } from '@polkadot/util'; import { useMemo } from 'react'; import { createNamedHook, useApi, useCall } from '@polkadot/react-hooks'; +import { BN_ZERO, hexToString } from '@polkadot/util'; + +// Consider only OpenGov-related locks +const openGovLockIds = ['referenda', 'convictionVoting', 'pyconvot']; function useAmountErrorImpl (accountId?: string | null, amount?: BN | null, minAmount?: BN | null): boolean { const { api } = useApi(); const balances = useCall(!!accountId && api.derive.balances.all, [accountId]); return useMemo( - () => !amount || amount.isZero() || !minAmount || minAmount.gt(amount) || ( - !!balances && - amount.gt((balances.transferable || balances.availableBalance).sub(api.consts.balances.existentialDeposit)) - ), + () => { + if (!amount || amount.isZero() || !minAmount || minAmount.gt(amount) || !balances) { + return true; + } + + // Filter out OpenGov-related locks (those that don't prevent staking) + const openGovLocks = balances.lockedBreakdown.filter((lock) => { + return openGovLockIds.includes(hexToString(lock.id.toHex())); + }); + + // Total locked amount that affects staking + const openGovLockedBalance = openGovLocks.reduce((acc, lock) => acc.add(lock.amount), BN_ZERO); + + const usableBalance = (balances.transferable || balances.availableBalance) + .add(openGovLockedBalance) + .sub(api.consts.balances.existentialDeposit); + + return amount.gt(usableBalance); + }, [api, amount, balances, minAmount] ); }