Skip to main content

Staking ERC20 Base

import "@thirdweb-dev/contracts/base/Staking20Base.sol";

The Staking20Base smart contract implements ERC20 token staking mechanism. It creates a composition of two ERC20 token contracts into a staking mechanism.

The base contract provides an implementation of staking logic. Contract admins can implement their own reward mechanisms by overriding existing functions.

Detected Extensions

Once deployed, you can use the features made available by these extensions on the SDK and dashboard:

Click on each feature to learn more about what functions are available.

Usage

Import the contract and inherit from it.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/base/Staking20Base.sol";

contract MyContract is Staking20Base {
constructor(
address _defaultAdmin,
uint256 _timeUnit,
uint256 _rewardRatioNumerator,
uint256 _rewardRatioDenominator,
address _stakingToken,
address _rewardToken,
address _nativeTokenWrapper
)
Staking20Base(
_defaultAdmin,
_timeUnit,
_rewardRatioNumerator,
_rewardRatioDenominator,
_stakingToken,
_rewardToken,
_nativeTokenWrapper
)
{}
}

Functions to Override

The following functions have been implemented on this contract & are available to be overridden to add custom logic:

_mintRewards
    /**
* @dev Mint ERC20 rewards to the staker. Must override.
*
* @param _staker Address for which to calculated rewards.
* @param _rewards Amount of tokens to be given out as reward.
*
*/
function _mintRewards(address _staker, uint256 _rewards) internal virtual override {
// Mint or transfer reward-tokens here.
// e.g.
//
// IERC20(rewardToken).transfer(_staker, _rewards);
//
// OR
//
// Use a mintable ERC20, such as thirdweb's `TokenERC20.sol`
//
// TokenERC20(rewardToken).mintTo(_staker, _rewards);
// note: The staking contract should have minter role to mint tokens.
}