From 8c0da4254aee8d39d1d6ddfa0c46954863913d58 Mon Sep 17 00:00:00 2001 From: Mohammad Nassar Date: Thu, 16 May 2024 18:29:26 +0300 Subject: [PATCH] feat: implement thin transaction converter --- crates/gateway/src/starknet_api_test_utils.rs | 31 ++++++++++++++++++- crates/gateway/src/utils.rs | 16 ++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/crates/gateway/src/starknet_api_test_utils.rs b/crates/gateway/src/starknet_api_test_utils.rs index b91aad4e..a4819a4a 100644 --- a/crates/gateway/src/starknet_api_test_utils.rs +++ b/crates/gateway/src/starknet_api_test_utils.rs @@ -7,7 +7,7 @@ use starknet_api::external_transaction::{ }; use starknet_api::internal_transaction::{InternalInvokeTransaction, InternalTransaction}; use starknet_api::transaction::{ - Calldata, InvokeTransaction, InvokeTransactionV3, ResourceBounds, ResourceBoundsMapping, + Calldata, InvokeTransaction, InvokeTransactionV3, ResourceBounds, ResourceBoundsMapping, Tip, TransactionSignature, }; @@ -21,6 +21,35 @@ pub enum TransactionType { Invoke, } +// TODO(Mohammad): Use the StarkNet API's get_tip function. +pub fn get_tip(tx: &ExternalTransaction) -> Tip { + match tx { + ExternalTransaction::Declare(ExternalDeclareTransaction::V3(tx)) => tx.tip, + ExternalTransaction::DeployAccount(ExternalDeployAccountTransaction::V3(tx)) => tx.tip, + ExternalTransaction::Invoke(ExternalInvokeTransaction::V3(tx)) => tx.tip, + } +} + +// TODO(Mohammad): Use the StarkNet API's get_nonce function. +pub fn get_nonce(tx: &ExternalTransaction) -> Nonce { + match tx { + ExternalTransaction::Declare(ExternalDeclareTransaction::V3(tx)) => tx.nonce, + ExternalTransaction::DeployAccount(ExternalDeployAccountTransaction::V3(tx)) => tx.nonce, + ExternalTransaction::Invoke(ExternalInvokeTransaction::V3(tx)) => tx.nonce, + } +} + +pub fn get_sender_address(tx: &ExternalTransaction) -> ContractAddress { + match tx { + ExternalTransaction::Declare(ExternalDeclareTransaction::V3(tx)) => tx.sender_address, + // TODO(Mohammad): Add support for deploy account. + ExternalTransaction::DeployAccount(ExternalDeployAccountTransaction::V3(_)) => { + ContractAddress::default() + } + ExternalTransaction::Invoke(ExternalInvokeTransaction::V3(tx)) => tx.sender_address, + } +} + pub fn create_internal_tx_for_testing() -> InternalTransaction { let tx = InvokeTransactionV3 { resource_bounds: ResourceBoundsMapping::try_from(vec![ diff --git a/crates/gateway/src/utils.rs b/crates/gateway/src/utils.rs index ca52277c..ae159cfc 100644 --- a/crates/gateway/src/utils.rs +++ b/crates/gateway/src/utils.rs @@ -12,11 +12,13 @@ use starknet_api::external_transaction::{ }; use starknet_api::transaction::{ DeclareTransaction, DeclareTransactionV3, DeployAccountTransaction, DeployAccountTransactionV3, - InvokeTransaction, InvokeTransactionV3, ResourceBoundsMapping, TransactionHasher, - TransactionSignature, + InvokeTransaction, InvokeTransactionV3, ResourceBoundsMapping, TransactionHash, + TransactionHasher, TransactionSignature, }; +use starknet_mempool_types::mempool_types::ThinTransaction; use crate::errors::StatefulTransactionValidatorResult; +use crate::starknet_api_test_utils::{get_nonce, get_sender_address, get_tip}; macro_rules! implement_ref_getters { ($(($member_name:ident, $member_type:ty));* $(;)?) => { @@ -43,6 +45,16 @@ impl ExternalTransactionExt for ExternalTransaction { ); } +pub fn external_tx_to_thin_tx(external_tx: &ExternalTransaction) -> ThinTransaction { + ThinTransaction { + tip: get_tip(external_tx), + nonce: get_nonce(external_tx), + contract_address: get_sender_address(external_tx), + // TODO(Yael): Add transaction hash calculation. + tx_hash: TransactionHash::default(), + } +} + // TODO(Arni, 1/5/2025): Remove this trait once it is implemented in StarkNet API. pub trait ExternalTransactionExt { fn resource_bounds(&self) -> &ResourceBoundsMapping;