Pumpkin-MC/Pumpkin · error · VelocityError

Unsupported forwarding version

Error message

Unsupported forwarding version {0}. Maximum supported version is {1}

What it means

VelocityError validation guard over the modern forwarding version byte: the proxy forwarded a version newer than MAX_SUPPORTED_FORWARDING_VERSION (4), so this server cannot trust or parse the payload. Fires when upgrading Velocity before the Pumpkin server supports its forwarding format. The offending input is the version byte at the head of the forwarding data.

Solutions

  1. Reject the connection citing the version range
  2. Update the server to support the newer forwarding version
  3. Log both the received and maximum supported versions
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/pumpkin/src/net/proxy/velocity.rs:37 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09). Data as JSON: /api/errors/79589fdfce969b86. Report an issue: GitHub.

Appendix: source

Thrown at crates/pumpkin/src/net/proxy/velocity.rs:37

use thiserror::Error;
use tracing::debug;

use crate::net::{GameProfile, java::pending::PendingConnection};

type HmacSha256 = Hmac<Sha256>;

const MAX_SUPPORTED_FORWARDING_VERSION: u8 = 4;
const PLAYER_INFO_CHANNEL: &str = "velocity:player_info";

#[derive(Error, Debug)]
pub enum VelocityError {
    #[error("No response data received")]
    NoData,
    #[error("Unable to verify player details")]
    FailedVerifyIntegrity,
    #[error("Failed to read forward version")]
    FailedReadForwardVersion,
    #[error("Unsupported forwarding version {0}. Maximum supported version is {1}")]
    UnsupportedForwardVersion(u8, u8),
    #[error("Failed to read address")]
    FailedReadAddress,
    #[error("Failed to parse address")]
    FailedParseAddress,
    #[error("Failed to read game profile name")]
    FailedReadProfileName,
    #[error("Failed to read game profile UUID")]
    FailedReadProfileUUID,
    #[error("Failed to read game profile properties")]
    FailedReadProfileProperties,
}

pub async fn velocity_login(connection: &mut PendingConnection) {
    // TODO: Validate the packet transaction id from the plugin response with this
    let velocity_message_id: i32 = rand::rng().random();

    let mut buf = BytesMut::new();

View on GitHub (pinned to 8d4639e25a)