Skip to content

Commit f38db0d

Browse files
authored
Base contract for ERC1155 staking (#283)
base contract for ERC1155 staking
1 parent af41ffb commit f38db0d

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

contracts/base/Staking1155Base.sol

+95
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+
}

lib/forge-std

0 commit comments

Comments
 (0)