An anti-corruption layer is a translation, not a wrapper

Wrapping a third-party client in a class of your own achieves nothing if the class exposes the same concepts with different names — the point is to translate their model into yours.

// a wrapper: their vocabulary, your namespace
$gateway->createCharge($tokenId, $amountInCents, $currencyCode);

// a translation: your vocabulary, their problem
interface Payments
{
    public function take(Money $amount, PaymentMethod $method): Receipt;
}

// Receipt, Money and PaymentMethod are yours. nothing about
// the provider's tokens, webhooks or error codes escapes.

The test is whether swapping the provider changes any type outside the layer. If their error codes appear in a controller, the layer leaked. This costs real effort and is worth it exactly where the external model is likely to change or is genuinely awkward — applying it to every dependency produces a codebase of translation for its own sake.