When user call token.safeTransfer

hello. i create an contract. i want accept usdt from user.
but when user call this function. result is from address(this) to address(this)
how to do can become user address to address(this)

    function deposit(address usdtAddress,uint amount) public{
        IERC20 usdt = IERC20(usdtAddress);
        usdt.safeTransfer(address(this),amount);
    }

Hi, welcome to the community! :wave:

I think you should usdt.safeTransferFrom(msg.sender, address(this), amount)

But this way have to approve first,right?
Have another way no need approve? Just when user call this function, send usdt first,then do another.

Maybe you can have a look at EIP-2612: permit | 712-signed approvals