Staking ERC20 token

I’m trying to understand how to create a staking token. My purpose is to create a token, in which the user can stake the token and earn interest in the token itself.

We can have two ways to implement this

  1. An ERC20 token with staking functionality, such that the user always interact with this smart contract also for staking
  2. An external contract that has the staking logic

My question is, which approach is the best and when is advised to use the first one rather than the second one and viceversa.

Another question that I have is regarding the following tutorial.

Both the approach implement an ERC20 token with staking capability. What I’m struggling to understand is why, in the stake function, the contract burns the token of the user instead of making a transferFrom of these tokens to the contract itself. If a burn is implemented, then the supply of the token decrease, and I don’t think this is the ideal situation with a staking token. I would rather transfer the amount of token from the user to the contract balance, and then during the unstake I would resend them to the user.

Am I wrong with this thinking and I’m missing something?

First contract stake function:


function createStake(uint256 _stake)
       public
   {
       _burn(msg.sender, _stake);
       if(stakes[msg.sender] == 0) addStakeholder(msg.sender);
       stakes[msg.sender] = stakes[msg.sender].add(_stake);
   }

Second contract stake function:


/**
* Add functionality like burn to the _stake afunction
*
 */
function stake(uint256 _amount) public {
  // Make sure staker actually is good for it
  require(_amount < _balances[msg.sender], "DevToken: Cannot stake more than you own");

    _stake(_amount);
            // Burn the amount of tokens on the sender
    _burn(msg.sender, _amount);
}

Tutorials:

https://hackernoon.com/implementing-staking-in-solidity-1687302a82cf

The Question of your’s regarding the burning..
Basically in the contract it won’t be efficient to transfer the funds to the contract and again on withdrawal transfer back from the contract to address. It would cost much gas fee. So when a person is staking it burns the amount from his/her address and when that person withdraws the amount it mints the same amount of tokens and send to the same address.