Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 41 additions & 21 deletions crates/apollo_batcher/src/cende_client_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -464,27 +464,47 @@ impl From<InternalRpcTransaction> for CendePreconfirmedTransaction {
deploy_account_transaction,
) => {
let version = deploy_account_transaction.version();
let InternalRpcDeployAccountTransaction {
tx: RpcDeployAccountTransaction::V3(tx),
contract_address,
} = deploy_account_transaction;
CendePreconfirmedTransaction::DeployAccount(IntermediateDeployAccountTransaction {
resource_bounds: Some(tx.resource_bounds.into()),
tip: Some(tx.tip),
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: Some(tx.nonce_data_availability_mode.into()),
fee_data_availability_mode: Some(tx.fee_data_availability_mode.into()),
paymaster_data: Some(tx.paymaster_data),
sender_address: contract_address,
transaction_hash: tx_hash,
version,
// Irrelevant for V3 deploy account transactions.
max_fee: None,
})
let InternalRpcDeployAccountTransaction { tx, contract_address } =
deploy_account_transaction;
// V3 and V4 share a field set; only the version and the derivation of
// `contract_address` differ.
let intermediate_deploy_account_transaction = match tx {
RpcDeployAccountTransaction::V3(tx) => IntermediateDeployAccountTransaction {
resource_bounds: Some(tx.resource_bounds.into()),
tip: Some(tx.tip),
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: Some(tx.nonce_data_availability_mode.into()),
fee_data_availability_mode: Some(tx.fee_data_availability_mode.into()),
paymaster_data: Some(tx.paymaster_data),
sender_address: contract_address,
transaction_hash: tx_hash,
version,
// Irrelevant for V3 deploy account transactions.
max_fee: None,
},
RpcDeployAccountTransaction::V4(tx) => IntermediateDeployAccountTransaction {
resource_bounds: Some(tx.resource_bounds.into()),
tip: Some(tx.tip),
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: Some(tx.nonce_data_availability_mode.into()),
fee_data_availability_mode: Some(tx.fee_data_availability_mode.into()),
paymaster_data: Some(tx.paymaster_data),
sender_address: contract_address,
transaction_hash: tx_hash,
version,
// Irrelevant for V4 deploy account transactions.
max_fee: None,
},
};
CendePreconfirmedTransaction::DeployAccount(intermediate_deploy_account_transaction)
}
starknet_api::rpc_transaction::InternalRpcTransactionWithoutTxHash::Invoke(
invoke_transaction,
Expand Down
74 changes: 55 additions & 19 deletions crates/apollo_consensus_orchestrator/src/cende/central_objects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,28 +265,62 @@ struct CentralDeployAccountTransactionV3 {
hash_value: TransactionHash,
}

#[derive(serde::Deserialize, Debug, PartialEq, Serialize)]
struct CentralDeployAccountTransactionV4 {
resource_bounds: CentralResourceBounds,
tip: Tip,
signature: TransactionSignature,
nonce: Nonce,
class_hash: ClassHash,
contract_address_salt: ContractAddressSalt,
sender_address: ContractAddress,
constructor_calldata: Calldata,
nonce_data_availability_mode: u32,
fee_data_availability_mode: u32,
paymaster_data: PaymasterData,
hash_value: TransactionHash,
}

impl From<(InternalRpcDeployAccountTransaction, TransactionHash)>
for CentralDeployAccountTransactionV3
for CentralDeployAccountTransaction
{
fn from(
(tx, hash_value): (InternalRpcDeployAccountTransaction, TransactionHash),
) -> CentralDeployAccountTransactionV3 {
) -> CentralDeployAccountTransaction {
let sender_address = tx.contract_address;
let RpcDeployAccountTransaction::V3(tx) = tx.tx;

CentralDeployAccountTransactionV3 {
resource_bounds: tx.resource_bounds.into(),
tip: tx.tip,
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: tx.nonce_data_availability_mode.into(),
fee_data_availability_mode: tx.fee_data_availability_mode.into(),
paymaster_data: tx.paymaster_data,
hash_value,
sender_address,
match tx.tx {
RpcDeployAccountTransaction::V3(tx) => {
CentralDeployAccountTransaction::V3(CentralDeployAccountTransactionV3 {
resource_bounds: tx.resource_bounds.into(),
tip: tx.tip,
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: tx.nonce_data_availability_mode.into(),
fee_data_availability_mode: tx.fee_data_availability_mode.into(),
paymaster_data: tx.paymaster_data,
hash_value,
sender_address,
})
}
RpcDeployAccountTransaction::V4(tx) => {
CentralDeployAccountTransaction::V4(CentralDeployAccountTransactionV4 {
resource_bounds: tx.resource_bounds.into(),
tip: tx.tip,
signature: tx.signature,
nonce: tx.nonce,
class_hash: tx.class_hash,
contract_address_salt: tx.contract_address_salt,
constructor_calldata: tx.constructor_calldata,
nonce_data_availability_mode: tx.nonce_data_availability_mode.into(),
fee_data_availability_mode: tx.fee_data_availability_mode.into(),
paymaster_data: tx.paymaster_data,
hash_value,
sender_address,
})
}
}
}
}
Expand All @@ -296,6 +330,8 @@ impl From<(InternalRpcDeployAccountTransaction, TransactionHash)>
enum CentralDeployAccountTransaction {
#[serde(rename = "0x3")]
V3(CentralDeployAccountTransactionV3),
#[serde(rename = "0x4")]
V4(CentralDeployAccountTransactionV4),
}

fn into_string_tuple(val: SierraVersion) -> (String, String, String) {
Expand Down Expand Up @@ -413,9 +449,9 @@ impl TryFrom<(InternalConsensusTransaction, Option<&SierraContractClass>)> for C
)))
}
InternalRpcTransactionWithoutTxHash::DeployAccount(deploy_tx) => {
Ok(CentralTransaction::DeployAccount(CentralDeployAccountTransaction::V3(
Ok(CentralTransaction::DeployAccount(
(deploy_tx, rpc_transaction.tx_hash).into(),
)))
))
}
InternalRpcTransactionWithoutTxHash::Declare(declare_tx) => {
let sierra = sierra
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ use super::{
CentralCompiledClassHashesForMigration,
CentralCompressedStateDiff,
CentralDeclareTransaction,
CentralDeployAccountTransaction,
CentralFeeMarketInfo,
CentralFeeProposalInfo,
CentralInvokeTransaction,
Expand Down Expand Up @@ -357,9 +356,7 @@ fn central_deploy_account_tx() -> CentralTransactionWritten {
TransactionHash(felt!("0x429cb4dc45610a80a96800ab350a11ff50e2d69e25c7723c002934e66b5a282"));

CentralTransactionWritten {
tx: CentralTransaction::DeployAccount(CentralDeployAccountTransaction::V3(
(deploy_account_tx, tx_hash).into(),
)),
tx: CentralTransaction::DeployAccount((deploy_account_tx, tx_hash).into()),
time_created: 1734601616,
}
}
Expand Down Expand Up @@ -1233,7 +1230,7 @@ fn test_deploy_account_tx_size_of() {
// + internal_deploy_account_tx.tip.dynamic_size()
// + deploy_account_tx.contract_address.dynamic_size();

assert_eq!(deploy_account_tx.size_bytes(), 528);
assert_eq!(deploy_account_tx.size_bytes(), 544);
}

#[test]
Expand Down
7 changes: 7 additions & 0 deletions crates/apollo_gateway/src/stateless_transaction_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ impl StatelessTransactionValidator {
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V3(tx)) => {
&tx.paymaster_data
}
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(tx)) => {
&tx.paymaster_data
}
RpcTransaction::Declare(RpcDeclareTransaction::V3(tx)) => &tx.paymaster_data,
RpcTransaction::Invoke(RpcInvokeTransaction::V3(tx)) => &tx.paymaster_data,
};
Expand Down Expand Up @@ -165,6 +168,10 @@ impl StatelessTransactionValidator {
tx.constructor_calldata.0.len()
}

RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(tx)) => {
tx.constructor_calldata.0.len()
}

RpcTransaction::Invoke(RpcInvokeTransaction::V3(tx)) => {
tx.calldata.0.len() + tx.proof_facts.0.len()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ impl From<RpcTransaction> for DeprecatedGatewayTransactionV3 {
DeprecatedGatewayDeployAccountTransaction::V3(deploy_account_tx.into()),
)
}
// TODO(Ron): add a V4 variant to the deprecated gateway dialect when v4 ingestion is
// enabled.
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(_)) => {
panic!("Deploy account v4 is not supported by the deprecated gateway dialect.")
}
RpcTransaction::Invoke(RpcInvokeTransaction::V3(invoke_tx)) => {
DeprecatedGatewayTransactionV3::Invoke(DeprecatedGatewayInvokeTransaction::V3(
invoke_tx.into(),
Expand Down
4 changes: 4 additions & 0 deletions crates/apollo_protobuf/src/converters/consensus_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use starknet_api::rpc_transaction::{
RpcDeclareTransactionV3,
RpcDeployAccountTransaction,
RpcDeployAccountTransactionV3,
RpcDeployAccountTransactionV4,
RpcInvokeTransaction,
RpcInvokeTransactionV3,
RpcTransaction,
Expand Down Expand Up @@ -39,6 +40,9 @@ fn add_gas_values_to_transaction(transactions: &mut [ConsensusTransaction]) {
}))
| RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V3(
RpcDeployAccountTransactionV3 { resource_bounds, .. },
))
| RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(
RpcDeployAccountTransactionV4 { resource_bounds, .. },
)) => {
resource_bounds.l2_gas.max_amount = GasAmount(1);
}
Expand Down
33 changes: 32 additions & 1 deletion crates/apollo_protobuf/src/converters/rpc_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@ use starknet_api::rpc_transaction::{
RpcDeclareTransactionV3,
RpcDeployAccountTransaction,
RpcDeployAccountTransactionV3,
RpcDeployAccountTransactionV4,
RpcInvokeTransaction,
RpcInvokeTransactionV3,
RpcTransaction,
};
use starknet_api::state::SierraContractClass;
use starknet_api::transaction::fields::{AllResourceBounds, Proof, ValidResourceBounds};
use starknet_api::transaction::{DeployAccountTransactionV3, InvokeTransactionV3};
use starknet_api::transaction::{
DeployAccountTransactionV3,
DeployAccountTransactionV4,
InvokeTransactionV3,
};

