@@ -4,9 +4,17 @@ use cairo_lib::data_structures::mmr::proof::Proof;
44use cairo_lib :: hashing :: keccak :: keccak_cairo_words64;
55use cairo_lib :: hashing :: poseidon :: hash_words64;
66use cairo_lib :: utils :: types :: words64 :: Words64 ;
7+ use starknet :: ContractAddress ;
8+
9+ // Growing module is separated into different contract to reduce class size of the Satellite
10+ // contract.
711
812#[starknet:: interface]
913pub trait IEvmGrowing <TContractState > {
14+ fn _setGrowingInnerContractAddress (
15+ ref self : TContractState , inner_contract_address : ContractAddress ,
16+ );
17+
1018 fn onchainEvmAppendBlocksBatch (
1119 ref self : TContractState ,
1220 chain_id : u256 ,
@@ -21,15 +29,17 @@ pub trait IEvmGrowing<TContractState> {
2129
2230#[starknet:: component]
2331pub mod evm_growing_component {
32+ use openzeppelin :: access :: ownable :: OwnableComponent ;
33+ use openzeppelin :: access :: ownable :: OwnableComponent :: InternalTrait as OwnableInternal ;
2434 use starknet :: storage :: {StoragePathEntry , StoragePointerReadAccess , StoragePointerWriteAccess };
2535 use crate :: mmr_core :: {POSEIDON_HASHING_FUNCTION , RootForHashingFunction };
2636 use crate :: state :: state_component;
27- use crate :: utils :: decoders :: {decode_block_number, decode_parent_hash, decode_rlp};
28- use crate :: utils :: header_rlp_index;
2937 use super :: * ;
3038
3139 #[storage]
32- struct Storage {}
40+ struct Storage {
41+ inner_contract_address : ContractAddress ,
42+ }
3343
3444 #[derive(Drop , Serde )]
3545 enum GrownBy {
@@ -59,7 +69,15 @@ pub mod evm_growing_component {
5969 + HasComponent <TContractState >,
6070 + Drop <TContractState >,
6171 impl State : state_component :: HasComponent <TContractState >,
72+ impl Ownable : OwnableComponent :: HasComponent <TContractState >,
6273 > of IEvmGrowing <ComponentState <TContractState >> {
74+ fn _setGrowingInnerContractAddress (
75+ ref self : ComponentState <TContractState >, inner_contract_address : ContractAddress ,
76+ ) {
77+ get_dep_component! (@ self , Ownable ). assert_only_owner ();
78+ self . inner_contract_address. write (inner_contract_address );
79+ }
80+
6381 fn onchainEvmAppendBlocksBatch (
6482 ref self : ComponentState <TContractState >,
6583 chain_id : u256 ,
@@ -86,6 +104,102 @@ pub mod evm_growing_component {
86104 . try_into ()
87105 . expect (' ROOT_DOES_NOT_FIT' ),
88106 };
107+
108+ let initial_blockhash = if mmr_proof . is_none () {
109+ let reference_block = reference_block . unwrap ();
110+ Some (
111+ state
112+ . received_parent_hashes
113+ . entry (chain_id )
114+ . entry (POSEIDON_HASHING_FUNCTION )
115+ . entry (reference_block )
116+ . read (),
117+ )
118+ } else {
119+ None
120+ };
121+
122+ let (mmr , start_block , end_block ) = IEvmGrowingInternalDispatcher {
123+ contract_address : self . inner_contract_address. read (),
124+ }
125+ . inner_onchainEvmAppendBlocksBatch (
126+ chain_id ,
127+ headers_rlp ,
128+ mmr_peaks ,
129+ mmr_id ,
130+ reference_block ,
131+ mmr_index ,
132+ mmr_proof ,
133+ mmr ,
134+ initial_blockhash ,
135+ );
136+
137+ mmr_data . mmr_size_to_root. write (mmr . last_pos, mmr . root. into ());
138+ mmr_data . latest_size. write (mmr . last_pos);
139+
140+ self
141+ . emit (
142+ Event :: GrownMmr (
143+ GrownMmr {
144+ first_appended_block : start_block ,
145+ last_appended_block : end_block ,
146+ roots_for_hashing_functions : [
147+ RootForHashingFunction {
148+ hashing_function : POSEIDON_HASHING_FUNCTION ,
149+ root : mmr . root. into (),
150+ }
151+ ]
152+ . span (),
153+ mmr_size : mmr . last_pos,
154+ mmr_id ,
155+ accumulated_chain_id : chain_id ,
156+ grown_by : GrownBy :: EvmOnChainGrowing ,
157+ },
158+ ),
159+ );
160+ }
161+ }
162+ }
163+
164+ #[starknet:: interface]
165+ trait IEvmGrowingInternal <TContractState > {
166+ fn inner_onchainEvmAppendBlocksBatch (
167+ self : @ TContractState ,
168+ chain_id : u256 ,
169+ headers_rlp : Span <Words64 >,
170+ mmr_peaks : Peaks ,
171+ mmr_id : u256 ,
172+ reference_block : Option <u256 >,
173+ mmr_index : Option <MmrSize >,
174+ mmr_proof : Option <Proof >,
175+ mmr : MMR ,
176+ initial_blockhash : Option <u256 >,
177+ ) -> (MMR , u256 , u256 );
178+ }
179+
180+ #[starknet:: contract]
181+ pub mod evm_growing_contract {
182+ use crate :: utils :: decoders :: {decode_block_number, decode_parent_hash, decode_rlp};
183+ use crate :: utils :: header_rlp_index;
184+ use super :: * ;
185+
186+ #[storage]
187+ struct Storage {}
188+
189+ #[abi(embed_v0)]
190+ impl EvmGrowingInternalImpl of IEvmGrowingInternal <ContractState > {
191+ fn inner_onchainEvmAppendBlocksBatch (
192+ self : @ ContractState ,
193+ chain_id : u256 ,
194+ mut headers_rlp : Span <Words64 >,
195+ mmr_peaks : Peaks ,
196+ mmr_id : u256 ,
197+ reference_block : Option <u256 >,
198+ mmr_index : Option <MmrSize >,
199+ mmr_proof : Option <Proof >,
200+ mut mmr : MMR ,
201+ initial_blockhash : Option <u256 >,
202+ ) -> (MMR , u256 , u256 ) {
89203 assert (mmr . root != 0 , ' SRC_MMR_NOT_FOUND' );
90204
91205 let headers_rlp_len = headers_rlp . len ();
@@ -128,13 +242,7 @@ pub mod evm_growing_component {
128242 start_block = reference_block - 1 ;
129243 end_block = (start_block + 1 ) - headers_rlp_len . into ();
130244
131- let initial_blockhash = state
132- . received_parent_hashes
133- . entry (chain_id )
134- . entry (POSEIDON_HASHING_FUNCTION )
135- . entry (reference_block )
136- . read ();
137-
245+ let initial_blockhash = initial_blockhash . unwrap ();
138246 assert (initial_blockhash != 0 , ' BLOCK_NOT_RECEIVED' );
139247 assert (initial_blockhash == poseidon_hash . into (), ' INVALID_INITIAL_HEADER_RLP' );
140248
@@ -161,29 +269,7 @@ pub mod evm_growing_component {
161269 peaks = p ;
162270 }
163271
164- mmr_data . mmr_size_to_root. write (mmr . last_pos, mmr . root. into ());
165- mmr_data . latest_size. write (mmr . last_pos);
166-
167- self
168- . emit (
169- Event :: GrownMmr (
170- GrownMmr {
171- first_appended_block : start_block ,
172- last_appended_block : end_block ,
173- roots_for_hashing_functions : [
174- RootForHashingFunction {
175- hashing_function : POSEIDON_HASHING_FUNCTION ,
176- root : mmr . root. into (),
177- }
178- ]
179- . span (),
180- mmr_size : mmr . last_pos,
181- mmr_id ,
182- accumulated_chain_id : chain_id ,
183- grown_by : GrownBy :: EvmOnChainGrowing ,
184- },
185- ),
186- );
272+ (mmr , start_block , end_block )
187273 }
188274 }
189275}
0 commit comments