async def METHOD_NAME(self, bolt11: str, fee_limit_msat: int) -> PaymentResponse:
    invoice = lnbits_bolt11.decode(bolt11)
    previous_payment = await self.get_payment_status(invoice.payment_hash)
    if previous_payment.paid:
        return PaymentResponse(False, None, None, None, "invoice already paid")
    fee_limit_percent = fee_limit_msat / invoice.amount_msat * 100
    # so fee_limit_percent is applied even on payments with fee < 5000 millisatoshi
    # (which is default value of exemptfee)
    payload = {
        "bolt11": bolt11,
        "maxfeepercent": f"{fee_limit_percent:.11}",
        "exemptfee": 0,
    }
    try:
        r = await run_sync(lambda: self.ln.call("pay", payload))
    except RpcError as exc:
        try:
            error_message = exc.error["attempts"][-1]["fail_reason"]  # type: ignore
        except Exception:
            error_message = (
                f"CoreLightning method '{exc.method}' failed with"
                f" '{exc.error.get('message') or exc.error}'."  # type: ignore
            )
        return PaymentResponse(False, None, None, None, error_message)
    except Exception as exc:
        return PaymentResponse(False, None, None, None, str(exc))
    fee_msat = -int(r["amount_sent_msat"] - r["amount_msat"])
    return PaymentResponse(
        True, r["payment_hash"], fee_msat, r["payment_preimage"], None
    )