diff --git a/src/libs/LibTokenizedVaultStaking.sol b/src/libs/LibTokenizedVaultStaking.sol index e62cc7f3..2bf90843 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, InvalidIntervalSecondsValue, InvalidTokenRewardAmount, EntityDoesNotExist, InitDateTooFar, IntervalOutOfRange, BoostDividerNotEqualError, InvalidTokenId, InvalidStakingAmount, InvalidStaker } from "../shared/CustomErrors.sol"; +import { StakingConfigDoesNotExist, StakingNotStarted, StakingAlreadyStarted, IntervalRewardPayedOutAlready, InvalidAValue, InvalidRValue, InvalidDividerValue, InvalidStakingInitDate, InvalidIntervalSecondsValue, InvalidTokenRewardAmount, EntityDoesNotExist, InitDateTooFar, IntervalOutOfRange, BoostDividerNotEqualError, 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); @@ -97,6 +97,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 6f618369..ad8de610 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); + /// @dev Invalid A parameter value provided error InvalidAValue(); diff --git a/test/T06Staking.t.sol b/test/T06Staking.t.sol index 21d87a1e..fff5b35a 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,13 @@ contract T06Staking is D03ProtocolDefaults { nayms.payReward(makeId(LC.OBJECT_TYPE_STAKING_REWARD, bytes20("reward1")), nlf.entityId, usdcId, 100 ether); } + function test_payRewardWithoutEnablingStaking() public { + 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);