# Dai, USDT permit function

**URL:** <https://forum.openzeppelin.com/t/dai-usdt-permit-function/26207>\
**Category:** Contracts\
**Created:** [March 15, 2022, 2:58am UTC](https://forum.openzeppelin.com/t/dai-usdt-permit-function/26207 "2022-03-15T02:58:23Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Antonia\_Sa](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/antonia_sa/32/6221_2.png) [@Antonia\_Sa](https://forum.openzeppelin.com/u/Antonia_Sa)\
**Post date:** [March 15, 2022, 2:58am UTC](https://forum.openzeppelin.com/t/dai-usdt-permit-function/26207/1 "2022-03-15T02:58:23Z")

</div>

Hi

I was just wondering how to use the DAI permit and compared it with ERC20Permit contract. What is the difference? I just saw that DAI contract has a permit function but with more parameters. I guess it will not work with the permit from ERC20Permit contract?

Does USDT not have a permit function?

---

<div class="post-metadata">

**Author:** ![frangio](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/frangio/32/15251_2.png) [@frangio](https://forum.openzeppelin.com/u/frangio)\
**Post date:** [March 25, 2022, 12:28pm UTC](https://forum.openzeppelin.com/t/dai-usdt-permit-function/26207/2 "2022-03-25T12:28:13Z")

</div>

Regarding DAI, you can see the section in the EIP about [Backwards Compatibility](https://eips.ethereum.org/EIPS/eip-2612#backwards-compatibility).

USDT doesn't seem to have a permit function. The contract predates the development of permit and it is not upgradeable.

---

<div class="post-metadata">

**Author:** ![Antonia\_Sa](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/antonia_sa/32/6221_2.png) [@Antonia\_Sa](https://forum.openzeppelin.com/u/Antonia_Sa)\
**Post date:** [March 26, 2022, 1:58am UTC](https://forum.openzeppelin.com/t/dai-usdt-permit-function/26207/3 "2022-03-26T01:58:26Z")

</div>

Thanks for your answer. I want to send Dai token to a contract and I wrote the following function for that. The permit function for dai is called on UI site `daiToken.permit(...args);`

I am thinking if this maybe not be better to add the `daiToken.permit(...args);` into the sendToken function before instead of permitting over the UI.

```auto
  function sendToken(
        address _token,
        address _to,
        uint256 _amountIn,
        uint256 _merchantID,
        uint256 _orderID,
        uint256 _deadline
    ) public override ensure(_deadline) {
        IERC20 token = IERC20(_token);
        require(token.balanceOf(msg.sender) > _amountIn, "Not enough balance");
        require(_amountIn > 0, "amount should be > 0");
        require(_orderID != 0, "sendToken: orderID is empty");
        require(_merchantID != 0, "sendToken: merchandID is empty");

        address _merchantUID = PaymentLibrary.merchantFor(
            factory,
            _to,
            _merchantID
        );

        uint256 _amountInMinusFee = PaymentLibrary.getAmountOut(
            _amountIn
        );

        // msg.sender is router
        token.safeTransferFrom(msg.sender, _merchantUID, _amountIn);
        uint256 _fees = _amountIn.sub(_amountInMinusFee);
        // pass amount && fees
        IMerchant(_merchantUID).mint(
            msg.sender,
            _to,
            _amountIn,
            _fees,
            _orderID
        );
    }

```
