From 14d952e38ebcd4db08ba5f642c120a599b4fb73a Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Wed, 19 Nov 2025 18:46:15 +0100 Subject: [PATCH] fix: unstake limits for ERC4626 --- .changeset/calm-owls-accept.md | 5 +++++ packages/widget/src/domain/types/stake.ts | 5 +++-- packages/widget/src/domain/types/yields.ts | 3 +++ packages/widget/src/pages/position-details/state/index.tsx | 4 +++- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changeset/calm-owls-accept.md diff --git a/.changeset/calm-owls-accept.md b/.changeset/calm-owls-accept.md new file mode 100644 index 00000000..bdfcc7bb --- /dev/null +++ b/.changeset/calm-owls-accept.md @@ -0,0 +1,5 @@ +--- +"@stakekit/widget": patch +--- + +fix: unstake limits for ERC4626 diff --git a/packages/widget/src/domain/types/stake.ts b/packages/widget/src/domain/types/stake.ts index 726e90ac..115a5b71 100644 --- a/packages/widget/src/domain/types/stake.ts +++ b/packages/widget/src/domain/types/stake.ts @@ -11,6 +11,7 @@ import type { SupportedSKChains } from "./chains"; import type { InitParams } from "./init-params"; import type { PositionsData } from "./positions"; import type { TokenString } from "./tokens"; +import { isBittensorStaking } from "./yields"; const amountGreaterThanZero = (val: TokenBalanceScanResponseDto) => new BigNumber(val.amount).isGreaterThan(0); @@ -197,9 +198,9 @@ export const getMinUnstakeAmount = ( const pricePerShareBN = new BigNumber(pricePerShare ?? 0); - if (pricePerShareBN.isZero()) { + if (pricePerShareBN.isZero() || !isBittensorStaking(yieldDto.id)) { return integrationMin; } - return integrationMin.dividedBy(pricePerShareBN).decimalPlaces(8); + return integrationMin.dividedBy(pricePerShareBN).decimalPlaces(16); }; diff --git a/packages/widget/src/domain/types/yields.ts b/packages/widget/src/domain/types/yields.ts index 96f0b0b1..a080299e 100644 --- a/packages/widget/src/domain/types/yields.ts +++ b/packages/widget/src/domain/types/yields.ts @@ -194,3 +194,6 @@ export const getComputedRewardRate = (yieldDto: YieldDto) => { return yieldDto.rewardRate; }; + +export const isERC4626 = (yieldDto: YieldDto) => + yieldDto.metadata.supportedStandards?.includes("ERC4626") ?? false; diff --git a/packages/widget/src/pages/position-details/state/index.tsx b/packages/widget/src/pages/position-details/state/index.tsx index b5d023d8..45e59edc 100644 --- a/packages/widget/src/pages/position-details/state/index.tsx +++ b/packages/widget/src/pages/position-details/state/index.tsx @@ -18,6 +18,7 @@ import { } from "react"; import { config } from "../../../config"; import { isForceMaxAmount } from "../../../domain/types/stake"; +import { isERC4626 } from "../../../domain/types/yields"; import { usePrices } from "../../../hooks/api/use-prices"; import { useYieldOpportunity } from "../../../hooks/api/use-yield-opportunity"; import { useUnstakeOrPendingActionParams } from "../../../hooks/navigation/use-unstake-or-pending-action-params"; @@ -158,7 +159,8 @@ export const UnstakeOrPendingActionProvider = ({ }); const canChangeUnstakeAmount = integrationData.map( - (d) => !!(!isForceMax && d.args.exit?.args?.amount?.required) + (d) => + !!(!isForceMax && (d.args.exit?.args?.amount?.required || isERC4626(d))) ); const positionBalancesByTypePendingActions = useMemo(