This approves the contract to transfer an amount of usdt from itself:
usdt.approve(address(this),amount)
And this returns the amount of usdt that the contract is allowed to transfer from the sender:
usdt.allowance(msg.sender, address(this))
Now, obviously, the sender in this case is not the contract, but the account that you’re using in order to sign and execute each one of these transactions.
The above is just to strictly answer your question.
In order to give you some further help, note that the usdt.approve(address(this),amount)
part is completely redundant.
An account doesn’t need approval to transfer funds from itself; it only needs approval to transfer funds from other accounts.
More generally, you seem to be missing the whole point in the approve
/transferFrom
scheme, which consists of the following two transactions:
-
entity
executes tokenContract.approve(someContract)
, in order to allow someContract
to transfer funds from entity
-
entity
executes someContract.someFunc
, which internally executes tokenContract.transferFrom(entity)
in order to transfer funds from entity
to somewhere (either to someContract
itself, or to some other account)
Note that entity
can be either an externally-owned account (aka wallet), or a smart-contract account.
In short, your off-chain script (assuming that this is how you are trying to execute the process), should look more or less like this:
-
Deploy an instance of CallContract
-
Sign and send with yourAccount
: usdt.approve(callContract.address, amount)
-
Verify that usdt.allowance(yourAccount, callContract.address)
returns amount
Again - all of the above should be executed from your off-chain script, NOT as part of your contract.
At this point, callContract
should be able to transfer up to amount
usdt from yourAccount
to any other account, so you can add a function in this contract, which will internally call usdt.transferFrom
in order to execute the desired transfer.
On top of that, you may have realized by now that both of the functions currently implemented in your contract are redundant:
approveUsdt
, because this approval should be executed outside the contract
getApprovedBalance
, because this query can be executed outside the contract