Skip to content
Open
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
11 changes: 11 additions & 0 deletions corelib/src/starknet/syscalls.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,17 @@ pub extern fn get_execution_info_v2_syscall() -> SyscallResult<
Box<starknet::info::v2::ExecutionInfo>,
> implicits(GasBuiltin, System) nopanic;

/// Gets information about the current execution, version 3.
/// This syscall should not be called directly. Instead, use
/// `starknet::info::get_execution_info`.
///
/// # Returns
///
/// * A box containing the current V3 execution information.
pub extern fn get_execution_info_v3_syscall() -> SyscallResult<
Box<starknet::info::v3::ExecutionInfo>,
> implicits(GasBuiltin, System) nopanic;

/// Calls the requested function in any previously declared class.
///
/// # Arguments
Expand Down
6 changes: 6 additions & 0 deletions crates/cairo-lang-runner/src/casm_run/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ struct TxInfo {
nonce_data_availability_mode: Felt252,
fee_data_availability_mode: Felt252,
account_deployment_data: Vec<Felt252>,
proof_facts: Vec<Felt252>,
}

/// Copy of the Cairo `ResourceBounds` struct.
Expand Down Expand Up @@ -935,6 +936,9 @@ impl CairoHintProcessor<'_> {
let account_deployment_data_start = res_segment.ptr;
res_segment.write_data(tx_info.account_deployment_data.iter().cloned())?;
let account_deployment_data_end = res_segment.ptr;
let proof_facts_start = res_segment.ptr;
res_segment.write_data(tx_info.proof_facts.iter().cloned())?;
let proof_facts_end = res_segment.ptr;
let tx_info_ptr = res_segment.ptr;
res_segment.write(tx_info.version)?;
res_segment.write(tx_info.account_contract_address)?;
Expand All @@ -953,6 +957,8 @@ impl CairoHintProcessor<'_> {
res_segment.write(tx_info.fee_data_availability_mode)?;
res_segment.write(account_deployment_data_start)?;
res_segment.write(account_deployment_data_end)?;
res_segment.write(proof_facts_start)?;
res_segment.write(proof_facts_end)?;
let block_info_ptr = res_segment.ptr;
res_segment.write(block_info.block_number)?;
res_segment.write(block_info.block_timestamp)?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ pub fn core_libfunc_ap_change<InfoProvider: InvocationApChangeInfoProvider>(
| StarknetConcreteLibfunc::GetBlockHash(_)
| StarknetConcreteLibfunc::GetExecutionInfo(_)
| StarknetConcreteLibfunc::GetExecutionInfoV2(_)
| StarknetConcreteLibfunc::GetExecutionInfoV3(_)
| StarknetConcreteLibfunc::Deploy(_)
| StarknetConcreteLibfunc::Keccak(_)
| StarknetConcreteLibfunc::Sha256ProcessBlock(_)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ pub fn starknet_libfunc_cost_base(libfunc: &StarknetConcreteLibfunc) -> Vec<Cons
StarknetConcreteLibfunc::EmitEvent(_) => syscall_cost(4),
StarknetConcreteLibfunc::GetBlockHash(_) => syscall_cost(1),
StarknetConcreteLibfunc::GetExecutionInfo(_)
| StarknetConcreteLibfunc::GetExecutionInfoV2(_) => syscall_cost(0),
| StarknetConcreteLibfunc::GetExecutionInfoV2(_)
| StarknetConcreteLibfunc::GetExecutionInfoV3(_) => syscall_cost(0),
StarknetConcreteLibfunc::Deploy(_) => syscall_cost(5),
StarknetConcreteLibfunc::Keccak(_) => syscall_cost(2),
StarknetConcreteLibfunc::Sha256ProcessBlock(_) => syscall_cost(2),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ pub fn build(
build_syscalls(builder, "GetBlockHash", [1], [1])
}
StarknetConcreteLibfunc::GetExecutionInfo(_)
| StarknetConcreteLibfunc::GetExecutionInfoV2(_) => {
| StarknetConcreteLibfunc::GetExecutionInfoV2(_)
| StarknetConcreteLibfunc::GetExecutionInfoV3(_) => {
build_syscalls(builder, "GetExecutionInfo", [], [1])
}
StarknetConcreteLibfunc::Deploy(_) => {
Expand Down
83 changes: 83 additions & 0 deletions crates/cairo-lang-sierra/src/extensions/modules/starknet/getter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,32 @@ fn get_execution_info_v2_type(
)
}

/// Helper for v3::ExecutionInfo type.
fn get_execution_info_v3_type(
context: &dyn SignatureSpecializationContext,
) -> Result<ConcreteTypeId, SpecializationError> {
let felt252_ty = context.get_concrete_type(Felt252Type::id(), &[])?;
let contract_address_ty = context.get_concrete_type(ContractAddressType::id(), &[])?;
context.get_concrete_type(
StructType::id(),
&[
GenericArg::UserType(UserTypeId::from_string(
"core::starknet::info::v3::ExecutionInfo",
)),
// block_info
GenericArg::Type(box_ty(context, get_block_info_type(context)?)?),
// tx_info
GenericArg::Type(box_ty(context, get_tx_info_v3_type(context)?)?),
// caller_address
GenericArg::Type(contract_address_ty.clone()),
// contract_address
GenericArg::Type(contract_address_ty),
// entry_point_selector
GenericArg::Type(felt252_ty),
],
)
}

/// Helper for BlockInfo type.
fn get_block_info_type(
context: &dyn SignatureSpecializationContext,
Expand Down Expand Up @@ -234,6 +260,51 @@ fn get_tx_info_v2_type(
)
}

/// Helper for v3::TxInfo type.
fn get_tx_info_v3_type(
context: &dyn SignatureSpecializationContext,
) -> Result<ConcreteTypeId, SpecializationError> {
let felt252_ty = context.get_concrete_type(Felt252Type::id(), &[])?;
let felt252_span_ty = felt252_span_ty(context)?;
let contract_address_ty = context.get_concrete_type(ContractAddressType::id(), &[])?;
let u32_ty = context.get_concrete_type(Uint32Type::id(), &[])?;
let u128_ty = context.get_concrete_type(Uint128Type::id(), &[])?;
context.get_concrete_type(
StructType::id(),
&[
GenericArg::UserType(UserTypeId::from_string("core::starknet::info::v3::TxInfo")),
// version
GenericArg::Type(felt252_ty.clone()),
// account_contract_address
GenericArg::Type(contract_address_ty),
// max_fee
GenericArg::Type(u128_ty.clone()),
// signature
GenericArg::Type(felt252_span_ty.clone()),
// transaction_hash
GenericArg::Type(felt252_ty.clone()),
// chain_id
GenericArg::Type(felt252_ty.clone()),
// nonce
GenericArg::Type(felt252_ty),
// resource_bounds
GenericArg::Type(resource_bounds_span_ty(context)?),
// tip
GenericArg::Type(u128_ty),
// paymaster_data
GenericArg::Type(felt252_span_ty.clone()),
// nonce_data_availability_mode
GenericArg::Type(u32_ty.clone()),
// fee_data_availability_mode
GenericArg::Type(u32_ty),
// account_deployment_data
GenericArg::Type(felt252_span_ty.clone()),
// proof_facts
GenericArg::Type(felt252_span_ty),
],
)
}

#[derive(Default)]
pub struct GetExecutionInfoTrait {}
impl GetterTraitsEx for GetExecutionInfoTrait {
Expand All @@ -257,3 +328,15 @@ impl GetterTraitsEx for GetExecutionInfoV2Trait {
box_ty(context, get_execution_info_v2_type(context)?)
}
}

#[derive(Default)]
pub struct GetExecutionInfoV3Trait {}
impl GetterTraitsEx for GetExecutionInfoV3Trait {
const STR_ID: &'static str = "get_execution_info_v3_syscall";

fn info_type_id(
context: &dyn SignatureSpecializationContext,
) -> Result<ConcreteTypeId, SpecializationError> {
box_ty(context, get_execution_info_v3_type(context)?)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::extensions::lib_func::SignatureSpecializationContext;
use crate::extensions::starknet::getter::GetExecutionInfoV3Trait;
use crate::extensions::{NamedType, SpecializationError};
use crate::ids::{ConcreteTypeId, UserTypeId};
use crate::program::GenericArg;
Expand Down Expand Up @@ -85,6 +86,7 @@ define_libfunc_hierarchy! {
GetBlockHash(GetBlockHashLibfunc),
GetExecutionInfo(GetterLibfunc<GetExecutionInfoTrait>),
GetExecutionInfoV2(GetterLibfunc<GetExecutionInfoV2Trait>),
GetExecutionInfoV3(GetterLibfunc<GetExecutionInfoV3Trait>),
Deploy(DeployLibfunc),
Keccak(KeccakLibfunc),
Sha256ProcessBlock(Sha256ProcessBlockLibfunc),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
"get_class_hash_at_syscall",
"get_execution_info_syscall",
"get_execution_info_v2_syscall",
"get_execution_info_v3_syscall",
"hades_permutation",
"i128_const",
"i128_diff",
Expand Down
93 changes: 93 additions & 0 deletions tests/e2e_test_data/libfuncs/starknet/syscalls
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,99 @@ test::foo@F0([0]: GasBuiltin, [1]: System) -> (GasBuiltin, System, core::result:

//! > ==========================================================================

//! > get_execution_info_v3_syscall libfunc

//! > test_comments

//! > test_runner_name
SmallE2ETestRunner

//! > cairo_code
fn foo() -> starknet::SyscallResult<Box<starknet::info::v3::ExecutionInfo>> {
starknet::syscalls::get_execution_info_v3_syscall()
}

//! > casm
[ap + 0] = 94901967946959054011942058057773508207, ap++;
[ap + -1] = [[fp + -3] + 0];
[fp + -4] = [[fp + -3] + 1];
%{ syscall_handler.syscall(syscall_ptr=memory[fp + -3]) %}
[ap + 0] = [[fp + -3] + 3], ap++;
jmp rel 12 if [ap + -1] != 0;
[ap + 0] = [[fp + -3] + 2], ap++;
[ap + 0] = [ap + -1], ap++;
[ap + 0] = [fp + -3] + 5, ap++;
[ap + 0] = 0, ap++;
[ap + 0] = 0, ap++;
[ap + 0] = [[fp + -3] + 4], ap++;
ret;
[ap + 0] = [[fp + -3] + 2], ap++;
[ap + 0] = [ap + -1], ap++;
[ap + 0] = [fp + -3] + 6, ap++;
[ap + 0] = 1, ap++;
[ap + 0] = [[fp + -3] + 4], ap++;
[ap + 0] = [[fp + -3] + 5], ap++;
ret;

//! > function_costs
test::foo: SmallOrderedMap({Const: 11100})

//! > sierra_code
type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false];
type Box<core::starknet::info::v3::ExecutionInfo> = Box<core::starknet::info::v3::ExecutionInfo> [storable: true, drop: true, dup: true, zero_sized: false];
type Array<felt252> = Array<felt252> [storable: true, drop: true, dup: false, zero_sized: false];
type core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>> = Enum<ut@core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, Box<core::starknet::info::v3::ExecutionInfo>, Array<felt252>> [storable: true, drop: true, dup: false, zero_sized: false];
type felt252 = felt252 [storable: true, drop: true, dup: true, zero_sized: false];
type Box<core::starknet::info::BlockInfo> = Box<core::starknet::info::BlockInfo> [storable: true, drop: true, dup: true, zero_sized: false];
type Box<core::starknet::info::v3::TxInfo> = Box<core::starknet::info::v3::TxInfo> [storable: true, drop: true, dup: true, zero_sized: false];
type ContractAddress = ContractAddress [storable: true, drop: true, dup: true, zero_sized: false];
type core::starknet::info::v3::ExecutionInfo = Struct<ut@core::starknet::info::v3::ExecutionInfo, Box<core::starknet::info::BlockInfo>, Box<core::starknet::info::v3::TxInfo>, ContractAddress, ContractAddress, felt252> [storable: true, drop: true, dup: true, zero_sized: false];
type u128 = u128 [storable: true, drop: true, dup: true, zero_sized: false];
type Snapshot<Array<felt252>> = Snapshot<Array<felt252>> [storable: true, drop: true, dup: true, zero_sized: false];
type core::array::Span::<core::felt252> = Struct<ut@core::array::Span::<core::felt252>, Snapshot<Array<felt252>>> [storable: true, drop: true, dup: true, zero_sized: false];
type Array<core::starknet::info::v2::ResourceBounds> = Array<core::starknet::info::v2::ResourceBounds> [storable: true, drop: true, dup: false, zero_sized: false];
type Snapshot<Array<core::starknet::info::v2::ResourceBounds>> = Snapshot<Array<core::starknet::info::v2::ResourceBounds>> [storable: true, drop: true, dup: true, zero_sized: false];
type core::array::Span::<core::starknet::info::v2::ResourceBounds> = Struct<ut@core::array::Span::<core::starknet::info::v2::ResourceBounds>, Snapshot<Array<core::starknet::info::v2::ResourceBounds>>> [storable: true, drop: true, dup: true, zero_sized: false];
type u32 = u32 [storable: true, drop: true, dup: true, zero_sized: false];
type core::starknet::info::v3::TxInfo = Struct<ut@core::starknet::info::v3::TxInfo, felt252, ContractAddress, u128, core::array::Span::<core::felt252>, felt252, felt252, felt252, core::array::Span::<core::starknet::info::v2::ResourceBounds>, u128, core::array::Span::<core::felt252>, u32, u32, core::array::Span::<core::felt252>, core::array::Span::<core::felt252>> [storable: true, drop: true, dup: true, zero_sized: false];
type u64 = u64 [storable: true, drop: true, dup: true, zero_sized: false];
type core::starknet::info::BlockInfo = Struct<ut@core::starknet::info::BlockInfo, u64, u64, ContractAddress> [storable: true, drop: true, dup: true, zero_sized: false];
type core::starknet::info::v2::ResourceBounds = Struct<ut@core::starknet::info::v2::ResourceBounds, felt252, u64, u128> [storable: true, drop: true, dup: true, zero_sized: false];
type System = System [storable: true, drop: false, dup: false, zero_sized: false];

libfunc get_execution_info_v3_syscall = get_execution_info_v3_syscall;
libfunc branch_align = branch_align;
libfunc store_temp<GasBuiltin> = store_temp<GasBuiltin>;
libfunc redeposit_gas = redeposit_gas;
libfunc enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 0> = enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 0>;
libfunc store_temp<System> = store_temp<System>;
libfunc store_temp<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>> = store_temp<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>>;
libfunc enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 1> = enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 1>;

F0:
get_execution_info_v3_syscall([0], [1]) { fallthrough([2], [3], [4]) F0_B0([5], [6], [7]) };
branch_align() -> ();
store_temp<GasBuiltin>([2]) -> ([2]);
redeposit_gas([2]) -> ([8]);
enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 0>([4]) -> ([9]);
store_temp<GasBuiltin>([8]) -> ([8]);
store_temp<System>([3]) -> ([3]);
store_temp<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>>([9]) -> ([9]);
return([8], [3], [9]);
F0_B0:
branch_align() -> ();
store_temp<GasBuiltin>([5]) -> ([5]);
redeposit_gas([5]) -> ([10]);
enum_init<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>, 1>([7]) -> ([11]);
store_temp<GasBuiltin>([10]) -> ([10]);
store_temp<System>([6]) -> ([6]);
store_temp<core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>>([11]) -> ([11]);
return([10], [6], [11]);

test::foo@F0([0]: GasBuiltin, [1]: System) -> (GasBuiltin, System, core::result::Result::<core::box::Box::<core::starknet::info::v3::ExecutionInfo>, core::array::Array::<core::felt252>>);

//! > ==========================================================================

//! > call_contract_syscall libfunc

//! > test_comments
Expand Down