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(