Skip to content

Commit 4c8db66

Browse files
committed
refactor: failed delayed stake handling now relies on a try/catch block rather a returned error enum
1 parent 0cf0ec4 commit 4c8db66

File tree

5 files changed

+34
-61
lines changed

5 files changed

+34
-61
lines changed

contracts/src/arbitration/KlerosCoreXBase.sol

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ abstract contract KlerosCoreXBase is IArbitratorV2, Initializable, UUPSProxiable
465465
/// @param _newStake The new stake.
466466
/// Note that the existing delayed stake will be nullified as non-relevant.
467467
function setStake(uint96 _courtID, uint256 _newStake) external virtual whenNotPaused {
468-
_setStake(msg.sender, _courtID, _newStake, OnError.Revert);
468+
_setStake(msg.sender, _courtID, _newStake);
469469
}
470470

471471
/// @notice Executes a stake change initiated by the system (e.g., processing a delayed stake).
@@ -479,8 +479,7 @@ abstract contract KlerosCoreXBase is IArbitratorV2, Initializable, UUPSProxiable
479479
uint96 _courtID,
480480
uint256 _newStake
481481
) external onlyStakeController returns (bool success) {
482-
// TODO: use TRY/CATCH ?? then delete _stakingFailed()
483-
return _setStake(_account, _courtID, _newStake, OnError.Return);
482+
return _setStake(_account, _courtID, _newStake);
484483
}
485484

