Skip to content

Commit

Permalink
Staking updates (#294)
Browse files Browse the repository at this point in the history
* more efficient way of storing state for Staking contracts

* [M-1] Block gas limit can be exceeded during setTimeUnit() and setRewardsPerUnit() when staker count grows

* [C-1] Contract admins can lock staked tokens in the contract

* [M-1] revised fix for Staking1155

* [H-1] TokenStake.sol rewards can be over- or under-awarded when the staking and reward tokens have different decimals

* [M-2] ERC721 and ERC1155 tokens safe-transferred directly to contract will be locked and unrecoverable

* [C-1] revised fix for large rewardsPerUnitTime

* [L-1] Incorrect ERC165 implementation for NFTStake and EditionStake

* [Q-2] Normalize support for ERC2771 trusted forwarder

* [Q-3] Reentrancy init called twice

* [Q-5] unitTime and rewardsPerUnitTime setter functions don’t check for new input data

* [Q-6] getStakeInfo should be marked as external

* [G-1] Halt array iteration after staker removed during withdraw()

* [G-2] Loop reading from storage array length

* [Q-7] Missing reward balance information

* [M-3] TokenStake.sol: Double entry-point ERC20 tokens could be drained from the staking contract

* [H-2] TokenStake.sol: Tokens with a tax on transfer will account for inaccurate amounts

* virtual functions for bases

* docs

* v3.2.9

Co-authored-by: Krishang <krishang@thirdweb.com>
  • Loading branch information
kumaryash90 and nkrishang authored Dec 11, 2022
1 parent 3014c2c commit 3d04ee7
Showing 36 changed files with 2,853 additions and 938 deletions.
10 changes: 7 additions & 3 deletions contracts/base/Staking1155Base.sol
Original file line number Diff line number Diff line change
@@ -43,12 +43,16 @@ contract Staking1155Base is ContractMetadata, Multicall, Ownable, Staking1155 {
address _rewardToken
) Staking1155(_edition) {
_setupOwner(msg.sender);
_setDefaultTimeUnit(_defaultTimeUnit);
_setDefaultRewardsPerUnitTime(_defaultRewardsPerUnitTime);
_setDefaultStakingCondition(_defaultTimeUnit, _defaultRewardsPerUnitTime);

rewardToken = _rewardToken;
}

/// @notice View total rewards available in the staking contract.
function getRewardTokenBalance() external view virtual override returns (uint256 _rewardsAvailableInContract) {
return IERC20(rewardToken).balanceOf(address(this));
}

/*//////////////////////////////////////////////////////////////
Minting logic
//////////////////////////////////////////////////////////////*/
@@ -79,7 +83,7 @@ contract Staking1155Base is ContractMetadata, Multicall, Ownable, Staking1155 {
//////////////////////////////////////////////////////////////*/

/// @dev Returns whether staking restrictions can be set in given execution context.
function _canSetStakeConditions() internal view override returns (bool) {
function _canSetStakeConditions() internal view virtual override returns (bool) {
return msg.sender == owner();
}

13 changes: 9 additions & 4 deletions contracts/base/Staking20Base.sol
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import "../extension/Ownable.sol";
import "../extension/Staking20.sol";

import "../eip/interface/IERC20.sol";
import "../eip/interface/IERC20Metadata.sol";

/**
* note: This is a Beta release.
@@ -42,15 +43,19 @@ contract Staking20Base is ContractMetadata, Multicall, Ownable, Staking20 {
uint256 _rewardRatioDenominator,
address _stakingToken,
address _rewardToken
) Staking20(_stakingToken) {
) Staking20(_stakingToken, IERC20Metadata(_stakingToken).decimals(), IERC20Metadata(_rewardToken).decimals()) {
_setupOwner(msg.sender);
_setTimeUnit(_timeUnit);
_setRewardRatio(_rewardRatioNumerator, _rewardRatioDenominator);
_setStakingCondition(_timeUnit, _rewardRatioNumerator, _rewardRatioDenominator);

require(_rewardToken != _stakingToken, "Reward Token and Staking Token can't be same.");
rewardToken = _rewardToken;
}

/// @notice View total rewards available in the staking contract.
function getRewardTokenBalance() external view virtual override returns (uint256 _rewardsAvailableInContract) {
return IERC20(rewardToken).balanceOf(address(this));
}

/*//////////////////////////////////////////////////////////////
Minting logic
//////////////////////////////////////////////////////////////*/
@@ -81,7 +86,7 @@ contract Staking20Base is ContractMetadata, Multicall, Ownable, Staking20 {
//////////////////////////////////////////////////////////////*/

/// @dev Returns whether staking restrictions can be set in given execution context.
function _canSetStakeConditions() internal view override returns (bool) {
function _canSetStakeConditions() internal view virtual override returns (bool) {
return msg.sender == owner();
}

14 changes: 9 additions & 5 deletions contracts/base/Staking721Base.sol
Original file line number Diff line number Diff line change
@@ -37,18 +37,22 @@ contract Staking721Base is ContractMetadata, Multicall, Ownable, Staking721 {
address public rewardToken;

constructor(
uint256 _timeUnit,
uint256 _rewardsPerUnitTime,
uint128 _timeUnit,
uint128 _rewardsPerUnitTime,
address _nftCollection,
address _rewardToken
) Staking721(_nftCollection) {
_setupOwner(msg.sender);
_setTimeUnit(_timeUnit);
_setRewardsPerUnitTime(_rewardsPerUnitTime);
_setStakingCondition(_timeUnit, _rewardsPerUnitTime);

rewardToken = _rewardToken;
}

/// @notice View total rewards available in the staking contract.
function getRewardTokenBalance() external view virtual override returns (uint256 _rewardsAvailableInContract) {
return IERC20(rewardToken).balanceOf(address(this));
}

/*//////////////////////////////////////////////////////////////
Minting logic
//////////////////////////////////////////////////////////////*/
@@ -79,7 +83,7 @@ contract Staking721Base is ContractMetadata, Multicall, Ownable, Staking721 {
//////////////////////////////////////////////////////////////*/

/// @dev Returns whether staking restrictions can be set in given execution context.
function _canSetStakeConditions() internal view override returns (bool) {
function _canSetStakeConditions() internal view virtual override returns (bool) {
return msg.sender == owner();
}

Loading

0 comments on commit 3d04ee7

Please sign in to comment.