def METHOD_NAME(
    cls,
    _root,
    info,
    /,
    shipping_address,
    validation_rules=None,
    checkout_id=None,
    token=None,
    id=None,
):
    checkout = get_checkout(
        cls,
        info,
        checkout_id=checkout_id,
        token=token,
        id=id,
        qs=models.Checkout.objects.prefetch_related(
            "lines__variant__product__product_type"
        ),
    )
    use_legacy_error_flow_for_checkout = (
        checkout.channel.use_legacy_error_flow_for_checkout
    )
    lines, _ = fetch_checkout_lines(
        checkout,
    )
    if use_legacy_error_flow_for_checkout and not is_shipping_required(lines):
        raise ValidationError(
            {
                "shipping_address": ValidationError(
                    ERROR_DOES_NOT_SHIP,
                    code=CheckoutErrorCode.SHIPPING_NOT_REQUIRED.value,
                )
            }
        )
    address_validation_rules = validation_rules or {}
    shipping_address_instance = cls.validate_address(
        shipping_address,
        address_type=AddressType.SHIPPING,
        instance=checkout.shipping_address,
        info=info,
        format_check=address_validation_rules.get("check_fields_format", True),
        required_check=address_validation_rules.get("check_required_fields", True),
        enable_normalization=address_validation_rules.get(
            "enable_fields_normalization", True
        ),
    )
    manager = get_plugin_manager_promise(info.context).get()
    shipping_channel_listings = checkout.channel.shipping_method_listings.all()
    checkout_info = fetch_checkout_info(
        checkout, lines, manager, shipping_channel_listings
    )
    country = shipping_address_instance.country.code
    checkout.set_country(country, commit=True)
    # Resolve and process the lines, validating variants quantities
    if lines and use_legacy_error_flow_for_checkout:
        cls.process_checkout_lines(
            info,
            lines,
            country,
            checkout_info.channel.slug,
            checkout_info.delivery_method_info,
        )
    update_checkout_shipping_method_if_invalid(checkout_info, lines)
    shipping_address_updated_fields = []
    with traced_atomic_transaction():
        shipping_address_instance.save()
        shipping_address_updated_fields = change_shipping_address_in_checkout(
            checkout_info,
            shipping_address_instance,
            lines,
            manager,
            shipping_channel_listings,
        )
    invalidate_prices_updated_fields = invalidate_checkout_prices(
        checkout_info, lines, manager, save=False
    )
    checkout.save(
        update_fields=shipping_address_updated_fields
        + invalidate_prices_updated_fields
    )
    cls.call_event(manager.checkout_updated, checkout)
    return CheckoutShippingAddressUpdate(checkout=checkout)