486485
/// @inheritdoc IArbitratorV2
@@ -1078,16 +1077,13 @@ abstract contract KlerosCoreXBase is IArbitratorV2, Initializable, UUPSProxiable
10781077
/// @param _account The account to set the stake for.
10791078
/// @param _courtID The ID of the court to set the stake for.
10801079
/// @param _newStake The new stake.
1081-
/// @param _onError Whether to revert or return false on error.
1082-
/// @return Whether the stake was successfully set or not.
1083-
function _setStake(address _account, uint96 _courtID, uint256 _newStake, OnError _onError) internal returns (bool) {
1080+
/// @return success Whether the stake was successfully set or not.
1081+
function _setStake(address _account, uint96 _courtID, uint256 _newStake) internal returns (bool success) {
10841082
if (_courtID == FORKING_COURT || _courtID >= courts.length) {
1085-
_stakingFailed(_onError, StakingResult.CannotStakeInThisCourt); // Staking directly into the forking court is not allowed.
1086-
return false;
1083+
revert StakingNotPossibleInThisCourt();
10871084
}
10881085
if (_newStake != 0 && _newStake < courts[_courtID].minStake) {
1089-
_stakingFailed(_onError, StakingResult.CannotStakeLessThanMinStake); // Staking less than the minimum stake is not allowed.
1090-
return false;
1086+
revert StakingLessThanCourtMinStake();
10911087
}
10921088
(uint256 pnkDeposit, uint256 pnkWithdrawal, StakingResult stakingResult) = stakeController.setStake(
10931089
_account,
@@ -1097,40 +1093,21 @@ abstract contract KlerosCoreXBase is IArbitratorV2, Initializable, UUPSProxiable
10971093
if (stakingResult == StakingResult.Delayed) {
10981094
return true;
10991095
}
1100-
if (stakingResult != StakingResult.Successful) {
1101-
_stakingFailed(_onError, stakingResult);
1102-
return false;
1103-
}
11041096
if (pnkDeposit > 0) {
11051097
try vault.deposit(_account, pnkDeposit) {
1106-
// Successfully deposited PNK
1098+
success = true;
11071099
} catch {
1108-
// Revert with a specific error or reuse existing one
1109-
_stakingFailed(_onError, StakingResult.StakingTransferFailed); // Indicating failure in the deposit part of staking
1110-
return false;
1100+
success = false;
11111101
}
11121102
}
11131103
if (pnkWithdrawal > 0) {
11141104
try vault.withdraw(_account, pnkWithdrawal) {
1115-
// Successfully withdrew PNK via Vault
1105+
success = true;
11161106
} catch {
1117-
// Revert with a specific error or reuse existing one
1118-
_stakingFailed(_onError, StakingResult.UnstakingTransferFailed); // Indicating failure in the withdrawal part of unstaking
1119-
return false;
1107+
success = false;
11201108
}
11211109
}
1122-
return true;
1123-
}
1124-
1125-
/// @dev It may revert depending on the _onError parameter.
1126-
function _stakingFailed(OnError _onError, StakingResult _result) internal pure virtual {
1127-
if (_onError == OnError.Return) return;
1128-
if (_result == StakingResult.StakingTransferFailed) revert StakingTransferFailed();
1129-
if (_result == StakingResult.UnstakingTransferFailed) revert UnstakingTransferFailed();
1130-
if (_result == StakingResult.CannotStakeInMoreCourts) revert StakingInTooManyCourts();
1131-
if (_result == StakingResult.CannotStakeInThisCourt) revert StakingNotPossibleInThisCourt();
1132-
if (_result == StakingResult.CannotStakeLessThanMinStake) revert StakingLessThanCourtMinStake();
1133-
if (_result == StakingResult.CannotStakeZeroWhenNoStake) revert StakingZeroWhenNoStake();
1110+
return success;
11341111
}
11351112

11361113
/// @dev Gets a court ID, the minimum number of jurors and an ID of a dispute kit from a specified extra data bytes array.
@@ -1181,8 +1158,6 @@ abstract contract KlerosCoreXBase is IArbitratorV2, Initializable, UUPSProxiable
11811158
error InvalidForkingCourtAsParent();
11821159
error WrongDisputeKitIndex();
11831160
error CannotDisableClassicDK();
1184-
error StakingZeroWhenNoStake();
1185-
error StakingInTooManyCourts();
11861161
error StakingNotPossibleInThisCourt();
11871162
error StakingLessThanCourtMinStake();
11881163
error StakingTransferFailed();

contracts/src/arbitration/KlerosCoreXNeo.sol

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,9 @@ contract KlerosCoreXNeo is KlerosCoreXBase {
9696
return super._createDispute(_numberOfChoices, _extraData, _feeToken, _feeAmount);
9797
}
9898

99-
function _stakingFailed(OnError _onError, StakingResult _result) internal pure override {
100-
super._stakingFailed(_onError, _result);
101-
if (_result == StakingResult.CannotStakeMoreThanMaxStakePerJuror) revert StakingMoreThanMaxStakePerJuror();
102-
if (_result == StakingResult.CannotStakeMoreThanMaxTotalStaked) revert StakingMoreThanMaxTotalStaked();
103-
}
104-
10599
// ************************************* //
106100
// * Errors * //
107101
// ************************************* //
108102

109-
error StakingMoreThanMaxStakePerJuror();
110-
error StakingMoreThanMaxTotalStaked();
111103
error ArbitrableNotWhitelisted();
112104
}

contracts/src/arbitration/StakeControllerBase.sol

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,11 @@ abstract contract StakeControllerBase is IStakeController, Initializable, UUPSPr
188188
if (delayedStake.account == address(0)) continue;
189189

190190
// Let KlerosCore coordinate stake update and vault deposit/withdrawal.
191-
core.setStakeByController(delayedStake.account, delayedStake.courtID, delayedStake.stake);
191+
try core.setStakeByController(delayedStake.account, delayedStake.courtID, delayedStake.stake) {
192+
// NOP
193+
} catch (bytes memory data) {
194+
emit DelayedStakeSetFailed(data);
195+
}
192196
delete delayedStakes[i];
193197
}
194198
delayedStakeReadIndex = newDelayedStakeReadIndex;
@@ -337,12 +341,9 @@ abstract contract StakeControllerBase is IStakeController, Initializable, UUPSPr
337341

338342
if (phase == Phase.staking) {
339343
if (currentStakeInCourt == 0) {
340-
if (_newStake == 0)
341-
// No change needed
342-
return (0, 0, StakingResult.CannotStakeZeroWhenNoStake);
344+
if (_newStake == 0) revert StakingZeroWhenNoStake();
343345
else if (_newStake > 0 && currentJurorStake.stakedCourtIDs.length >= MAX_STAKE_PATHS)
344-
// Cannot stake in more courts
345-
return (0, 0, StakingResult.CannotStakeInMoreCourts);
346+
revert StakingInTooManyCourts();
346347
}
347348

348349
currentJurorStake.stakes[_courtID] = _newStake;
@@ -374,7 +375,6 @@ abstract contract StakeControllerBase is IStakeController, Initializable, UUPSPr
374375
pnkWithdrawal = currentStakeInCourt - _newStake;
375376
}
376377

