Skip to content

Commit

Permalink
clean up Invoke tx
Browse files Browse the repository at this point in the history
  • Loading branch information
ftheirs committed Sep 3, 2024
1 parent 0bc8055 commit 0618d7a
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 63 deletions.
9 changes: 2 additions & 7 deletions crates/bin/prove_block/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,8 @@ pub(crate) fn get_subcalled_contracts_from_tx_traces(traces: &[TransactionTraceW
if let Some(inv) = &invoke_trace.validate_invocation {
process_function_invocations(inv, &mut contracts_subcalled);
}
match &invoke_trace.execute_invocation {
ExecuteInvocation::Success(inv) => {
process_function_invocations(inv, &mut contracts_subcalled);
}
ExecuteInvocation::Reverted(_) => {
// Nothing to do
}
if let ExecuteInvocation::Success(inv) = &invoke_trace.execute_invocation {
process_function_invocations(inv, &mut contracts_subcalled);
}
if let Some(inv) = &invoke_trace.fee_transfer_invocation {
process_function_invocations(inv, &mut contracts_subcalled);
Expand Down
117 changes: 61 additions & 56 deletions crates/rpc-replay/src/transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ use std::error::Error;
use std::sync::Arc;

use blockifier::transaction::account_transaction::AccountTransaction;
use starknet::core::types::{InvokeTransaction, ResourceBoundsMapping, Transaction};
use starknet::core::types::{
Felt, InvokeTransaction, InvokeTransactionV1, InvokeTransactionV3, ResourceBoundsMapping, Transaction,
};
use starknet_api::core::PatriciaKey;
use starknet_api::transaction::TransactionHash;
use starknet_api::transaction::{Fee, TransactionHash};
use starknet_api::StarknetApiError;

pub fn resource_bounds_core_to_api(
resource_bounds: &ResourceBoundsMapping,
Expand Down Expand Up @@ -37,63 +40,60 @@ fn da_mode_core_to_api(
}
}

fn felt_to_fee(fee: Felt) -> Result<Fee, StarknetApiError> {
let fee_u128 = fee
.to_bigint()
.try_into()
.map_err(|_| StarknetApiError::OutOfRange { string: "Felt to biguint conversion failed".to_string() })?;

Ok(Fee(fee_u128))
}
fn invoke_v1_to_blockifier(
tx: &InvokeTransactionV1,
) -> Result<blockifier::transaction::transaction_execution::Transaction, StarknetApiError> {
let tx_hash = TransactionHash(tx.transaction_hash);
let api_tx = starknet_api::transaction::InvokeTransaction::V1(starknet_api::transaction::InvokeTransactionV1 {
max_fee: felt_to_fee(tx.max_fee)?,
signature: starknet_api::transaction::TransactionSignature(tx.signature.to_vec()),
nonce: starknet_api::core::Nonce(tx.nonce),
sender_address: starknet_api::core::ContractAddress(PatriciaKey::try_from(tx.sender_address)?),
calldata: starknet_api::transaction::Calldata(Arc::new(tx.calldata.to_vec())),
});

let invoke = blockifier::transaction::transactions::InvokeTransaction { tx: api_tx, tx_hash, only_query: false };
Ok(blockifier::transaction::transaction_execution::Transaction::AccountTransaction(AccountTransaction::Invoke(
invoke,
)))
}

fn invoke_v3_to_blockifier(
tx: &InvokeTransactionV3,
) -> Result<blockifier::transaction::transaction_execution::Transaction, StarknetApiError> {
let tx_hash = TransactionHash(tx.transaction_hash);
let api_tx = starknet_api::transaction::InvokeTransaction::V3(starknet_api::transaction::InvokeTransactionV3 {
resource_bounds: resource_bounds_core_to_api(&tx.resource_bounds),
tip: starknet_api::transaction::Tip(tx.tip),
signature: starknet_api::transaction::TransactionSignature(tx.signature.to_vec()),
nonce: starknet_api::core::Nonce(tx.nonce),
sender_address: starknet_api::core::ContractAddress(PatriciaKey::try_from(tx.sender_address)?),
calldata: starknet_api::transaction::Calldata(Arc::new(tx.calldata.to_vec())),
nonce_data_availability_mode: da_mode_core_to_api(tx.nonce_data_availability_mode),
fee_data_availability_mode: da_mode_core_to_api(tx.fee_data_availability_mode),
paymaster_data: starknet_api::transaction::PaymasterData(tx.paymaster_data.to_vec()),
account_deployment_data: starknet_api::transaction::AccountDeploymentData(tx.account_deployment_data.to_vec()),
});

let invoke = blockifier::transaction::transactions::InvokeTransaction { tx: api_tx, tx_hash, only_query: false };
Ok(blockifier::transaction::transaction_execution::Transaction::AccountTransaction(AccountTransaction::Invoke(
invoke,
)))
}

/// Maps starknet-core transactions to Blockifier-compatible types.
pub fn starknet_rs_to_blockifier(
sn_core_tx: &starknet::core::types::Transaction,
) -> Result<blockifier::transaction::transaction_execution::Transaction, Box<dyn Error>> {
let blockifier_tx: AccountTransaction = match sn_core_tx {
Transaction::Invoke(tx) => {
let (tx_hash, api_tx) = match tx {
InvokeTransaction::V0(tx) => {
let _tx_hash = TransactionHash(tx.transaction_hash);
unimplemented!("starknet_rs_to_blockifier with InvokeTransaction::V0");
}
InvokeTransaction::V1(tx) => {
let tx_hash = TransactionHash(tx.transaction_hash);
let api_tx = starknet_api::transaction::InvokeTransaction::V1(
starknet_api::transaction::InvokeTransactionV1 {
max_fee: starknet_api::transaction::Fee(tx.max_fee.to_biguint().try_into()?),
signature: starknet_api::transaction::TransactionSignature(
tx.signature.clone().into_iter().collect(),
),
nonce: starknet_api::core::Nonce(tx.nonce),
sender_address: starknet_api::core::ContractAddress(
PatriciaKey::try_from(tx.sender_address).unwrap(),
),
calldata: starknet_api::transaction::Calldata(Arc::new(
tx.calldata.clone().into_iter().collect(),
)),
},
);
(tx_hash, api_tx)
}
InvokeTransaction::V3(tx) => {
let tx_hash = TransactionHash(tx.transaction_hash);
let api_tx = starknet_api::transaction::InvokeTransaction::V3(
starknet_api::transaction::InvokeTransactionV3 {
resource_bounds: resource_bounds_core_to_api(&tx.resource_bounds),
tip: starknet_api::transaction::Tip(tx.tip),
signature: starknet_api::transaction::TransactionSignature(tx.signature.to_vec()),
nonce: starknet_api::core::Nonce(tx.nonce),
sender_address: starknet_api::core::ContractAddress(
PatriciaKey::try_from(tx.sender_address).unwrap(),
),
calldata: starknet_api::transaction::Calldata(Arc::new(tx.calldata.to_vec())),
nonce_data_availability_mode: da_mode_core_to_api(tx.nonce_data_availability_mode),
fee_data_availability_mode: da_mode_core_to_api(tx.fee_data_availability_mode),
paymaster_data: starknet_api::transaction::PaymasterData(tx.paymaster_data.to_vec()),
account_deployment_data: starknet_api::transaction::AccountDeploymentData(
tx.account_deployment_data.to_vec(),
),
},
);
(tx_hash, api_tx)
}
};
let invoke =
blockifier::transaction::transactions::InvokeTransaction { tx: api_tx, tx_hash, only_query: false };
AccountTransaction::Invoke(invoke)
}
let blockifier_tx = match sn_core_tx {
Transaction::DeployAccount(_tx) => {
unimplemented!("starknet_rs_tx_to_blockifier() with Deploy txn");
}
Expand All @@ -103,8 +103,13 @@ pub fn starknet_rs_to_blockifier(
Transaction::L1Handler(_tx) => {
unimplemented!("starknet_rs_tx_to_blockifier() with L1Handler txn");
}
Transaction::Invoke(tx) => match tx {
InvokeTransaction::V0(_) => unimplemented!("starknet_rs_to_blockifier with InvokeTransaction::V0"),
InvokeTransaction::V1(tx) => invoke_v1_to_blockifier(tx)?,
InvokeTransaction::V3(tx) => invoke_v3_to_blockifier(tx)?,
},
_ => unimplemented!(),
};

Ok(blockifier::transaction::transaction_execution::Transaction::AccountTransaction(blockifier_tx))
Ok(blockifier_tx)
}

0 comments on commit 0618d7a

Please sign in to comment.