use super::common::missing;
use super::ProtobufConversionError;
Expand All @@ -40,6 +45,9 @@ impl TryFrom<protobuf::MempoolTransaction> for RpcTransaction {
protobuf::mempool_transaction::Txn::DeployAccountV3(txn) => {
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V3(txn.try_into()?))
}
protobuf::mempool_transaction::Txn::DeployAccountV4(txn) => {
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(txn.try_into()?))
}
protobuf::mempool_transaction::Txn::InvokeV3(txn) => {
RpcTransaction::Invoke(RpcInvokeTransaction::V3(txn.try_into()?))
}
Expand All @@ -64,6 +72,13 @@ impl From<RpcTransaction> for protobuf::MempoolTransaction {
transaction_hash: None,
}
}
RpcTransaction::DeployAccount(RpcDeployAccountTransaction::V4(txn)) => {
protobuf::MempoolTransaction {
txn: Some(protobuf::mempool_transaction::Txn::DeployAccountV4(txn.into())),
// TODO(alonl): Consider removing transaction hash from protobuf
transaction_hash: None,
}
}
RpcTransaction::Invoke(RpcInvokeTransaction::V3(txn)) => {
protobuf::MempoolTransaction {
txn: Some(protobuf::mempool_transaction::Txn::InvokeV3(txn.into())),
Expand Down Expand Up @@ -112,6 +127,22 @@ impl From<RpcDeployAccountTransactionV3> for protobuf::DeployAccountV3 {
}
}

impl TryFrom<protobuf::DeployAccountV4> for RpcDeployAccountTransactionV4 {
type Error = ProtobufConversionError;
fn try_from(value: protobuf::DeployAccountV4) -> Result<Self, Self::Error> {
let snapi_deploy_account: DeployAccountTransactionV4 = value.try_into()?;
// This conversion can fail only if the resource_bounds are not AllResources.
snapi_deploy_account.try_into().map_err(|_| DEPRECATED_RESOURCE_BOUNDS_ERROR)
}
}

impl From<RpcDeployAccountTransactionV4> for protobuf::DeployAccountV4 {
fn from(value: RpcDeployAccountTransactionV4) -> Self {
let snapi_deploy_account: DeployAccountTransactionV4 = value.into();
snapi_deploy_account.into()
}
}

impl TryFrom<protobuf::InvokeV3WithProof> for RpcInvokeTransactionV3 {
type Error = ProtobufConversionError;
fn try_from(mut value: protobuf::InvokeV3WithProof) -> Result<Self, Self::Error> {
Expand Down
Loading
Loading