Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/libs/LibTokenizedVaultStaking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
3 changes: 3 additions & 0 deletions src/shared/CustomErrors.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
9 changes: 8 additions & 1 deletion test/T06Staking.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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);

Expand Down
Loading