# How to use IERC20 safeTransferFrom?

**URL:** <https://forum.openzeppelin.com/t/how-to-use-ierc20-safetransferfrom/8352>\
**Category:** General\
**Tags:** erc20\
**Created:** [May 14, 2021, 1:42am UTC](https://forum.openzeppelin.com/t/how-to-use-ierc20-safetransferfrom/8352 "2021-05-14T01:42:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![CrashBanditCoin14](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/crashbanditcoin14/32/4782_2.png) [@CrashBanditCoin14](https://forum.openzeppelin.com/u/CrashBanditCoin14)\
**Post date:** [May 14, 2021, 1:42am UTC](https://forum.openzeppelin.com/t/how-to-use-ierc20-safetransferfrom/8352/1 "2021-05-14T01:42:10Z")

</div>

I wouldike to have a function for my users for migrate old token to the new token :

```
address public oldToken = "XXXXXXXXXXXX";
address public newToken = "XXXXXXXXXXX";

 function migrateToNewToken(uint256 _inputAmt) public {

        //require(block.number < endOldToken, "too late :(");
        IERC20(oldToken).safeTransferFrom(
            address(msg.sender),
            burnAddress,
            _inputAmt
        );

        Token(newToken).mint(msg.sender, _inputAmt);
        emit MigrateToV2(msg.sender,_inputAmt);
    }

```

After deployed and minted some token for oldToken. I run the function migrateNewToken but I have always the same error :

`transact to MasterChefV2.migrateToNewToken errored: VM error: revert. revert The transaction has been reverted to the initial state. Reason provided by the contract: "ERC20: transfer amount exceeds allowance"`

---

<div class="post-metadata">

**Author:** ![Skyge](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/skyge/32/343_2.png) [@Skyge](https://forum.openzeppelin.com/u/Skyge)\
**Post date:** [May 14, 2021, 5:47am UTC](https://forum.openzeppelin.com/t/how-to-use-ierc20-safetransferfrom/8352/2 "2021-05-14T05:47:54Z")

</div>

> [@CrashBanditCoin14](#):
>
> "ERC20: transfer amount exceeds allowance"

So has the `msg.sender` called `approve` correctly? I think the right way should be:

- Alice calls `oldToken.approve(migrateToNewToken_contract_address, amount)`
- Alice calls `migrateToNewToken(amount)`
