Cross-posting the discussion topic from StellarProtocol repo:
https://github.com/stellar/stellar-protocol/discussions/1652
Multiple DeFi usage scenarios (DAO, trading, bridges, etc.) require locking some amount of tokens on the account/contract balance in order to use them later. A standard approve() function can set the spending token allowance but it cannot ensure that the contract will be able to spend it in the future because a user can transfer/spend/lock these tokens, so the actual balance during the transaction execution might be lower than the allowance. Users can also approve several conflicting allowances to different contracts. This case is similar to the issue addressed by the CAP-3 (Asset-backed offers).
Currently, the only way to overcome this problem is to transfer funds to the contract that will temporary lock them. It's potentially less secure than freezing tokens on the address balance, and not ideal from the tax reporting perspective since transferring funds to some contract even solely for the temporary lockup purpose may be considered a taxable event depending on the jurisdiction.
It would be nice to have a freeze() function in both SAC and standard token interface to provide the ability for the contracts to temporary lock user funds within a pre-approved allowance amount.