Skip to main content

reflect

def reflect(ids) -> Reflector:

Loads specified a Cairo object into a Python type. reflect is a function that takes in ids and returns Reflector object that behaves simillarly. To retrieve the value use get() method which can return:

  • int (for felt)
  • RelocatableValue (for pointer)
  • CairoStruct (for more complex types)

You can use it to print Cairo data and compare complex structures.

Printing
%lang starknet

struct SimpleStruct {
x: felt,
}

@external
func test_reflect_simple() {
alloc_locals;

local simple_struct: SimpleStruct = SimpleStruct(x=10);

%{
simple_struct = reflect(ids).simple_struct.get()
print(simple_struct)
# output:
# CairoStruct(
# x=10
# )

assert simple_struct.x == 10
%}

return ();
}
Pointers
%lang starknet

from starkware.cairo.common.registers import get_fp_and_pc

@external
func test_pointers() {
alloc_locals;

let (__fp__, _) = get_fp_and_pc();

local pointee: felt = 13;
local ptr1: felt* = &pointee;
local ptr2: felt* = &pointee;

%{
ptr1 = reflect(ids).ptr1.get()
ptr2 = reflect(ids).ptr2.get()

print(ptr1) # output: 1:8
print(type(ptr1)) # output: RelocatableValue
assert ptr1 == ptr2 # Pointers are compared directly using their addresses
%}
return ();
}
Nested
%lang starknet

struct InnerStruct {
value: felt,
}

struct OuterStruct {
inner_struct: InnerStruct,
}

@external
func test_nesting() {
alloc_locals;
local inner_struct: InnerStruct = InnerStruct(value=7);
local outer_struct: OuterStruct = OuterStruct(inner_struct=inner_struct);

%{
outer_struct = reflect(ids).outer_struct.get()
OuterStruct = CairoStruct #
InnerStruct = CairoStruct # This way you can add aliases for readability

# You can compare nested structs
assert outer_struct == OuterStruct(
inner_struct=InnerStruct(
value=7
)
)
%}
return ();
}
Wildcards
%lang starknet

struct TwoFieldStruct {
value1: felt,
value2: felt,
}

@external
func test_wildcards() {
alloc_locals;
local two_field_struct: TwoFieldStruct = TwoFieldStruct(value1=23, value2=17);

%{
two_field_struct = reflect(ids).two_field_struct.get()
assert two_field_struct == CairoStruct(
value1=23,
value2=two_field_struct.value2
# You can use struct members in comparison to make sure it evaluates to true
)
%}
return ();
}
danger

Unlike ids, reflect does not automatically dereference pointers. Currently you have to dereference them in Cairo.