I am trying to execute a function from the truffle console and getting the error without much information.

contract LPTokenWrapper {
IERC20 public lp_tkn = IERC20(0xf7a35Eef60dC35fa2D3188Dfb22e635E4308fc8b);
function stake(uint256 amount) public {
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        tkn.safeTransferFrom(msg.sender, address(this), amount);

from truffle console doing(with the same account which has lp_tkn) lp_wrp.stake(web3.utils.toWie("1"));



It is possible that address(this) is not authorised to transferFrom() funds that belong to msg.sender. It can't simply help itself to someone else's tokens.

In the ERC20 standard, the user is required to approve() - allow the receiver, which is the contract, to take a certain amount of tokens before the receiver can use transferFrom(). This is usually coordinated by the UI so the user just signs the authorizing transaction.

Importantly, the transaction must be from the user directly, not via a smart contract, sent directly to the ERC20 token contract.

The Open Zeppelin implementation:

     * @dev See {IERC20-approve}.
     * Requirements:
     * - `spender` cannot be the zero address.
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;

So, the user will send a transaction to the ERC20 contract to approve a certain address, your contract, to transferFrom() a certain amount of tokens from the user - the allowance. Then, your contract will be able to transferFrom().

Hope it helps.

  • Thanks for the answer. I am getting one more issue while calling getreward() function error is SafeERC20: low-level call failed any about this also? – Rahul Sharma Nov 19 '20 at 18:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.