# Transferring USDT from metamask to smart contract

**URL:** <https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939>\
**Category:** Smart Contracts\
**Tags:** erc20\
**Created:** [July 6, 2023, 12:04pm UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939 "2023-07-06T12:04:58Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Giorgi\_Sheklashvili](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/giorgi_sheklashvili/32/18907_2.png) [@Giorgi\_Sheklashvili](https://forum.openzeppelin.com/u/Giorgi_Sheklashvili)\
**Post date:** [July 6, 2023, 12:04pm UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/1 "2023-07-06T12:04:58Z")

</div>

I'm trying to transfer USDT tokens from my metamask account to another address(which is variable in smart contract) through a method call.

If I use transferFrom I'm getting an error saying the transfer amount exceeds the allowance. So I'm trying to understand what I'm doing wrong. I've tried giving allowance to msg.sender, address(this), usdtTokenAddress but nothing worked.

```auto
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

using SafeERC20 for IERC20;

contract Shop{
address usdtContractAddress;
address usdtWalletOfShop;
function approve(uint128 amount) public {
            IERC20(usdtContractAddress).approve(address(this), amount);
    }

    function order(uint128 amount) public {
        // IERC20((usdtContractAddress)).transfer(usdtWalletOfShop, amount);
        IERC20((usdtContractAddress)).transferFrom(msg.sender, usdtWalletOfShop, amount);
        usdtBalanceOfShop += amount;
        orderId += 1;
        emit Payment(msg.sender, amount, orderId);
    }

}

```

---

<div class="post-metadata">

**Author:** ![barakman](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/barakman/32/855_2.png) [@barakman](https://forum.openzeppelin.com/u/barakman)\
**Post date:** [July 6, 2023, 12:18pm UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/2 "2023-07-06T12:18:13Z")

</div>

Before executing `shop.order(amount)`, you need to execute `usdc.approve(shopAddress, amount)`.

And you need to do so **using the same account for both transactions** (regardless of whether that account is a wallet or a contract).

Needless to say, implementing `function approve` in your `Shop` contract is unnecessary.

---

<div class="post-metadata">

**Author:** ![Giorgi\_Sheklashvili](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/giorgi_sheklashvili/32/18907_2.png) [@Giorgi\_Sheklashvili](https://forum.openzeppelin.com/u/Giorgi_Sheklashvili)\
**Post date:** [July 6, 2023, 12:23pm UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/3 "2023-07-06T12:23:26Z")

</div>

Yes, I'm doing exactly like that. Do you mean I should call usdt.approve in the order method? Or I should call it outside the smart contract?

---

<div class="post-metadata">

**Author:** ![barakman](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/barakman/32/855_2.png) [@barakman](https://forum.openzeppelin.com/u/barakman)\
**Post date:** [July 6, 2023, 12:25pm UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/4 "2023-07-06T12:25:55Z")

</div>

I'm not sure how to explain it any better than I already have, so I'll just repeat myself:

Before executing `shop.order(amount)`, you need to execute `usdc.approve(shopAddress, amount)` **using the same account for (signing) both transactions**.

---

<div class="post-metadata">

**Author:** ![bca\_service](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/bca_service/32/18904_2.png) [@bca\_service](https://forum.openzeppelin.com/u/bca_service)\
**Post date:** [July 10, 2023, 8:34am UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/5 "2023-07-10T08:34:56Z")

</div>

You should execute usdt.approve(shopAddress, amount) by your wallet, not by shop contract.  
And approve function in shop contract is unnecessary.

---

<div class="post-metadata">

**Author:** ![barakman](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/barakman/32/855_2.png) [@barakman](https://forum.openzeppelin.com/u/barakman)\
**Post date:** [July 10, 2023, 10:11am UTC](https://forum.openzeppelin.com/t/transferring-usdt-from-metamask-to-smart-contract/36939/6 "2023-07-10T10:11:36Z")

</div>

Which is exactly what I wrote in my original answer, and in the one which followed it.
