11use blockifier:: state:: state_api:: State ;
22use starknet_rs_core:: types:: Felt ;
3- use starknet_rs_core:: utils:: cairo_short_string_to_felt;
3+ use starknet_rs_core:: utils:: { cairo_short_string_to_felt, normalize_address } ;
44use starknet_types:: contract_address:: ContractAddress ;
55use starknet_types:: felt:: felt_from_prefixed_hex;
6+ use starknet_types:: patricia_key:: PatriciaKey ;
7+ use starknet_types_core:: hash:: Poseidon ;
68
79use crate :: constants:: {
810 CHARGEABLE_ACCOUNT_ADDRESS , UDC_CONTRACT , UDC_CONTRACT_ADDRESS , UDC_CONTRACT_CLASS_HASH ,
@@ -23,7 +25,6 @@ pub(crate) fn create_erc20_at_address_extended(
2325 Ok ( erc20_fee_contract)
2426}
2527
26- /// Set initial values of ERC20 contract storage
2728pub ( crate ) fn initialize_erc20_at_address (
2829 state : & mut StarknetState ,
2930 contract_address : Felt ,
@@ -32,22 +33,38 @@ pub(crate) fn initialize_erc20_at_address(
3233) -> DevnetResult < ( ) > {
3334 let contract_address = ContractAddress :: new ( contract_address) ?;
3435
36+ for ( storage_var_name, s) in [ ( "ERC20_name" , erc20_name) , ( "ERC20_symbol" , erc20_symbol) ] {
37+ assert ! ( s. len( ) <= 30 , "ByteArray short-string init only supports <= 30 bytes" ) ;
38+
39+ let base: Felt = get_storage_var_address ( storage_var_name, & [ ] ) ?. to_felt ( ) ;
40+ let pending_word = cairo_short_string_to_felt ( s)
41+ . map_err ( |err| Error :: UnexpectedInternalError { msg : err. to_string ( ) } ) ?;
42+
43+ state. set_storage_at (
44+ contract_address. into ( ) ,
45+ PatriciaKey :: new ( base) ?. into ( ) ,
46+ Felt :: from ( s. len ( ) as u64 ) ,
47+ ) ?;
48+
49+ let byte_array_marker = cairo_short_string_to_felt ( "ByteArray" )
50+ . map_err ( |err| Error :: UnexpectedInternalError { msg : err. to_string ( ) } ) ?;
51+ let mut state_arr = [ base, Felt :: ZERO , byte_array_marker] ;
52+ Poseidon :: hades_permutation ( & mut state_arr) ;
53+ let chunk_base = normalize_address ( state_arr[ 0 ] ) ;
54+
55+ state. set_storage_at (
56+ contract_address. into ( ) ,
57+ PatriciaKey :: new ( chunk_base) ?. into ( ) ,
58+ pending_word,
59+ ) ?;
60+ }
61+
3562 for ( storage_var_name, storage_value) in [
36- (
37- "ERC20_name" ,
38- cairo_short_string_to_felt ( erc20_name)
39- . map_err ( |err| Error :: UnexpectedInternalError { msg : err. to_string ( ) } ) ?,
40- ) ,
41- (
42- "ERC20_symbol" ,
43- cairo_short_string_to_felt ( erc20_symbol)
44- . map_err ( |err| Error :: UnexpectedInternalError { msg : err. to_string ( ) } ) ?,
45- ) ,
46- ( "ERC20_decimals" , 18 . into ( ) ) ,
63+ ( "ERC20_decimals" , 18u64 . into ( ) ) ,
4764 ( "permitted_minter" , felt_from_prefixed_hex ( CHARGEABLE_ACCOUNT_ADDRESS ) ?) ,
4865 ] {
49- let storage_var_address = get_storage_var_address ( storage_var_name, & [ ] ) ?. into ( ) ;
50- state. set_storage_at ( contract_address. into ( ) , storage_var_address , storage_value) ?;
66+ let key = get_storage_var_address ( storage_var_name, & [ ] ) ?;
67+ state. set_storage_at ( contract_address. into ( ) , key . into ( ) , storage_value) ?;
5168 }
5269
5370 Ok ( ( ) )
0 commit comments