Skip to content

Commit 8de5ac0

Browse files
committed
pull from main
2 parents 42c1785 + da18697 commit 8de5ac0

36 files changed

+8913
-80
lines changed

contracts/base/Staking1155Base.sol

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity ^0.8.0;
3+
4+
import "../extension/ContractMetadata.sol";
5+
import "../extension/Multicall.sol";
6+
import "../extension/Ownable.sol";
7+
import "../extension/Staking1155.sol";
8+
9+
import "../eip/interface/IERC20.sol";
10+
11+
/**
12+
* note: This is a Beta release.
13+
*
14+
* EXTENSION: Staking1155
15+
*
16+
* The `Staking1155Base` smart contract implements NFT staking mechanism.
17+
* Allows users to stake their ERC-1155 NFTs and earn rewards in form of ERC-20 tokens.
18+
*
19+
* Following features and implementation setup must be noted:
20+
*
21+
* - ERC-1155 NFTs from only one collection can be staked.
22+
*
23+
* - Contract admin can choose to give out rewards by either transferring or minting the rewardToken,
24+
* which is an ERC20 token. See {_mintRewards}.
25+
*
26+
* - To implement custom logic for staking, reward calculation, etc. corresponding functions can be
27+
* overridden from the extension `Staking1155`.
28+
*
29+
* - Ownership of the contract, with the ability to restrict certain functions to
30+
* only be called by the contract's owner.
31+
*
32+
* - Multicall capability to perform multiple actions atomically.
33+
*
34+
*/
35+
contract Staking1155Base is ContractMetadata, Multicall, Ownable, Staking1155 {
36+
/// @dev ERC20 Reward Token address. See {_mintRewards} below.
37+
address public rewardToken;
38+
39+
constructor(
40+
uint256 _defaultTimeUnit,
41+
uint256 _defaultRewardsPerUnitTime,
42+
address _edition,
43+
address _rewardToken
44+
) Staking1155(_edition) {
45+
_setupOwner(msg.sender);
46+
_setDefaultTimeUnit(_defaultTimeUnit);
47+
_setDefaultRewardsPerUnitTime(_defaultRewardsPerUnitTime);
48+
49+
rewardToken = _rewardToken;
50+
}
51+
52+
/*//////////////////////////////////////////////////////////////
53+
Minting logic
54+
//////////////////////////////////////////////////////////////*/
55+
56+
/**
57+
* @dev Mint ERC20 rewards to the staker. Must override.
58+
*
59+
* @param _staker Address for which to calculated rewards.
60+
* @param _rewards Amount of tokens to be given out as reward.
61+
*
62+
*/
63+
function _mintRewards(address _staker, uint256 _rewards) internal override {
64+
// Mint or transfer reward-tokens here.
65+
// e.g.
66+
//
67+
// IERC20(rewardToken).transfer(_staker, _rewards);
68+
//
69+
// OR
70+
//
71+
// Use a mintable ERC20, such as thirdweb's `TokenERC20.sol`
72+
//
73+
// TokenERC20(rewardToken).mintTo(_staker, _rewards);
74+
// note: The staking contract should have minter role to mint tokens.
75+
}
76+
77+
/*//////////////////////////////////////////////////////////////
78+
Other Internal functions
79+
//////////////////////////////////////////////////////////////*/
80+
81+
/// @dev Returns whether staking restrictions can be set in given execution context.
82+
function _canSetStakeConditions() internal view override returns (bool) {
83+
return msg.sender == owner();
84+
}
85+
86+
/// @dev Returns whether contract metadata can be set in the given execution context.
87+
function _canSetContractURI() internal view virtual override returns (bool) {
88+
return msg.sender == owner();
89+
}
90+
91+
/// @dev Returns whether owner can be set in the given execution context.
92+
function _canSetOwner() internal view virtual override returns (bool) {
93+
return msg.sender == owner();
94+
}
95+
}

contracts/base/Staking20Base.sol

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity ^0.8.0;
3+
4+
import "../extension/ContractMetadata.sol";
5+
import "../extension/Multicall.sol";
6+
import "../extension/Ownable.sol";
7+
import "../extension/Staking20.sol";
8+
9+
import "../eip/interface/IERC20.sol";
10+
11+
/**
12+
* note: This is a Beta release.
13+
*
14+
* EXTENSION: Staking20
15+
*
16+
* The `Staking20Base` smart contract implements Token staking mechanism.
17+
* Allows users to stake their ERC-20 Tokens and earn rewards in form of another ERC-20 tokens.
18+
*
19+
* Following features and implementation setup must be noted:
20+
*
21+
* - ERC-20 Tokens from only one contract can be staked.
22+
*
23+
* - Contract admin can choose to give out rewards by either transferring or minting the rewardToken,
24+
* which is ideally a different ERC20 token. See {_mintRewards}.
25+
*
26+
* - To implement custom logic for staking, reward calculation, etc. corresponding functions can be
27+
* overridden from the extension `Staking20`.
28+
*
29+
* - Ownership of the contract, with the ability to restrict certain functions to
30+
* only be called by the contract's owner.
31+
*
32+
* - Multicall capability to perform multiple actions atomically.
33+
*
34+
*/
35+
contract Staking20Base is ContractMetadata, Multicall, Ownable, Staking20 {
36+
/// @dev ERC20 Reward Token address. See {_mintRewards} below.
37+
address public rewardToken;
38+
39+
constructor(
40+
uint256 _timeUnit,
41+
uint256 _rewardRatioNumerator,
42+
uint256 _rewardRatioDenominator,
43+
address _stakingToken,
44+
address _rewardToken
45+
) Staking20(_stakingToken) {
46+
_setupOwner(msg.sender);
47+
_setTimeUnit(_timeUnit);
48+
_setRewardRatio(_rewardRatioNumerator, _rewardRatioDenominator);
49+
50+
require(_rewardToken != _stakingToken, "Reward Token and Staking Token can't be same.");
51+
rewardToken = _rewardToken;
52+
}
53+
54+
/*//////////////////////////////////////////////////////////////
55+
Minting logic
56+
//////////////////////////////////////////////////////////////*/
57+
58+
/**
59+
* @dev Mint ERC20 rewards to the staker. Must override.
60+
*
61+
* @param _staker Address for which to calculated rewards.
62+
* @param _rewards Amount of tokens to be given out as reward.
63+
*
64+
*/
65+
function _mintRewards(address _staker, uint256 _rewards) internal override {
66+
// Mint or transfer reward-tokens here.
67+
// e.g.
68+
//
69+
// IERC20(rewardToken).transfer(_staker, _rewards);
70+
//
71+
// OR
72+
//
73+
// Use a mintable ERC20, such as thirdweb's `TokenERC20.sol`
74+
//
75+
// TokenERC20(rewardToken).mintTo(_staker, _rewards);
76+
// note: The staking contract should have minter role to mint tokens.
77+
}
78+
79+
/*//////////////////////////////////////////////////////////////
80+
Other Internal functions
81+
//////////////////////////////////////////////////////////////*/
82+
83+
/// @dev Returns whether staking restrictions can be set in given execution context.
84+
function _canSetStakeConditions() internal view override returns (bool) {
85+
return msg.sender == owner();
86+
}
87+
88+
/// @dev Returns whether contract metadata can be set in the given execution context.
89+
function _canSetContractURI() internal view virtual override returns (bool) {
90+
return msg.sender == owner();
91+
}
92+
93+
/// @dev Returns whether owner can be set in the given execution context.
94+
function _canSetOwner() internal view virtual override returns (bool) {
95+
return msg.sender == owner();
96+
}
97+
}

0 commit comments

Comments
 (0)