// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
import "@thirdweb-dev/contracts/extension/Staking721.sol";
import "@thirdweb-dev/contracts/eip/interface/IERC20.sol";
 
contract MyContract is Staking721 {
    // ERC20 Reward Token address. See {_mintRewards}.
    address public rewardToken;
 
    /**
     *  We store the contract deployer's address only for the purposes of the example
     *  in the code comment below.
     *
     *  Doing this is not necessary to use the `Staking721` extension.
     */
    address public deployer;
 
    constructor(
        uint256 _timeUnit,
        uint256 _rewardsPerUnitTime,
        address _stakingToken,
        address _rewardToken
    ) Staking721(_stakingToken) {
        _setStakingCondition(_timeUnit, _rewardsPerUnitTime);
 
        rewardToken = _rewardToken;
        deployer = msg.sender;
    }
 
    /**
     *  @dev    Mint/Transfer ERC20 rewards to the staker. Must override.
     *
     *  @param _staker    Address for sending rewards to.
     *  @param _rewards   Amount of tokens to be given out as reward.
     *
     */
    function _mintRewards(address _staker, uint256 _rewards) internal override {
        IERC20(rewardToken).transfer(_staker, _rewards);
    }
 
    // Returns whether staking restrictions can be set in given execution context.
    function _canSetStakeConditions() internal view override returns (bool) {
        return msg.sender == deployer;
    }
}