Skip to content

Commit

Permalink
Add GetContractAddress. (#2124)
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyalesokhin-starkware committed Feb 14, 2023
1 parent ff2db01 commit 0346859
Show file tree
Hide file tree
Showing 11 changed files with 3,786 additions and 3 deletions.
9 changes: 9 additions & 0 deletions corelib/starknet.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ fn get_caller_address() -> ContractAddress {
get_caller_address_syscall().unwrap_syscall()
}

extern fn get_contract_address_syscall() -> SyscallResult::<ContractAddress> implicits(
GasBuiltin, System
) nopanic;

fn get_contract_address() -> ContractAddress {
get_contract_address_syscall().unwrap_syscall()
}


trait StorageAccess<T> {
fn read(address_domain: felt, base: StorageBaseAddress) -> SyscallResult::<T>;
fn write(address_domain: felt, base: StorageBaseAddress, value: T) -> SyscallResult::<()>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,8 @@ pub fn core_libfunc_ap_change<InfoProvider: InvocationApChangeInfoProvider>(
StarkNetConcreteLibfunc::StorageAddressFromBase(_) => vec![ApChange::Known(0)],
StarkNetConcreteLibfunc::StorageAddressFromBaseAndOffset(_) => vec![ApChange::Known(0)],
StarkNetConcreteLibfunc::EmitEvent(_) => vec![ApChange::Known(2), ApChange::Known(2)],
StarkNetConcreteLibfunc::GetCallerAddress(_) => {
StarkNetConcreteLibfunc::GetCallerAddress(_)
| StarkNetConcreteLibfunc::GetContractAddress(_) => {
vec![ApChange::Known(2), ApChange::Known(2)]
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ pub fn starknet_libfunc_cost_base<Ops: CostOperations>(
StarkNetConcreteLibfunc::StorageAddressFromBase(_) => vec![ops.steps(0)],
StarkNetConcreteLibfunc::StorageAddressFromBaseAndOffset(_) => vec![ops.steps(0)],
StarkNetConcreteLibfunc::EmitEvent(_) => syscall_cost(ops, 9, 9),
StarkNetConcreteLibfunc::GetCallerAddress(_) => syscall_cost(ops, 5, 5),
StarkNetConcreteLibfunc::GetCallerAddress(_)
| StarkNetConcreteLibfunc::GetContractAddress(_) => syscall_cost(ops, 5, 5),
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,8 @@ pub fn build(
}
StarkNetConcreteLibfunc::EmitEvent(_) => build_emit_event(builder),
StarkNetConcreteLibfunc::GetCallerAddress(_) => build_getter(builder, "GetCallerAddress"),
StarkNetConcreteLibfunc::GetContractAddress(_) => {
build_getter(builder, "GetContractAddress")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,10 @@ impl GetterTraits for GetCallerAddressTrait {
const STR_ID: &'static str = "get_caller_address_syscall";
type InfoType = ContractAddressType;
}

#[derive(Default)]
pub struct GetContractAddressTrait {}
impl GetterTraits for GetContractAddressTrait {
const STR_ID: &'static str = "get_contract_address_syscall";
type InfoType = ContractAddressType;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use emit_event::EmitEventLibfunc;
pub mod interoperability;
use interoperability::{CallContractLibfunc, ContractAddressConstLibfunc, ContractAddressType};

use self::getter::{GetCallerAddressTrait, GetterLibfunc};
use self::getter::{GetCallerAddressTrait, GetContractAddressTrait, GetterLibfunc};
use self::interoperability::{ContractAddressToFeltLibfunc, ContractAddressTryFromFeltLibfunc};
use self::storage::{
StorageAddressFromBaseAndOffsetLibfunc, StorageAddressFromBaseLibfunc, StorageAddressType,
Expand Down Expand Up @@ -46,5 +46,6 @@ define_libfunc_hierarchy! {
StorageAddressFromBaseAndOffset(StorageAddressFromBaseAndOffsetLibfunc),
EmitEvent(EmitEventLibfunc),
GetCallerAddress(GetterLibfunc<GetCallerAddressTrait>),
GetContractAddress(GetterLibfunc<GetContractAddressTrait>),
}, StarkNetConcreteLibfunc
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"storage_write_syscall",
"emit_event_syscall",
"get_caller_address_syscall",
"get_contract_address_syscall",
"contract_address_const",
"contract_address_try_from_felt",
"contract_address_to_felt",
Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-starknet/src/contract_class_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ fn test_full_contract_deseralization(example_file_name: &str) {
#[test_case("test_contract")]
#[test_case("hello_starknet")]
#[test_case("erc20")]
#[test_case("test_syscalls")]
fn test_compile_path(example_file_name: &str) {
let contract = get_test_contract(format!("{example_file_name}.cairo").as_str());

Expand Down
14 changes: 14 additions & 0 deletions crates/cairo-lang-starknet/test_data/test_syscalls.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#[contract]
mod SyscallTester {
use starknet::ContractAddress;

#[external]
fn get_caller_address() -> ContractAddress {
starknet::get_caller_address()
}

#[external]
fn get_contract_address() -> ContractAddress {
starknet::get_contract_address()
}
}

0 comments on commit 0346859

Please sign in to comment.