From 53e7b7b59f210cb2d4e9e073bb2008c65d0f8fb1 Mon Sep 17 00:00:00 2001 From: Asmaa Magdoub Date: Sun, 9 Feb 2025 11:02:34 +0200 Subject: [PATCH] refactor(papyrus_protobuf): add missing field fn --- .../papyrus_protobuf/src/converters/class.rs | 41 +- .../papyrus_protobuf/src/converters/common.rs | 8 +- .../src/converters/consensus.rs | 49 +- .../papyrus_protobuf/src/converters/event.rs | 25 +- .../papyrus_protobuf/src/converters/header.rs | 119 ++--- .../src/converters/receipt.rs | 58 +-- .../src/converters/rpc_transaction.rs | 23 +- .../src/converters/state_diff.rs | 70 +-- .../src/converters/transaction.rs | 435 ++++-------------- crates/papyrus_protobuf/src/transaction.rs | 38 +- 10 files changed, 219 insertions(+), 647 deletions(-) diff --git a/crates/papyrus_protobuf/src/converters/class.rs b/crates/papyrus_protobuf/src/converters/class.rs index d721e01dc99..ee58f829225 100644 --- a/crates/papyrus_protobuf/src/converters/class.rs +++ b/crates/papyrus_protobuf/src/converters/class.rs @@ -17,7 +17,7 @@ use starknet_api::rpc_transaction::EntryPointByType; use starknet_api::{deprecated_contract_class, state}; use starknet_types_core::felt::Felt; -use super::common::volition_domain_to_enum_int; +use super::common::{missing, volition_domain_to_enum_int}; use super::ProtobufConversionError; use crate::sync::{ClassQuery, DataOrFin, Query}; use crate::{auto_impl_into_and_try_from_vec_u8, protobuf}; @@ -32,9 +32,7 @@ impl TryFrom for DataOrFin<(ApiContractClass, ClassHa Ok(Self(Some(class.try_into()?))) } Some(protobuf::classes_response::ClassMessage::Fin(_)) => Ok(Self(None)), - None => Err(ProtobufConversionError::MissingField { - field_description: "ClassesResponse::class_message", - }), + None => Err(missing("ClassesResponse::class_message")), } } } @@ -71,18 +69,11 @@ impl TryFrom for (ApiContractClass, ClassHash) { ApiContractClass::ContractClass(state::SierraContractClass::try_from(class)?) } None => { - return Err(ProtobufConversionError::MissingField { - field_description: "Class::class", - }); + return Err(missing("Class::class")); } }; - let class_hash = value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "Class::class_hash", - })? - .try_into() - .map(ClassHash)?; + let class_hash = + value.class_hash.ok_or(missing("Class::class_hash"))?.try_into().map(ClassHash)?; Ok((class, class_hash)) } } @@ -212,9 +203,7 @@ impl TryFrom for state::SierraContractClass { let mut entry_points_by_type = HashMap::new(); let entry_points = - value.entry_points.clone().ok_or(ProtobufConversionError::MissingField { - field_description: "Cairo1Class::entry_points", - })?; + value.entry_points.clone().ok_or(missing("Cairo1Class::entry_points"))?; if !entry_points.constructors.is_empty() { entry_points_by_type.insert( EntryPointType::Constructor, @@ -304,10 +293,7 @@ impl From for protobuf::Cairo1Class { impl TryFrom for deprecated_contract_class::EntryPointV0 { type Error = ProtobufConversionError; fn try_from(value: protobuf::EntryPoint) -> Result { - let selector_felt = - Felt::try_from(value.selector.ok_or(ProtobufConversionError::MissingField { - field_description: "EntryPoint::selector", - })?)?; + let selector_felt = Felt::try_from(value.selector.ok_or(missing("EntryPoint::selector"))?)?; let selector = EntryPointSelector(selector_felt); let offset = deprecated_contract_class::EntryPointOffset( @@ -331,9 +317,7 @@ impl TryFrom for state::EntryPoint { type Error = ProtobufConversionError; fn try_from(value: protobuf::SierraEntryPoint) -> Result { let selector_felt = - Felt::try_from(value.selector.ok_or(ProtobufConversionError::MissingField { - field_description: "SierraEntryPoint::selector", - })?)?; + Felt::try_from(value.selector.ok_or(missing("SierraEntryPoint::selector"))?)?; let selector = EntryPointSelector(selector_felt); let function_idx = @@ -362,14 +346,7 @@ impl TryFrom for Query { impl TryFrom for ClassQuery { type Error = ProtobufConversionError; fn try_from(value: protobuf::ClassesRequest) -> Result { - Ok(ClassQuery( - value - .iteration - .ok_or(ProtobufConversionError::MissingField { - field_description: "ClassesRequest::iteration", - })? - .try_into()?, - )) + Ok(ClassQuery(value.iteration.ok_or(missing("ClassesRequest::iteration"))?.try_into()?)) } } diff --git a/crates/papyrus_protobuf/src/converters/common.rs b/crates/papyrus_protobuf/src/converters/common.rs index d4d3daf1d99..f1664c19ae8 100644 --- a/crates/papyrus_protobuf/src/converters/common.rs +++ b/crates/papyrus_protobuf/src/converters/common.rs @@ -214,9 +214,7 @@ impl TryFrom for Query { type Error = ProtobufConversionError; fn try_from(value: protobuf::Iteration) -> Result { - let start = value.start.ok_or(ProtobufConversionError::MissingField { - field_description: "Iteration::start", - })?; + let start = value.start.ok_or(missing("Iteration::start"))?; let start_block = match start { protobuf::iteration::Start::BlockNumber(block_number) => { BlockHashOrNumber::Number(BlockNumber(block_number)) @@ -300,3 +298,7 @@ pub(super) fn try_from_starkfelt_to_u32( Ok(u32::from_be_bytes(bytes)) } + +pub fn missing(field_description: &'static str) -> ProtobufConversionError { + ProtobufConversionError::MissingField { field_description } +} diff --git a/crates/papyrus_protobuf/src/converters/consensus.rs b/crates/papyrus_protobuf/src/converters/consensus.rs index 8c91a93fc0b..f4f524c7f69 100644 --- a/crates/papyrus_protobuf/src/converters/consensus.rs +++ b/crates/papyrus_protobuf/src/converters/consensus.rs @@ -9,7 +9,11 @@ use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::consensus_transaction::ConsensusTransaction; use starknet_api::hash::StarkHash; -use super::common::{enum_int_to_l1_data_availability_mode, l1_data_availability_mode_to_enum_int}; +use super::common::{ + enum_int_to_l1_data_availability_mode, + l1_data_availability_mode_to_enum_int, + missing, +}; use crate::consensus::{ BlockInfo, IntoFromProto, @@ -55,10 +59,7 @@ impl TryFrom for Vote { let round = value.round; let block_hash: Option = value.block_hash.map(|block_hash| block_hash.try_into()).transpose()?.map(BlockHash); - let voter = value - .voter - .ok_or(ProtobufConversionError::MissingField { field_description: "voter" })? - .try_into()?; + let voter = value.voter.ok_or(missing("voter"))?.try_into()?; Ok(Vote { vote_type, height, round, block_hash, voter }) } @@ -171,10 +172,7 @@ impl TryFrom for ProposalInit { let height = value.height; let round = value.round; let valid_round = value.valid_round; - let proposer = value - .proposer - .ok_or(ProtobufConversionError::MissingField { field_description: "proposer" })? - .try_into()?; + let proposer = value.proposer.ok_or(missing("proposer"))?.try_into()?; Ok(ProposalInit { height: BlockNumber(height), round, valid_round, proposer }) } } @@ -197,25 +195,12 @@ impl TryFrom for BlockInfo { fn try_from(value: protobuf::BlockInfo) -> Result { let height = value.height; let timestamp = value.timestamp; - let builder = value - .builder - .ok_or(ProtobufConversionError::MissingField { field_description: "builder" })? - .try_into()?; + let builder = value.builder.ok_or(missing("builder"))?.try_into()?; let l1_da_mode = enum_int_to_l1_data_availability_mode(value.l1_da_mode)?; - let l2_gas_price_fri = value - .l2_gas_price_fri - .ok_or(ProtobufConversionError::MissingField { field_description: "l2_gas_price_fri" })? - .into(); - let l1_gas_price_wei = value - .l1_gas_price_wei - .ok_or(ProtobufConversionError::MissingField { field_description: "l1_gas_price_wei" })? - .into(); - let l1_data_gas_price_wei = value - .l1_data_gas_price_wei - .ok_or(ProtobufConversionError::MissingField { - field_description: "l1_data_gas_price_wei", - })? - .into(); + let l2_gas_price_fri = value.l2_gas_price_fri.ok_or(missing("l2_gas_price_fri"))?.into(); + let l1_gas_price_wei = value.l1_gas_price_wei.ok_or(missing("l1_gas_price_wei"))?.into(); + let l1_data_gas_price_wei = + value.l1_data_gas_price_wei.ok_or(missing("l1_data_gas_price_wei"))?.into(); let eth_to_strk_rate = value.eth_to_strk_rate; Ok(BlockInfo { height: BlockNumber(height), @@ -271,12 +256,8 @@ auto_impl_into_and_try_from_vec_u8!(TransactionBatch, protobuf::TransactionBatch impl TryFrom for ProposalFin { type Error = ProtobufConversionError; fn try_from(value: protobuf::ProposalFin) -> Result { - let proposal_commitment: StarkHash = value - .proposal_commitment - .ok_or(ProtobufConversionError::MissingField { - field_description: "proposal_commitment", - })? - .try_into()?; + let proposal_commitment: StarkHash = + value.proposal_commitment.ok_or(missing("proposal_commitment"))?.try_into()?; let proposal_commitment = BlockHash(proposal_commitment); Ok(ProposalFin { proposal_commitment }) } @@ -296,7 +277,7 @@ impl TryFrom for ProposalPart { use protobuf::proposal_part::Message; let Some(part) = value.message else { - return Err(ProtobufConversionError::MissingField { field_description: "part" }); + return Err(missing("part")); }; match part { diff --git a/crates/papyrus_protobuf/src/converters/event.rs b/crates/papyrus_protobuf/src/converters/event.rs index 41d9f8c5dfe..962bef612d4 100644 --- a/crates/papyrus_protobuf/src/converters/event.rs +++ b/crates/papyrus_protobuf/src/converters/event.rs @@ -6,6 +6,7 @@ use starknet_api::core::{ContractAddress, PatriciaKey}; use starknet_api::transaction::{Event, EventContent, EventData, EventKey, TransactionHash}; use starknet_types_core::felt::Felt; +use super::common::missing; use super::ProtobufConversionError; use crate::sync::{DataOrFin, EventQuery, Query}; use crate::{auto_impl_into_and_try_from_vec_u8, protobuf}; @@ -18,9 +19,7 @@ impl TryFrom for DataOrFin<(Event, TransactionHash)> { Ok(Self(Some(event.try_into()?))) } Some(protobuf::events_response::EventMessage::Fin(_)) => Ok(Self(None)), - None => Err(ProtobufConversionError::MissingField { - field_description: "EventsResponse::event_message", - }), + None => Err(missing("EventsResponse::event_message")), } } } @@ -45,18 +44,11 @@ impl TryFrom for (Event, TransactionHash) { type Error = ProtobufConversionError; fn try_from(value: protobuf::Event) -> Result { let transaction_hash = TransactionHash( - value - .transaction_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "Event::transaction_hash", - })? - .try_into()?, + value.transaction_hash.ok_or(missing("Event::transaction_hash"))?.try_into()?, ); let from_address_felt = - Felt::try_from(value.from_address.ok_or(ProtobufConversionError::MissingField { - field_description: "Event::from_address", - })?)?; + Felt::try_from(value.from_address.ok_or(missing("Event::from_address"))?)?; let from_address = ContractAddress(PatriciaKey::try_from(from_address_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { @@ -103,14 +95,7 @@ impl TryFrom for Query { impl TryFrom for EventQuery { type Error = ProtobufConversionError; fn try_from(value: protobuf::EventsRequest) -> Result { - Ok(EventQuery( - value - .iteration - .ok_or(ProtobufConversionError::MissingField { - field_description: "EventsRequest::iteration", - })? - .try_into()?, - )) + Ok(EventQuery(value.iteration.ok_or(missing("EventsRequest::iteration"))?.try_into()?)) } } diff --git a/crates/papyrus_protobuf/src/converters/header.rs b/crates/papyrus_protobuf/src/converters/header.rs index 319cebbdbce..7ce2b2d5c66 100644 --- a/crates/papyrus_protobuf/src/converters/header.rs +++ b/crates/papyrus_protobuf/src/converters/header.rs @@ -23,7 +23,11 @@ use starknet_api::core::{ use starknet_api::crypto::utils::Signature; use starknet_api::hash::PoseidonHash; -use super::common::{enum_int_to_l1_data_availability_mode, l1_data_availability_mode_to_enum_int}; +use super::common::{ + enum_int_to_l1_data_availability_mode, + l1_data_availability_mode_to_enum_int, + missing, +}; use super::ProtobufConversionError; use crate::sync::{DataOrFin, HeaderQuery, Query, SignedBlockHeader}; use crate::{auto_impl_into_and_try_from_vec_u8, protobuf}; @@ -43,9 +47,7 @@ impl TryFrom for Option { Ok(Some(header.try_into()?)) } Some(protobuf::block_headers_response::HeaderMessage::Fin(_)) => Ok(None), - None => Err(ProtobufConversionError::MissingField { - field_description: "BlockHeadersResponse::header_message", - }), + None => Err(missing("BlockHeadersResponse::header_message")), } } } @@ -55,17 +57,13 @@ impl TryFrom for SignedBlockHeader { fn try_from(value: protobuf::SignedBlockHeader) -> Result { let block_hash = value .block_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::block_hash", - })? + .ok_or(missing("SignedBlockHeader::block_hash"))? .try_into() .map(BlockHash)?; let parent_hash = value .parent_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::parent_hash", - })? + .ok_or(missing("SignedBlockHeader::parent_hash"))? .try_into() .map(BlockHash)?; @@ -73,35 +71,27 @@ impl TryFrom for SignedBlockHeader { let sequencer = value .sequencer_address - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::sequencer_address", - })? + .ok_or(missing("SignedBlockHeader::sequencer_address"))? .try_into() .map(SequencerContractAddress)?; let state_root = value .state_root - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::state_root", - })? + .ok_or(missing("SignedBlockHeader::state_root"))? .try_into() .map(GlobalRoot)?; let n_transactions = value .transactions .as_ref() - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::transactions", - })? + .ok_or(missing("SignedBlockHeader::transactions"))? .n_leaves .try_into() .expect("Failed converting u64 to usize"); let transaction_commitment = value .transactions - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::transactions", - })? + .ok_or(missing("SignedBlockHeader::transactions"))? .root .map(|root| root.try_into()) .transpose()? @@ -110,18 +100,14 @@ impl TryFrom for SignedBlockHeader { let n_events = value .events .as_ref() - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::events", - })? + .ok_or(missing("SignedBlockHeader::events"))? .n_leaves .try_into() .expect("Failed converting u64 to usize"); let event_commitment = value .events - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::events", - })? + .ok_or(missing("SignedBlockHeader::events"))? .root .map(|root| root.try_into()) .transpose()? @@ -147,48 +133,40 @@ impl TryFrom for SignedBlockHeader { }; let l1_gas_price = GasPricePerToken { - price_in_fri: u128::from(value.l1_gas_price_fri.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::gas_price_fri", - }, - )?) + price_in_fri: u128::from( + value.l1_gas_price_fri.ok_or(missing("SignedBlockHeader::gas_price_fri"))?, + ) .into(), - price_in_wei: u128::from(value.l1_gas_price_wei.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::gas_price_wei", - }, - )?) + price_in_wei: u128::from( + value.l1_gas_price_wei.ok_or(missing("SignedBlockHeader::gas_price_wei"))?, + ) .into(), }; let l1_data_gas_price = GasPricePerToken { - price_in_fri: u128::from(value.l1_data_gas_price_fri.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::data_gas_price_fri", - }, - )?) + price_in_fri: u128::from( + value + .l1_data_gas_price_fri + .ok_or(missing("SignedBlockHeader::data_gas_price_fri"))?, + ) .into(), - price_in_wei: u128::from(value.l1_data_gas_price_wei.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::data_gas_price_wei", - }, - )?) + price_in_wei: u128::from( + value + .l1_data_gas_price_wei + .ok_or(missing("SignedBlockHeader::data_gas_price_wei"))?, + ) .into(), }; let l2_gas_price = GasPricePerToken { - price_in_fri: u128::from(value.l2_gas_price_fri.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::l2_gas_price_fri", - }, - )?) + price_in_fri: u128::from( + value.l2_gas_price_fri.ok_or(missing("SignedBlockHeader::l2_gas_price_fri"))?, + ) .into(), - price_in_wei: u128::from(value.l2_gas_price_wei.ok_or( - ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::l2_gas_price_wei", - }, - )?) + price_in_wei: u128::from( + value.l2_gas_price_wei.ok_or(missing("SignedBlockHeader::l2_gas_price_wei"))?, + ) .into(), }; @@ -199,9 +177,7 @@ impl TryFrom for SignedBlockHeader { let state_diff_commitment = value .state_diff_commitment - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::state_diff_commitment", - })? + .ok_or(missing("SignedBlockHeader::state_diff_commitment"))? .root .map(|root| root.try_into()) .transpose()? @@ -309,18 +285,8 @@ impl TryFrom for starknet_api::block::BlockSignatu type Error = ProtobufConversionError; fn try_from(value: protobuf::ConsensusSignature) -> Result { Ok(Self(Signature { - r: value - .r - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::r", - })? - .try_into()?, - s: value - .s - .ok_or(ProtobufConversionError::MissingField { - field_description: "SignedBlockHeader::s", - })? - .try_into()?, + r: value.r.ok_or(missing("SignedBlockHeader::r"))?.try_into()?, + s: value.s.ok_or(missing("SignedBlockHeader::s"))?.try_into()?, })) } } @@ -364,12 +330,7 @@ impl TryFrom for HeaderQuery { type Error = ProtobufConversionError; fn try_from(value: protobuf::BlockHeadersRequest) -> Result { Ok(HeaderQuery( - value - .iteration - .ok_or(ProtobufConversionError::MissingField { - field_description: "BlockHeadersRequest::iteration", - })? - .try_into()?, + value.iteration.ok_or(missing("BlockHeadersRequest::iteration"))?.try_into()?, )) } } diff --git a/crates/papyrus_protobuf/src/converters/receipt.rs b/crates/papyrus_protobuf/src/converters/receipt.rs index 0a913db39ed..cbfec8573b4 100644 --- a/crates/papyrus_protobuf/src/converters/receipt.rs +++ b/crates/papyrus_protobuf/src/converters/receipt.rs @@ -17,16 +17,14 @@ use starknet_api::transaction::{ }; use starknet_types_core::felt::Felt; -use super::common::try_from_starkfelt_to_u128; +use super::common::{missing, try_from_starkfelt_to_u128}; use super::ProtobufConversionError; use crate::protobuf; impl TryFrom for TransactionOutput { type Error = ProtobufConversionError; fn try_from(value: protobuf::Receipt) -> Result { - let receipt = value - .r#type - .ok_or(ProtobufConversionError::MissingField { field_description: "Receipt::type" })?; + let receipt = value.r#type.ok_or(missing("Receipt::type"))?; match receipt { protobuf::receipt::Type::Invoke(invoke) => { Ok(TransactionOutput::Invoke(InvokeTransactionOutput::try_from(invoke)?)) @@ -81,9 +79,7 @@ impl TryFrom for DeployAccountTransactionOutpu let events = vec![]; let contract_address = - value.contract_address.ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccount::contract_address", - })?; + value.contract_address.ok_or(missing("DeployAccount::contract_address"))?; let felt = Felt::try_from(contract_address)?; let contract_address = ContractAddress(PatriciaKey::try_from(felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { @@ -130,10 +126,7 @@ impl TryFrom for DeployTransactionOutput { let events = vec![]; - let contract_address = - value.contract_address.ok_or(ProtobufConversionError::MissingField { - field_description: "Deploy::contract_address", - })?; + let contract_address = value.contract_address.ok_or(missing("Deploy::contract_address"))?; let felt = Felt::try_from(contract_address)?; let contract_address = ContractAddress(PatriciaKey::try_from(felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { @@ -300,24 +293,14 @@ impl From> for ProtobufBuiltinCounter { impl TryFrom for ExecutionResources { type Error = ProtobufConversionError; fn try_from(value: protobuf::receipt::ExecutionResources) -> Result { - let builtin_instance_counter = value - .builtins - .ok_or(ProtobufConversionError::MissingField { field_description: "builtins" })?; + let builtin_instance_counter = value.builtins.ok_or(missing("builtins"))?; let builtin_instance_counter = HashMap::::try_from(builtin_instance_counter)?; // TODO(Shahak): remove all non-da gas consumed - let gas_consumed = value - .gas_consumed - .ok_or(ProtobufConversionError::MissingField { - field_description: "ExecutionResources::gas_consumed", - })? - .into(); - let da_gas_consumed = value - .da_gas_consumed - .ok_or(ProtobufConversionError::MissingField { - field_description: "ExecutionResources::da_gas_consumed", - })? - .into(); + let gas_consumed = + value.gas_consumed.ok_or(missing("ExecutionResources::gas_consumed"))?.into(); + let da_gas_consumed = + value.da_gas_consumed.ok_or(missing("ExecutionResources::da_gas_consumed"))?.into(); let execution_resources = ExecutionResources { steps: u64::from(value.steps), @@ -396,15 +379,12 @@ impl TryFrom for MessageToL1 { type Error = ProtobufConversionError; fn try_from(value: protobuf::MessageToL1) -> Result { let from_address_felt = - Felt::try_from(value.from_address.ok_or(ProtobufConversionError::MissingField { - field_description: "MessageToL1::from_address", - })?)?; + Felt::try_from(value.from_address.ok_or(missing("MessageToL1::from_address"))?)?; let from_address = ContractAddress::try_from(from_address_felt) .expect("Converting ContractAddress from Felt failed"); - let to_address = EthAddress::try_from(value.to_address.ok_or( - ProtobufConversionError::MissingField { field_description: "MessageToL1::to_address" }, - )?)?; + let to_address = + EthAddress::try_from(value.to_address.ok_or(missing("MessageToL1::to_address"))?)?; let payload = L2ToL1Payload( value.payload.into_iter().map(Felt::try_from).collect::, _>>()?, @@ -433,12 +413,8 @@ fn parse_common_receipt_fields( (Fee, Vec, TransactionExecutionStatus, ExecutionResources), ProtobufConversionError, > { - let common = - common.ok_or(ProtobufConversionError::MissingField { field_description: "Common" })?; - let actual_fee_felt = - Felt::try_from(common.actual_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "Common::actual_fee", - })?)?; + let common = common.ok_or(missing("Common"))?; + let actual_fee_felt = Felt::try_from(common.actual_fee.ok_or(missing("Common::actual_fee"))?)?; let actual_fee = Fee(try_from_starkfelt_to_u128(actual_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -456,9 +432,9 @@ fn parse_common_receipt_fields( revert_reason, }) }); - let execution_resources = ExecutionResources::try_from(common.execution_resources.ok_or( - ProtobufConversionError::MissingField { field_description: "Common::execution_resources" }, - )?)?; + let execution_resources = ExecutionResources::try_from( + common.execution_resources.ok_or(missing("Common::execution_resources"))?, + )?; Ok((actual_fee, messages_sent, execution_status, execution_resources)) } diff --git a/crates/papyrus_protobuf/src/converters/rpc_transaction.rs b/crates/papyrus_protobuf/src/converters/rpc_transaction.rs index 28b7816953f..9a832c17d69 100644 --- a/crates/papyrus_protobuf/src/converters/rpc_transaction.rs +++ b/crates/papyrus_protobuf/src/converters/rpc_transaction.rs @@ -11,6 +11,7 @@ use starknet_api::rpc_transaction::{ }; use starknet_api::transaction::fields::{AllResourceBounds, ValidResourceBounds}; +use super::common::missing; use super::ProtobufConversionError; use crate::auto_impl_into_and_try_from_vec_u8; use crate::mempool::RpcTransactionWrapper; @@ -32,9 +33,7 @@ impl From for protobuf::MempoolTransaction { impl TryFrom for RpcTransaction { type Error = ProtobufConversionError; fn try_from(value: protobuf::MempoolTransaction) -> Result { - let txn = value.txn.ok_or(ProtobufConversionError::MissingField { - field_description: "RpcTransaction::txn", - })?; + let txn = value.txn.ok_or(missing("RpcTransaction::txn"))?; Ok(match txn { protobuf::mempool_transaction::Txn::DeclareV3(txn) => { RpcTransaction::Declare(RpcDeclareTransaction::V3(txn.try_into()?)) @@ -81,23 +80,11 @@ impl TryFrom for AllResourceBounds { type Error = ProtobufConversionError; fn try_from(value: protobuf::ResourceBounds) -> Result { Ok(Self { - l1_gas: value - .l1_gas - .ok_or(ProtobufConversionError::MissingField { - field_description: "ResourceBounds::l1_gas", - })? - .try_into()?, - l2_gas: value - .l2_gas - .ok_or(ProtobufConversionError::MissingField { - field_description: "ResourceBounds::l2_gas", - })? - .try_into()?, + l1_gas: value.l1_gas.ok_or(missing("ResourceBounds::l1_gas"))?.try_into()?, + l2_gas: value.l2_gas.ok_or(missing("ResourceBounds::l2_gas"))?.try_into()?, l1_data_gas: value .l1_data_gas - .ok_or(ProtobufConversionError::MissingField { - field_description: "ResourceBounds::l1_data_gas", - })? + .ok_or(missing("ResourceBounds::l1_data_gas"))? .try_into()?, }) } diff --git a/crates/papyrus_protobuf/src/converters/state_diff.rs b/crates/papyrus_protobuf/src/converters/state_diff.rs index 10f2a72a877..3c120ec6a36 100644 --- a/crates/papyrus_protobuf/src/converters/state_diff.rs +++ b/crates/papyrus_protobuf/src/converters/state_diff.rs @@ -8,7 +8,7 @@ use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::state::{StorageKey, ThinStateDiff}; use starknet_types_core::felt::Felt; -use super::common::volition_domain_to_enum_int; +use super::common::{missing, volition_domain_to_enum_int}; use super::ProtobufConversionError; use crate::sync::{ ContractDiff, @@ -35,9 +35,7 @@ impl TryFrom for DataOrFin { declared_class, )) => Ok(DataOrFin(Some(declared_class.try_into()?))), Some(protobuf::state_diffs_response::StateDiffMessage::Fin(_)) => Ok(DataOrFin(None)), - None => Err(ProtobufConversionError::MissingField { - field_description: "StateDiffsResponse::state_diff_message", - }), + None => Err(missing("StateDiffsResponse::state_diff_message")), } } } @@ -61,9 +59,7 @@ impl TryFrom for DataOrFin { )))), }, Some(protobuf::state_diffs_response::StateDiffMessage::Fin(_)) => Ok(DataOrFin(None)), - None => Err(ProtobufConversionError::MissingField { - field_description: "StateDiffsResponse::state_diff_message", - }), + None => Err(missing("StateDiffsResponse::state_diff_message")), } } } @@ -95,12 +91,7 @@ auto_impl_into_and_try_from_vec_u8!(DataOrFin, protobuf::StateDi impl TryFrom for ThinStateDiff { type Error = ProtobufConversionError; fn try_from(value: protobuf::ContractDiff) -> Result { - let contract_address = value - .address - .ok_or(ProtobufConversionError::MissingField { - field_description: "ContractDiff::address", - })? - .try_into()?; + let contract_address = value.address.ok_or(missing("ContractDiff::address"))?.try_into()?; let deployed_contracts = value .class_hash @@ -151,14 +142,8 @@ impl TryFrom for ThinStateDiff { impl TryFrom for ThinStateDiff { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeclaredClass) -> Result { - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclaredClass::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeclaredClass::class_hash"))?.try_into()?); // According to the p2p specs, if compiled_class_hash is missing, the declared class is a // cairo-0 class. @@ -181,9 +166,7 @@ impl TryFrom for ThinStateDiff { impl TryFrom for (StorageKey, Felt) { type Error = ProtobufConversionError; fn try_from(entry: protobuf::ContractStoredValue) -> Result { - let key_felt = Felt::try_from(entry.key.ok_or(ProtobufConversionError::MissingField { - field_description: "ContractStoredValue::key", - })?)?; + let key_felt = Felt::try_from(entry.key.ok_or(missing("ContractStoredValue::key"))?)?; let key = StorageKey(key_felt.try_into().map_err(|_| { ProtobufConversionError::OutOfRangeValue { // TODO(shahak): Check if the type in the protobuf of the field @@ -193,9 +176,7 @@ impl TryFrom for (StorageKey, Felt) { value_as_str: format!("{key_felt:?}"), } })?); - let value = Felt::try_from(entry.value.ok_or(ProtobufConversionError::MissingField { - field_description: "ContractStoredValue::value", - })?)?; + let value = Felt::try_from(entry.value.ok_or(missing("ContractStoredValue::value"))?)?; Ok((key, value)) } } @@ -212,12 +193,7 @@ impl TryFrom for StateDiffQuery { type Error = ProtobufConversionError; fn try_from(value: protobuf::StateDiffsRequest) -> Result { Ok(StateDiffQuery( - value - .iteration - .ok_or(ProtobufConversionError::MissingField { - field_description: "StateDiffsRequest::iteration", - })? - .try_into()?, + value.iteration.ok_or(missing("StateDiffsRequest::iteration"))?.try_into()?, )) } } @@ -240,12 +216,7 @@ auto_impl_into_and_try_from_vec_u8!(StateDiffQuery, protobuf::StateDiffsRequest) impl TryFrom for ContractDiff { type Error = ProtobufConversionError; fn try_from(value: protobuf::ContractDiff) -> Result { - let contract_address = value - .address - .ok_or(ProtobufConversionError::MissingField { - field_description: "ContractDiff::address", - })? - .try_into()?; + let contract_address = value.address.ok_or(missing("ContractDiff::address"))?.try_into()?; // class_hash can be None if the contract wasn't deployed in this block let class_hash = value @@ -289,20 +260,12 @@ impl From for protobuf::ContractDiff { impl TryFrom for DeclaredClass { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeclaredClass) -> Result { - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclaredClass::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeclaredClass::class_hash"))?.try_into()?); let compiled_class_hash = CompiledClassHash( value .compiled_class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclaredClass::compiled_class_hash", - })? + .ok_or(missing("DeclaredClass::compiled_class_hash"))? .try_into()?, ); Ok(DeclaredClass { class_hash, compiled_class_hash }) @@ -323,12 +286,7 @@ impl TryFrom for DeprecatedDeclaredClass { fn try_from(value: protobuf::DeclaredClass) -> Result { Ok(DeprecatedDeclaredClass { class_hash: ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclaredClass::class_hash", - })? - .try_into()?, + value.class_hash.ok_or(missing("DeclaredClass::class_hash"))?.try_into()?, ), }) } diff --git a/crates/papyrus_protobuf/src/converters/transaction.rs b/crates/papyrus_protobuf/src/converters/transaction.rs index 3bc252c8bb2..0d034b1fd44 100644 --- a/crates/papyrus_protobuf/src/converters/transaction.rs +++ b/crates/papyrus_protobuf/src/converters/transaction.rs @@ -54,6 +54,7 @@ use starknet_types_core::felt::Felt; use super::common::{ enum_int_to_volition_domain, + missing, try_from_starkfelt_to_u128, try_from_starkfelt_to_u32, volition_domain_to_enum_int, @@ -67,9 +68,7 @@ impl TryFrom for DataOrFin { type Error = ProtobufConversionError; fn try_from(value: protobuf::TransactionsResponse) -> Result { let Some(transaction_message) = value.transaction_message else { - return Err(ProtobufConversionError::MissingField { - field_description: "TransactionsResponse::transaction_message", - }); + return Err(missing("TransactionsResponse::transaction_message")); }; match transaction_message { @@ -114,16 +113,12 @@ impl TryFrom for FullTransaction { type Error = ProtobufConversionError; fn try_from(value: protobuf::TransactionWithReceipt) -> Result { let (transaction, transaction_hash) = <(Transaction, TransactionHash)>::try_from( - value.transaction.ok_or(ProtobufConversionError::MissingField { - field_description: "TransactionWithReceipt::transaction", - })?, + value.transaction.ok_or(missing("TransactionWithReceipt::transaction"))?, )?; - let transaction_output = TransactionOutput::try_from(value.receipt.ok_or( - ProtobufConversionError::MissingField { - field_description: "TransactionWithReceipt::output", - }, - )?)?; + let transaction_output = TransactionOutput::try_from( + value.receipt.ok_or(missing("TransactionWithReceipt::output"))?, + )?; Ok(FullTransaction { transaction, transaction_output, transaction_hash }) } } @@ -145,14 +140,10 @@ impl TryFrom for (Transaction, TransactionHash) { let tx_hash = value .transaction_hash .clone() - .ok_or(ProtobufConversionError::MissingField { - field_description: "Transaction::transaction_hash", - })? + .ok_or(missing("Transaction::transaction_hash"))? .try_into() .map(TransactionHash)?; - let txn = value.txn.ok_or(ProtobufConversionError::MissingField { - field_description: "Transaction::txn", - })?; + let txn = value.txn.ok_or(missing("Transaction::txn"))?; let transaction: Transaction = match txn { protobuf::transaction_in_block::Txn::DeclareV0(declare_v0) => Transaction::Declare( DeclareTransaction::V0(DeclareTransactionV0V1::try_from(declare_v0)?), @@ -270,9 +261,7 @@ impl TryFrom for DeployAccountT value: protobuf::transaction_in_block::DeployAccountV1, ) -> Result { let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV1::max_fee", - })?)?; + Felt::try_from(value.max_fee.ok_or(missing("DeployAccountV1::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -283,40 +272,20 @@ impl TryFrom for DeployAccountT let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV1::signature", - })? + .ok_or(missing("DeployAccountV1::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV1::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeployAccountV1::nonce"))?.try_into()?); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV1::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeployAccountV1::class_hash"))?.try_into()?); let contract_address_salt = ContractAddressSalt( - value - .address_salt - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV1::address_salt", - })? - .try_into()?, + value.address_salt.ok_or(missing("DeployAccountV1::address_salt"))?.try_into()?, ); let constructor_calldata = @@ -358,51 +327,29 @@ impl From for protobuf::transaction_in_block::Deploy impl TryFrom for DeployAccountTransactionV3 { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeployAccountV3) -> Result { - let resource_bounds = ValidResourceBounds::try_from(value.resource_bounds.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::resource_bounds", - }, - )?)?; + let resource_bounds = ValidResourceBounds::try_from( + value.resource_bounds.ok_or(missing("DeployAccountV3::resource_bounds"))?, + )?; let tip = Tip(value.tip); let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::signature", - })? + .ok_or(missing("DeployAccountV3::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeployAccountV3::nonce"))?.try_into()?); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeployAccountV3::class_hash"))?.try_into()?); let contract_address_salt = ContractAddressSalt( - value - .address_salt - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::address_salt", - })? - .try_into()?, + value.address_salt.ok_or(missing("DeployAccountV3::address_salt"))?.try_into()?, ); let constructor_calldata = @@ -438,51 +385,29 @@ impl TryFrom for DeployAccountTransactionV3 { impl TryFrom for RpcDeployAccountTransactionV3 { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeployAccountV3) -> Result { - let resource_bounds = AllResourceBounds::try_from(value.resource_bounds.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::resource_bounds", - }, - )?)?; + let resource_bounds = AllResourceBounds::try_from( + value.resource_bounds.ok_or(missing("DeployAccountV3::resource_bounds"))?, + )?; let tip = Tip(value.tip); let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::signature", - })? + .ok_or(missing("DeployAccountV3::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeployAccountV3::nonce"))?.try_into()?); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeployAccountV3::class_hash"))?.try_into()?); let contract_address_salt = ContractAddressSalt( - value - .address_salt - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeployAccountV3::address_salt", - })? - .try_into()?, + value.address_salt.ok_or(missing("DeployAccountV3::address_salt"))?.try_into()?, ); let constructor_calldata = @@ -585,14 +510,10 @@ impl TryFrom for ValidResourceBounds { type Error = ProtobufConversionError; fn try_from(value: protobuf::ResourceBounds) -> Result { let Some(l1_gas) = value.l1_gas else { - return Err(ProtobufConversionError::MissingField { - field_description: "ResourceBounds::l1_gas", - }); + return Err(missing("ResourceBounds::l1_gas")); }; let Some(l2_gas) = value.l2_gas else { - return Err(ProtobufConversionError::MissingField { - field_description: "ResourceBounds::l2_gas", - }); + return Err(missing("ResourceBounds::l2_gas")); }; // TODO(Shahak): Assert data gas is not none once we remove support for 0.13.2. let l1_data_gas = value.l1_data_gas.unwrap_or_default(); @@ -611,11 +532,11 @@ impl TryFrom for ResourceBounds { type Error = ProtobufConversionError; fn try_from(value: protobuf::ResourceLimits) -> Result { let max_amount = value.max_amount; - let max_price_per_unit_felt = Felt::try_from(value.max_price_per_unit.ok_or( - ProtobufConversionError::MissingField { - field_description: "ResourceBounds::ResourceLimits::max_price_per_unit", - }, - )?)?; + let max_price_per_unit_felt = Felt::try_from( + value + .max_price_per_unit + .ok_or(missing("ResourceBounds::ResourceLimits::max_price_per_unit"))?, + )?; let max_price_per_unit = try_from_starkfelt_to_u128(max_price_per_unit_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { @@ -663,10 +584,7 @@ impl From for protobuf::ResourceBounds { impl TryFrom for InvokeTransactionV0 { type Error = ProtobufConversionError; fn try_from(value: protobuf::transaction_in_block::InvokeV0) -> Result { - let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV0::max_fee", - })?)?; + let max_fee_felt = Felt::try_from(value.max_fee.ok_or(missing("InvokeV0::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -677,27 +595,18 @@ impl TryFrom for InvokeTransactionV0 { let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV0::signature", - })? + .ok_or(missing("InvokeV0::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let contract_address = value - .address - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV0::address", - })? - .try_into()?; + let contract_address = value.address.ok_or(missing("InvokeV0::address"))?.try_into()?; - let entry_point_selector_felt = Felt::try_from(value.entry_point_selector.ok_or( - ProtobufConversionError::MissingField { - field_description: "InvokeV0::entry_point_selector", - }, - )?)?; + let entry_point_selector_felt = Felt::try_from( + value.entry_point_selector.ok_or(missing("InvokeV0::entry_point_selector"))?, + )?; let entry_point_selector = EntryPointSelector(entry_point_selector_felt); let calldata = @@ -726,10 +635,7 @@ impl From for protobuf::transaction_in_block::InvokeV0 { impl TryFrom for InvokeTransactionV1 { type Error = ProtobufConversionError; fn try_from(value: protobuf::transaction_in_block::InvokeV1) -> Result { - let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV1::max_fee", - })?)?; + let max_fee_felt = Felt::try_from(value.max_fee.ok_or(missing("InvokeV1::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -740,28 +646,16 @@ impl TryFrom for InvokeTransactionV1 { let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV1::signature", - })? + .ok_or(missing("InvokeV1::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { field_description: "InvokeV1::sender" })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("InvokeV1::sender"))?.try_into()?; - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV1::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("InvokeV1::nonce"))?.try_into()?); let calldata = value.calldata.into_iter().map(Felt::try_from).collect::, _>>()?; @@ -789,39 +683,25 @@ impl From for protobuf::transaction_in_block::InvokeV1 { impl TryFrom for InvokeTransactionV3 { type Error = ProtobufConversionError; fn try_from(value: protobuf::InvokeV3) -> Result { - let resource_bounds = ValidResourceBounds::try_from(value.resource_bounds.ok_or( - ProtobufConversionError::MissingField { - field_description: "InvokeV3::resource_bounds", - }, - )?)?; + let resource_bounds = ValidResourceBounds::try_from( + value.resource_bounds.ok_or(missing("InvokeV3::resource_bounds"))?, + )?; let tip = Tip(value.tip); let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV3::signature", - })? + .ok_or(missing("InvokeV3::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV3::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("InvokeV3::nonce"))?.try_into()?); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { field_description: "InvokeV3::sender" })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("InvokeV3::sender"))?.try_into()?; let calldata = value.calldata.into_iter().map(Felt::try_from).collect::, _>>()?; @@ -864,39 +744,25 @@ impl TryFrom for InvokeTransactionV3 { impl TryFrom for RpcInvokeTransactionV3 { type Error = ProtobufConversionError; fn try_from(value: protobuf::InvokeV3) -> Result { - let resource_bounds = AllResourceBounds::try_from(value.resource_bounds.ok_or( - ProtobufConversionError::MissingField { - field_description: "InvokeV3::resource_bounds", - }, - )?)?; + let resource_bounds = AllResourceBounds::try_from( + value.resource_bounds.ok_or(missing("InvokeV3::resource_bounds"))?, + )?; let tip = Tip(value.tip); let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV3::signature", - })? + .ok_or(missing("InvokeV3::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "InvokeV3::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("InvokeV3::nonce"))?.try_into()?); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { field_description: "InvokeV3::sender" })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("InvokeV3::sender"))?.try_into()?; let calldata = value.calldata.into_iter().map(Felt::try_from).collect::, _>>()?; @@ -1007,10 +873,7 @@ impl TryFrom for DeclareT fn try_from( value: protobuf::transaction_in_block::DeclareV0WithoutClass, ) -> Result { - let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV0::max_fee", - })?)?; + let max_fee_felt = Felt::try_from(value.max_fee.ok_or(missing("DeclareV0::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -1021,9 +884,7 @@ impl TryFrom for DeclareT let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV0::signature", - })? + .ok_or(missing("DeclareV0::signature"))? .parts .into_iter() .map(Felt::try_from) @@ -1033,21 +894,10 @@ impl TryFrom for DeclareT // V0 transactions don't have a nonce, but the StarkNet API adds one to them let nonce = Nonce::default(); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV0::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeclareV0::class_hash"))?.try_into()?); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV0::sender", - })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("DeclareV0::sender"))?.try_into()?; Ok(Self { max_fee, signature, nonce, class_hash, sender_address }) } @@ -1071,10 +921,7 @@ impl TryFrom for DeclareT fn try_from( value: protobuf::transaction_in_block::DeclareV1WithoutClass, ) -> Result { - let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV1::max_fee", - })?)?; + let max_fee_felt = Felt::try_from(value.max_fee.ok_or(missing("DeclareV1::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -1085,39 +932,19 @@ impl TryFrom for DeclareT let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV1::signature", - })? + .ok_or(missing("DeclareV1::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV1::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeclareV1::nonce"))?.try_into()?); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV1::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeclareV1::class_hash"))?.try_into()?); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV1::sender", - })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("DeclareV1::sender"))?.try_into()?; Ok(Self { max_fee, signature, nonce, class_hash, sender_address }) } @@ -1142,10 +969,7 @@ impl TryFrom for DeclareT fn try_from( value: protobuf::transaction_in_block::DeclareV2WithoutClass, ) -> Result { - let max_fee_felt = - Felt::try_from(value.max_fee.ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::max_fee", - })?)?; + let max_fee_felt = Felt::try_from(value.max_fee.ok_or(missing("DeclareV2::max_fee"))?)?; let max_fee = Fee(try_from_starkfelt_to_u128(max_fee_felt).map_err(|_| { ProtobufConversionError::OutOfRangeValue { type_description: "u128", @@ -1156,48 +980,26 @@ impl TryFrom for DeclareT let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::signature", - })? + .ok_or(missing("DeclareV2::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeclareV2::nonce"))?.try_into()?); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("DeclareV2::class_hash"))?.try_into()?); let compiled_class_hash = CompiledClassHash( value .compiled_class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::compiled_class_hash", - })? + .ok_or(missing("DeclareV2::compiled_class_hash"))? .try_into()?, ); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV2::sender", - })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("DeclareV2::sender"))?.try_into()?; Ok(Self { max_fee, signature, nonce, class_hash, compiled_class_hash, sender_address }) } @@ -1223,18 +1025,11 @@ impl TryFrom for DeclareT fn try_from( value: protobuf::transaction_in_block::DeclareV3WithoutClass, ) -> Result { - let common = DeclareTransactionV3Common::try_from(value.common.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeclareV3WithoutClass::common", - }, - )?)?; + let common = DeclareTransactionV3Common::try_from( + value.common.ok_or(missing("DeclareV3WithoutClass::common"))?, + )?; let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV3WithoutClass::class_hash", - })? - .try_into()?, + value.class_hash.ok_or(missing("DeclareV3WithoutClass::class_hash"))?.try_into()?, ); Ok(Self { @@ -1290,16 +1085,12 @@ impl From for protobuf::transaction_in_block::DeclareV3Wit impl TryFrom for RpcDeclareTransactionV3 { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeclareV3WithClass) -> Result { - let common = DeclareTransactionV3Common::try_from(value.common.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeclareV3WithClass::common", - }, - )?)?; - let class: SierraContractClass = SierraContractClass::try_from(value.class.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeclareV3WithClass::class", - }, - )?)?; + let common = DeclareTransactionV3Common::try_from( + value.common.ok_or(missing("DeclareV3WithClass::common"))?, + )?; + let class: SierraContractClass = SierraContractClass::try_from( + value.class.ok_or(missing("DeclareV3WithClass::class"))?, + )?; if let ValidResourceBounds::AllResources(resource_bounds) = common.resource_bounds { Ok(Self { sender_address: common.sender_address, @@ -1358,22 +1149,11 @@ impl TryFrom for DeployTransaction { fn try_from(value: protobuf::transaction_in_block::Deploy) -> Result { let version = TransactionVersion(Felt::from(value.version)); - let class_hash = ClassHash( - value - .class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "Deploy::class_hash", - })? - .try_into()?, - ); + let class_hash = + ClassHash(value.class_hash.ok_or(missing("Deploy::class_hash"))?.try_into()?); let contract_address_salt = ContractAddressSalt( - value - .address_salt - .ok_or(ProtobufConversionError::MissingField { - field_description: "Deploy::address_salt", - })? - .try_into()?, + value.address_salt.ok_or(missing("Deploy::address_salt"))?.try_into()?, ); let constructor_calldata = @@ -1406,27 +1186,13 @@ impl TryFrom for L1HandlerTransaction { fn try_from(value: protobuf::L1HandlerV0) -> Result { let version = L1HandlerTransaction::VERSION; - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "L1HandlerV0::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("L1HandlerV0::nonce"))?.try_into()?); - let contract_address = value - .address - .ok_or(ProtobufConversionError::MissingField { - field_description: "L1HandlerV0::address", - })? - .try_into()?; + let contract_address = value.address.ok_or(missing("L1HandlerV0::address"))?.try_into()?; - let entry_point_selector_felt = Felt::try_from(value.entry_point_selector.ok_or( - ProtobufConversionError::MissingField { - field_description: "L1HandlerV0::entry_point_selector", - }, - )?)?; + let entry_point_selector_felt = Felt::try_from( + value.entry_point_selector.ok_or(missing("L1HandlerV0::entry_point_selector"))?, + )?; let entry_point_selector = EntryPointSelector(entry_point_selector_felt); let calldata = @@ -1481,9 +1247,7 @@ impl From for protobuf::ConsensusTransaction { impl TryFrom for ConsensusTransaction { type Error = ProtobufConversionError; fn try_from(value: protobuf::ConsensusTransaction) -> Result { - let txn = value.txn.ok_or(ProtobufConversionError::MissingField { - field_description: "ConsensusTransaction::txn", - })?; + let txn = value.txn.ok_or(missing("ConsensusTransaction::txn"))?; let txn = match txn { protobuf::consensus_transaction::Txn::DeclareV3(txn) => { ConsensusTransaction::RpcTransaction(RpcTransaction::Declare( @@ -1519,12 +1283,7 @@ impl TryFrom for TransactionQuery { type Error = ProtobufConversionError; fn try_from(value: protobuf::TransactionsRequest) -> Result { Ok(TransactionQuery( - value - .iteration - .ok_or(ProtobufConversionError::MissingField { - field_description: "TransactionsRequest::iteration", - })? - .try_into()?, + value.iteration.ok_or(missing("TransactionsRequest::iteration"))?.try_into()?, )) } } diff --git a/crates/papyrus_protobuf/src/transaction.rs b/crates/papyrus_protobuf/src/transaction.rs index 43c666b80ef..11834c64ad1 100644 --- a/crates/papyrus_protobuf/src/transaction.rs +++ b/crates/papyrus_protobuf/src/transaction.rs @@ -10,7 +10,11 @@ use starknet_api::transaction::fields::{ }; use starknet_types_core::felt::Felt; -use crate::converters::common::{enum_int_to_volition_domain, volition_domain_to_enum_int}; +use crate::converters::common::{ + enum_int_to_volition_domain, + missing, + volition_domain_to_enum_int, +}; use crate::converters::ProtobufConversionError; use crate::protobuf; @@ -31,50 +35,32 @@ pub(crate) struct DeclareTransactionV3Common { impl TryFrom for DeclareTransactionV3Common { type Error = ProtobufConversionError; fn try_from(value: protobuf::DeclareV3Common) -> Result { - let resource_bounds = ValidResourceBounds::try_from(value.resource_bounds.ok_or( - ProtobufConversionError::MissingField { - field_description: "DeclareV3Common::resource_bounds", - }, - )?)?; + let resource_bounds = ValidResourceBounds::try_from( + value.resource_bounds.ok_or(missing("DeclareV3Common::resource_bounds"))?, + )?; let tip = Tip(value.tip); let signature = TransactionSignature( value .signature - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV3Common::signature", - })? + .ok_or(missing("DeclareV3Common::signature"))? .parts .into_iter() .map(Felt::try_from) .collect::, _>>()?, ); - let nonce = Nonce( - value - .nonce - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV3Common::nonce", - })? - .try_into()?, - ); + let nonce = Nonce(value.nonce.ok_or(missing("DeclareV3Common::nonce"))?.try_into()?); let compiled_class_hash = CompiledClassHash( value .compiled_class_hash - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV3Common::compiled_class_hash", - })? + .ok_or(missing("DeclareV3Common::compiled_class_hash"))? .try_into()?, ); - let sender_address = value - .sender - .ok_or(ProtobufConversionError::MissingField { - field_description: "DeclareV3Common::sender", - })? - .try_into()?; + let sender_address = value.sender.ok_or(missing("DeclareV3Common::sender"))?.try_into()?; let nonce_data_availability_mode = enum_int_to_volition_domain(value.nonce_data_availability_mode)?;