Skip to content

Commit

Permalink
Merge of #6832
Browse files Browse the repository at this point in the history
  • Loading branch information
mergify[bot] authored Jan 28, 2025
2 parents 1781c5a + 197d32d commit f6403fd
Showing 1 changed file with 151 additions and 0 deletions.
151 changes: 151 additions & 0 deletions beacon_node/execution_layer/src/engine_api/json_structures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -991,3 +991,154 @@ impl TryFrom<JsonClientVersionV1> for ClientVersionV1 {
})
}
}

#[cfg(test)]
mod tests {
use ssz::Encode;
use types::{
ConsolidationRequest, DepositRequest, MainnetEthSpec, PublicKeyBytes, RequestType,
SignatureBytes, WithdrawalRequest,
};

use super::*;

fn create_request_string<T: Encode>(prefix: u8, request_bytes: &T) -> String {
format!(
"0x{:02x}{}",
prefix,
hex::encode(request_bytes.as_ssz_bytes())
)
}

/// Tests all error conditions except ssz decoding errors
///
/// ***
/// Elements of the list MUST be ordered by request_type in ascending order.
/// Elements with empty request_data MUST be excluded from the list.
/// If any element is out of order, has a length of 1-byte or shorter,
/// or more than one element has the same type byte, client software MUST return -32602: Invalid params error.
/// ***
#[test]
fn test_invalid_execution_requests() {
let deposit_request = DepositRequest {
pubkey: PublicKeyBytes::empty(),
withdrawal_credentials: Hash256::random(),
amount: 32,
signature: SignatureBytes::empty(),
index: 0,
};

let consolidation_request = ConsolidationRequest {
source_address: Address::random(),
source_pubkey: PublicKeyBytes::empty(),
target_pubkey: PublicKeyBytes::empty(),
};

let withdrawal_request = WithdrawalRequest {
amount: 32,
source_address: Address::random(),
validator_pubkey: PublicKeyBytes::empty(),
};

// First check a valid request with all requests
assert!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
]))
.is_ok()
);

// Single requests
assert!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
]))
.is_ok()
);

assert!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
]))
.is_ok()
);

assert!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
]))
.is_ok()
);

// Out of order
assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
]))
.unwrap_err(),
RequestsError::InvalidOrdering
));

assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
create_request_string(RequestType::Withdrawal.to_u8(), &withdrawal_request),
]))
.unwrap_err(),
RequestsError::InvalidOrdering
));

assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Consolidation.to_u8(), &consolidation_request),
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
]))
.unwrap_err(),
RequestsError::InvalidOrdering
));

// Multiple requests of same type
assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
]))
.unwrap_err(),
RequestsError::InvalidOrdering
));

// Invalid prefix
assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(42, &deposit_request),
]))
.unwrap_err(),
RequestsError::InvalidPrefix(42)
));

// Prefix followed by no data
assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
create_request_string(
RequestType::Consolidation.to_u8(),
&Vec::<ConsolidationRequest>::new()
),
]))
.unwrap_err(),
RequestsError::EmptyRequest(1)
));
// Empty request
assert!(matches!(
ExecutionRequests::<MainnetEthSpec>::try_from(JsonExecutionRequests(vec![
create_request_string(RequestType::Deposit.to_u8(), &deposit_request),
"0x".to_string()
]))
.unwrap_err(),
RequestsError::EmptyRequest(1)
));
}
}

0 comments on commit f6403fd

Please sign in to comment.