377-
// MAX_STAKE_PATHS is checked by _setStakeBySystem() called during executeDelayedStakes().
378378
DelayedStake storage delayedStake = delayedStakes[++delayedStakeWriteIndex];
379379
delayedStake.account = _account;
380380
delayedStake.courtID = _courtID;
@@ -443,8 +443,7 @@ abstract contract StakeControllerBase is IStakeController, Initializable, UUPSPr
443443
continue;
444444
}
445445

446-
// _setStakeBySystem will update local juror stake mappings (jurorStakes)
447-
// AND call sortition.setStake.
446+
// _setStake will update local juror stake mappings (jurorStakes) AND call sortition.setStake.
448447
// The pnkDeposit/pnkWithdrawal are calculated but not used by this import function.
449448
(, , StakingResult stakingResult) = _setStake(account, courtID, stakeToImport);
450449

@@ -517,6 +516,8 @@ abstract contract StakeControllerBase is IStakeController, Initializable, UUPSPr
517516
error RandomNumberNotReady();
518517
error RandomNumberNotReadyYet();
519518
error StillDrawingDisputes();
519+
error StakingZeroWhenNoStake();
520+
error StakingInTooManyCourts();
520521
error NotInStakingPhase();
521522
error NotDrawingPhase();
522523
error NoDelayedStakes();

contracts/src/arbitration/interfaces/IStakeController.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ interface IStakeController {
3636
/// @param _totalStake The amount of tokens staked in all courts
3737
event StakeSet(address indexed _account, uint96 indexed _courtID, uint256 _stakeInCourt, uint256 _totalStake);
3838

39+
/// @notice Emitted when a delayed stake execution fails
40+
/// @param _data The data of the error defined as `abi.encodeWithSelector(CustomError.selector, /*args…*/ )`
41+
event DelayedStakeSetFailed(bytes _data);
42+
3943
// Migration events
4044
event StakeImported(address indexed _juror, uint96 indexed _courtID, uint256 _stake);
4145
event DelayedStakeImported(address indexed _juror, uint96 indexed _courtID, uint256 _stake, uint256 _index);

contracts/src/libraries/Constants.sol

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ uint256 constant DEFAULT_K = 6; // Default number of children per node.
2020
uint256 constant DEFAULT_NB_OF_JURORS = 3; // The default number of jurors in a dispute.
2121
IERC20 constant NATIVE_CURRENCY = IERC20(address(0)); // The native currency, such as ETH on Arbitrum, Optimism and Ethereum L1.
2222

23+
// DEPRECATED
2324
enum OnError {
2425
Revert,
2526
Return
@@ -28,12 +29,12 @@ enum OnError {
2829
enum StakingResult {
2930
Successful,
3031
Delayed,
31-
StakingTransferFailed,
32-
UnstakingTransferFailed,
33-
CannotStakeInMoreCourts,
34-
CannotStakeInThisCourt,
35-
CannotStakeLessThanMinStake,
36-
CannotStakeMoreThanMaxStakePerJuror,
37-
CannotStakeMoreThanMaxTotalStaked,
38-
CannotStakeZeroWhenNoStake
32+
StakingTransferFailed, // DEPRECATED
33+
UnstakingTransferFailed, // DEPRECATED
34+
CannotStakeInMoreCourts, // DEPRECATED
35+
CannotStakeInThisCourt, // DEPRECATED
36+
CannotStakeLessThanMinStake, // DEPRECATED
37+
CannotStakeMoreThanMaxStakePerJuror, // DEPRECATED
38+
CannotStakeMoreThanMaxTotalStaked, // DEPRECATED
39+
CannotStakeZeroWhenNoStake // DEPRECATED
3940
}

0 commit comments

Comments
 (0)