77//! details on contract activation.
88
99use alloy:: {
10- primitives:: { utils:: parse_ether, Address , Bytes , U256 } ,
10+ primitives:: { utils:: parse_ether, Address , U256 } ,
1111 providers:: { Provider , WalletProvider } ,
1212 rpc:: types:: {
1313 state:: { AccountOverride , StateOverride } ,
@@ -16,6 +16,7 @@ use alloy::{
1616} ;
1717
1818use crate :: {
19+ core:: code:: contract:: ContractCode ,
1920 precompiles,
2021 utils:: {
2122 bump_data_fee,
@@ -24,6 +25,8 @@ use crate::{
2425 } ,
2526} ;
2627
28+ use super :: code:: Code ;
29+
2730#[ derive( Debug ) ]
2831pub struct ActivationConfig {
2932 pub data_fee_bump_percent : u64 ,
@@ -71,7 +74,7 @@ pub async fn activate_contract(
7174) -> Result < TransactionReceipt , ActivationError > {
7275 let code = provider. get_code_at ( address) . await ?;
7376 let from_address = provider. default_signer_address ( ) ;
74- let data_fee = data_fee ( code, address, config, & provider) . await ?;
77+ let data_fee = data_fee ( & Code :: new_from_code ( & code) , address, config, & provider) . await ?;
7578
7679 let receipt = precompiles:: arb_wasm ( & provider)
7780 . activateProgram ( address)
@@ -93,20 +96,41 @@ pub async fn activate_contract(
9396
9497/// Checks Stylus contract activation, returning the data fee.
9598pub async fn data_fee (
96- code : impl Into < Bytes > ,
99+ code : & Code ,
97100 address : Address ,
98101 config : & ActivationConfig ,
99102 provider : & impl Provider ,
100103) -> Result < U256 , ActivationError > {
101104 let arbwasm = precompiles:: arb_wasm ( provider) ;
102105 let random_sender_addr = Address :: random ( ) ;
103106 let spoofed_sender_account = AccountOverride :: default ( ) . with_balance ( U256 :: MAX ) ;
104- let spoofed_code = AccountOverride :: default ( ) . with_code ( code) ;
105- let state_override = StateOverride :: from_iter ( [
106- ( address, spoofed_code) ,
107- ( random_sender_addr, spoofed_sender_account) ,
108- ] ) ;
107+ let mut state_override = vec ! [ ( random_sender_addr, spoofed_sender_account) ] ;
108+
109+ match code {
110+ Code :: Contract ( contract) => {
111+ let spoofed_code = AccountOverride :: default ( ) . with_code ( contract. as_slice ( ) . to_vec ( ) ) ;
112+ state_override. push ( ( address, spoofed_code) ) ;
113+ }
114+ Code :: Fragments ( fragments) => {
115+ let fragment_addresses = fragments. as_slice ( ) . iter ( ) . map ( |fragment| {
116+ let fragment_address = Address :: random ( ) ;
117+ let fragment_code =
118+ AccountOverride :: default ( ) . with_code ( fragment. as_slice ( ) . to_vec ( ) ) ;
119+ state_override. push ( ( fragment_address, fragment_code) ) ;
120+ fragment_address
121+ } ) ;
122+ let root_contract = ContractCode :: new_root_contract (
123+ fragments. uncompressed_wasm_size ( ) ,
124+ fragment_addresses,
125+ ) ;
126+
127+ let spoofed_code =
128+ AccountOverride :: default ( ) . with_code ( root_contract. as_slice ( ) . to_vec ( ) ) ;
129+ state_override. push ( ( address, spoofed_code) ) ;
130+ }
131+ }
109132
133+ let state_override = StateOverride :: from_iter ( state_override) ;
110134 let result = arbwasm
111135 . activateProgram ( address)
112136 . state ( state_override)
@@ -135,7 +159,7 @@ pub async fn estimate_gas(
135159) -> Result < u64 , ActivationError > {
136160 let code = provider. get_code_at ( address) . await ?;
137161 let from_address = provider. default_signer_address ( ) ;
138- let data_fee = data_fee ( code, address, config, & provider) . await ?;
162+ let data_fee = data_fee ( & Code :: new_from_code ( & code) , address, config, & provider) . await ?;
139163
140164 let gas = precompiles:: arb_wasm ( & provider)
141165 . activateProgram ( address)
0 commit comments