Skip to content

Commit a744c1f

Browse files
authored
Merge pull request #1806 from kleros/refactor/min-stake-check
refactor(web): min-stake-check
2 parents 4a84994 + efedc56 commit a744c1f

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-17
lines changed

web/src/pages/Courts/CourtDetails/StakePanel/InputDisplay.tsx

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import React, { useState, useMemo, useEffect } from "react";
22
import styled from "styled-components";
33

4-
import { hoverShortTransitionTiming } from "styles/commonStyles";
5-
64
import { useParams } from "react-router-dom";
75
import { useDebounce } from "react-use";
86

@@ -12,6 +10,10 @@ import { commify, uncommify } from "utils/commify";
1210
import { formatPNK, roundNumberDown } from "utils/format";
1311
import { isUndefined } from "utils/index";
1412

13+
import { useCourtDetails } from "queries/useCourtDetails";
14+
15+
import { hoverShortTransitionTiming } from "styles/commonStyles";
16+
1517
import { NumberInputField } from "components/NumberInputField";
1618

1719
import StakeWithdrawButton, { ActionType } from "./StakeWithdrawButton";
@@ -75,6 +77,7 @@ const InputDisplay: React.FC<IInputDisplay> = ({ action, amount, setAmount }) =>
7577

7678
const { id } = useParams();
7779
const { balance, jurorBalance } = usePnkData({ courtId: id });
80+
const { data: courtDetails } = useCourtDetails(id);
7881

7982
const parsedBalance = formatPNK(balance ?? 0n, 0, true);
8083

@@ -88,10 +91,18 @@ const InputDisplay: React.FC<IInputDisplay> = ({ action, amount, setAmount }) =>
8891
setErrorMsg("Insufficient balance to stake this amount");
8992
} else if (!isStaking && jurorBalance && parsedAmount > jurorBalance[2]) {
9093
setErrorMsg("Insufficient staked amount to withdraw this amount");
94+
} else if (
95+
action === ActionType.stake &&
96+
courtDetails &&
97+
jurorBalance &&
98+
parsedAmount !== 0n &&
99+
jurorBalance[2] + parsedAmount < BigInt(courtDetails?.court?.minStake)
100+
) {
101+
setErrorMsg(`Min Stake in court is: ${formatPNK(courtDetails?.court?.minStake)} PNK`);
91102
} else {
92103
setErrorMsg(undefined);
93104
}
94-
}, [parsedAmount, isStaking, balance, jurorBalance]);
105+
}, [parsedAmount, isStaking, balance, jurorBalance, action, courtDetails]);
95106

96107
return (
97108
<>

web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx

+26-14
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ import {
1515
useSimulatePnkIncreaseAllowance,
1616
useWritePnkIncreaseAllowance,
1717
} from "hooks/contracts/generated";
18-
import { useCourtDetails } from "hooks/queries/useCourtDetails";
1918
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
2019
import { usePnkData } from "hooks/usePNKData";
21-
import { formatETH } from "utils/format";
2220
import { isUndefined } from "utils/index";
2321
import { parseWagmiError } from "utils/parseWagmiError";
2422
import { refetchWithRetry } from "utils/refecthWithRetry";
2523

24+
import { useCourtDetails } from "queries/useCourtDetails";
25+
2626
import { EnsureChain } from "components/EnsureChain";
2727

2828
import StakeWithdrawPopup from "./StakeWithdrawPopup";
@@ -67,9 +67,8 @@ const StakeWithdrawButton: React.FC<IActionButton> = ({
6767
const controllerRef = useRef<AbortController | null>(null);
6868
useLockOverlayScroll(isPopupOpen);
6969

70-
const { data: courtDetails } = useCourtDetails(id);
7170
const { balance, jurorBalance, allowance, refetchAllowance } = usePnkData({ courtId: id });
72-
71+
const { data: courtDetails } = useCourtDetails(id);
7372
const publicClient = usePublicClient();
7473

7574
const isStaking = action === ActionType.stake;
@@ -181,6 +180,16 @@ const StakeWithdrawButton: React.FC<IActionButton> = ({
181180
)
182181
);
183182
});
183+
} else {
184+
updatePopupState(
185+
signal,
186+
getStakeSteps(
187+
StakeSteps.StakeFailed,
188+
...commonArgs,
189+
undefined,
190+
new Error("Simulation Failed. Please restart the process.")
191+
)
192+
);
184193
}
185194
},
186195
[setStake, setStakeConfig, publicClient, amount, theme, action]
@@ -248,20 +257,20 @@ const StakeWithdrawButton: React.FC<IActionButton> = ({
248257

249258
useEffect(() => {
250259
if (isPopupOpen) return;
251-
if (
252-
action === ActionType.stake &&
253-
targetStake !== 0n &&
254-
courtDetails &&
255-
targetStake < BigInt(courtDetails.court?.minStake)
256-
) {
257-
setErrorMsg(`Min Stake in court is: ${formatETH(courtDetails?.court?.minStake)}`);
258-
} else if (setStakeError || allowanceError) {
260+
if (setStakeError || allowanceError) {
259261
setErrorMsg(parseWagmiError(setStakeError || allowanceError));
260262
}
261-
}, [setStakeError, setErrorMsg, targetStake, courtDetails, allowanceError, isPopupOpen, action]);
263+
}, [setStakeError, setErrorMsg, targetStake, allowanceError, isPopupOpen]);
262264

263265
const isDisabled = useMemo(() => {
264-
if (parsedAmount == 0n) return true;
266+
if (
267+
parsedAmount == 0n ||
268+
(action === ActionType.stake &&
269+
targetStake !== 0n &&
270+
courtDetails &&
271+
targetStake < BigInt(courtDetails?.court?.minStake))
272+
)
273+
return true;
265274
if (isAllowance) {
266275
return isUndefined(increaseAllowanceConfig) || isSimulatingAllowance || !isUndefined(allowanceError);
267276
}
@@ -275,6 +284,9 @@ const StakeWithdrawButton: React.FC<IActionButton> = ({
275284
setStakeError,
276285
allowanceError,
277286
isAllowance,
287+
targetStake,
288+
action,
289+
courtDetails,
278290
]);
279291

280292
const closePopup = () => {

0 commit comments

Comments
 (0)