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
- Reject the connection citing the version range
- Update the server to support the newer forwarding version
- 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)