This is a gotcha with the recent move to emails being sent by the queue and not during the actual checkout process.
Your problem is this line (and other lines you might have like it...):
variant.salePrice|commerceCurrency(craft.commerce.carts.cart.currency)
...when the queue runs, there is no current cart
for the commerce carts service to retrieve, so therefore you also can't retrieve the currency from it.
If you change this to something direct, i.e. using the Craft currency filter, it will not raise this error.
https://docs.craftcms.com/v3/dev/filters.html#currency
variant.salePrice|currency('AUD')
...for example.
This is fine if your store only uses one currency.
If you are using multi currency, then I think you would need to retrieve the order.paymentCurrency
in this case.
https://docs.craftcms.com/commerce/v3/payment-currencies.html#order-currency-fields
...in short, the one thing you can't go itdo is call on the current cart
....because there isn't one for console (queue) requests.