From 38ca89895cebf04771eb4f5fc19f2c05072c3044 Mon Sep 17 00:00:00 2001 From: Huan Zhang Date: Thu, 3 Oct 2024 11:25:41 +0100 Subject: [PATCH 1/3] add check for if staking config exists for payReward --- src/libs/LibTokenizedVaultStaking.sol | 6 +++++- src/shared/CustomErrors.sol | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/LibTokenizedVaultStaking.sol b/src/libs/LibTokenizedVaultStaking.sol index a2bb598b..b5b63f71 100644 --- a/src/libs/LibTokenizedVaultStaking.sol +++ b/src/libs/LibTokenizedVaultStaking.sol @@ -8,7 +8,7 @@ import { LibObject } from "./LibObject.sol"; import { LibTokenizedVault } from "../libs/LibTokenizedVault.sol"; import { StakingConfig, StakingState, RewardsBalances } from "../shared/FreeStructs.sol"; -import { StakingNotStarted, StakingAlreadyStarted, IntervalRewardPayedOutAlready, InvalidAValue, InvalidRValue, InvalidDividerValue, InvalidStakingInitDate, APlusRCannotBeGreaterThanDivider, InvalidIntervalSecondsValue, InvalidTokenRewardAmount, EntityDoesNotExist, InitDateTooFar, IntervalOutOfRange, BoostMultiplierConvergenceFailure, InvalidTokenId, InvalidStakingAmount, InvalidStaker } from "../shared/CustomErrors.sol"; +import { StakingConfigDoesNotExist, StakingNotStarted, StakingAlreadyStarted, IntervalRewardPayedOutAlready, InvalidAValue, InvalidRValue, InvalidDividerValue, InvalidStakingInitDate, APlusRCannotBeGreaterThanDivider, InvalidIntervalSecondsValue, InvalidTokenRewardAmount, EntityDoesNotExist, InitDateTooFar, IntervalOutOfRange, BoostMultiplierConvergenceFailure, InvalidTokenId, InvalidStakingAmount, InvalidStaker } from "../shared/CustomErrors.sol"; library LibTokenizedVaultStaking { event TokenStakingStarted(bytes32 indexed entityId, bytes32 tokenId, uint256 initDate, uint64 a, uint64 r, uint64 divider, uint64 interval); @@ -82,6 +82,10 @@ library LibTokenizedVaultStaking { function _payReward(bytes32 _stakingRewardId, bytes32 _entityId, bytes32 _rewardTokenId, uint256 _rewardAmount) internal { AppStorage storage s = LibAppStorage.diamondStorage(); + if (s.stakingConfigs[_entityId].initDate == 0) { + revert StakingConfigDoesNotExist(_entityId); + } + if (_rewardAmount <= s.objectMinimumSell[_rewardTokenId]) { revert InvalidTokenRewardAmount(_stakingRewardId, _entityId, _rewardTokenId, _rewardAmount); } diff --git a/src/shared/CustomErrors.sol b/src/shared/CustomErrors.sol index a419679a..6fb5cde8 100644 --- a/src/shared/CustomErrors.sol +++ b/src/shared/CustomErrors.sol @@ -138,6 +138,9 @@ error StakingAlreadyStarted(bytes32 entityId, bytes32 tokenId); /// @dev Staking must be started error StakingNotStarted(bytes32 entityId, bytes32 tokenId); +/// @dev Staking must be enabled +error StakingConfigDoesNotExist(bytes32 entityId, bytes32 tokenId); + /// @dev Invalid A parameter value provided error InvalidAValue(); From 78bdfc30eabc10c483fe2f4ddc1f95caf6d9b988 Mon Sep 17 00:00:00 2001 From: Huan Zhang Date: Thu, 3 Oct 2024 11:36:52 +0100 Subject: [PATCH 2/3] update custom error & add test --- src/shared/CustomErrors.sol | 2 +- test/T06Staking.t.sol | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/shared/CustomErrors.sol b/src/shared/CustomErrors.sol index 6fb5cde8..3dc76d49 100644 --- a/src/shared/CustomErrors.sol +++ b/src/shared/CustomErrors.sol @@ -139,7 +139,7 @@ error StakingAlreadyStarted(bytes32 entityId, bytes32 tokenId); error StakingNotStarted(bytes32 entityId, bytes32 tokenId); /// @dev Staking must be enabled -error StakingConfigDoesNotExist(bytes32 entityId, bytes32 tokenId); +error StakingConfigDoesNotExist(bytes32 entityId); /// @dev Invalid A parameter value provided error InvalidAValue(); diff --git a/test/T06Staking.t.sol b/test/T06Staking.t.sol index d386d4cf..559a85a4 100644 --- a/test/T06Staking.t.sol +++ b/test/T06Staking.t.sol @@ -11,7 +11,7 @@ import { DummyToken } from "./utils/DummyToken.sol"; import { LibTokenizedVaultStaking } from "src/libs/LibTokenizedVaultStaking.sol"; import { IERC20 } from "src/interfaces/IERC20.sol"; -import { IntervalRewardPayedOutAlready, InvalidTokenRewardAmount, InvalidStakingAmount, InvalidStaker, EntityDoesNotExist, StakingAlreadyStarted, StakingNotStarted } from "src/shared/CustomErrors.sol"; +import { IntervalRewardPayedOutAlready, InvalidTokenRewardAmount, InvalidStakingAmount, InvalidStaker, EntityDoesNotExist, StakingAlreadyStarted, StakingNotStarted, StakingConfigDoesNotExist } from "src/shared/CustomErrors.sol"; function makeId2(bytes12 _objecType, bytes20 randomBytes) pure returns (bytes32) { return bytes32((_objecType)) | (bytes32(randomBytes)); @@ -333,6 +333,15 @@ contract T06Staking is D03ProtocolDefaults { nayms.payReward(makeId(LC.OBJECT_TYPE_STAKING_REWARD, bytes20("reward1")), nlf.entityId, usdcId, 100 ether); } + function test_payRewardWithoutEnablingStaking() public { + StakingConfig memory config = nayms.getStakingConfig(nlf.entityId); + + startPrank(nlf); + + vm.expectRevert(abi.encodeWithSelector(StakingConfigDoesNotExist.selector, nlf.entityId)); + nayms.payReward(makeId(LC.OBJECT_TYPE_STAKING_REWARD, bytes20("reward1")), nlf.entityId, usdcId, 100 ether); + } + function test_StakingScenario1() public { initStaking(block.timestamp + stakingStart); From 154c0937675064c9ec9b3107fb5159e0e776fabb Mon Sep 17 00:00:00 2001 From: Huan Zhang Date: Thu, 3 Oct 2024 11:37:27 +0100 Subject: [PATCH 3/3] remove unused var --- test/T06Staking.t.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/T06Staking.t.sol b/test/T06Staking.t.sol index 559a85a4..d0f8d641 100644 --- a/test/T06Staking.t.sol +++ b/test/T06Staking.t.sol @@ -334,8 +334,6 @@ contract T06Staking is D03ProtocolDefaults { } function test_payRewardWithoutEnablingStaking() public { - StakingConfig memory config = nayms.getStakingConfig(nlf.entityId); - startPrank(nlf); vm.expectRevert(abi.encodeWithSelector(StakingConfigDoesNotExist.selector, nlf.entityId));