Skip to content

Commit 462ae8f

Browse files
author
3alpha
authored
Update predeployed ERC20 metadata initialization (#928)
* update: predeployed ERC20 metadata initialization
1 parent 0d7ee7a commit 462ae8f

7 files changed

Lines changed: 49 additions & 27 deletions

File tree

crates/starknet-devnet-core/contracts/system_artifacts/erc20_eth.sierra

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

crates/starknet-devnet-core/contracts/system_artifacts/erc20_strk.sierra

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

crates/starknet-devnet-core/src/constants.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub const CAIRO_1_ACCOUNT_CONTRACT_SIERRA_HASH: &str =
2727
"0x05b4b537eaa2399e3aa99c4e2e0208ebd6c71bc1467938cd52c798c601e43564";
2828

2929
pub const ETH_ERC20_CONTRACT_CLASS_HASH: Felt =
30-
Felt::from_hex_unchecked("0x9524a94b41c4440a16fd96d7c1ef6ad6f44c1c013e96662734502cd4ee9b1f");
30+
Felt::from_hex_unchecked("0x00b45dbc3714180381c5680e41931172d67194d77d504413465390e0bef194ec");
3131
pub const ETH_ERC20_CONTRACT_CLASS: &str = include_str!(concat!(
3232
env!("CARGO_MANIFEST_DIR"),
3333
"/contracts/system_artifacts/erc20_eth.sierra"
@@ -36,7 +36,7 @@ pub const ETH_ERC20_CONTRACT_ADDRESS: Felt =
3636
Felt::from_hex_unchecked("0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7");
3737

3838
pub const STRK_ERC20_CONTRACT_CLASS_HASH: Felt =
39-
Felt::from_hex_unchecked("0x76791ef97c042f81fbf352ad95f39a22554ee8d7927b2ce3c681f3418b5206a");
39+
Felt::from_hex_unchecked("0x02e77ee61d4df3d988ee1f42ea5442e913862cc82c2584d212ecda76666498fc");
4040
pub const STRK_ERC20_CONTRACT_CLASS: &str = include_str!(concat!(
4141
env!("CARGO_MANIFEST_DIR"),
4242
"/contracts/system_artifacts/erc20_strk.sierra"

crates/starknet-devnet-core/src/starknet/predeployed.rs

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
use blockifier::state::state_api::State;
22
use 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};
44
use starknet_types::contract_address::ContractAddress;
55
use starknet_types::felt::felt_from_prefixed_hex;
6+
use starknet_types::patricia_key::PatriciaKey;
7+
use starknet_types_core::hash::Poseidon;
68

79
use 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
2728
pub(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(())

tests/integration/common/constants.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ pub const CAIRO_1_ACCOUNT_CONTRACT_0_8_0_SIERRA_PATH: &str = concat!(
4444
pub const ETH_ERC20_CONTRACT_ADDRESS: Felt =
4545
Felt::from_hex_unchecked("0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7");
4646
pub const ETH_ERC20_CONTRACT_CLASS_HASH: Felt =
47-
Felt::from_hex_unchecked("0x9524a94b41c4440a16fd96d7c1ef6ad6f44c1c013e96662734502cd4ee9b1f");
47+
Felt::from_hex_unchecked("0x00b45dbc3714180381c5680e41931172d67194d77d504413465390e0bef194ec");
4848
pub const STRK_ERC20_CONTRACT_CLASS_HASH: Felt =
49-
Felt::from_hex_unchecked("0x76791ef97c042f81fbf352ad95f39a22554ee8d7927b2ce3c681f3418b5206a");
49+
Felt::from_hex_unchecked("0x02e77ee61d4df3d988ee1f42ea5442e913862cc82c2584d212ecda76666498fc");
5050
pub const STRK_ERC20_CONTRACT_ADDRESS: Felt =
5151
Felt::from_hex_unchecked("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d");
5252
pub const UDC_LEGACY_CONTRACT_ADDRESS: Felt =

tests/integration/general_integration_tests.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ async fn predeployed_erc20_tokens_have_expected_storage() {
140140
.unwrap()
141141
.value();
142142

143-
assert_eq!(parse_cairo_short_string(&actual_value).unwrap().as_str(), expected_value);
143+
assert_eq!(actual_value, expected_value.len().into());
144144
}
145145
}
146146

@@ -165,8 +165,7 @@ async fn predeployed_erc20_tokens_return_expected_values_from_property_getters()
165165
)
166166
.await
167167
.unwrap();
168-
169-
assert_eq!(actual_felts.len(), 1);
170-
assert_eq!(parse_cairo_short_string(&actual_felts[0]).unwrap(), expected_value);
168+
assert_eq!(actual_felts.len(), 3);
169+
assert_eq!(parse_cairo_short_string(&actual_felts[1]).unwrap(), expected_value);
171170
}
172171
}

tests/integration/get_transaction_receipt_by_hash.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,14 @@ async fn deploy_transaction_receipt() {
123123
.iter()
124124
.find(|e| e.from_address == STRK_ERC20_CONTRACT_ADDRESS)
125125
.unwrap();
126-
assert_eq!(fee_charge_event.keys, vec![get_selector_from_name("Transfer").unwrap()]);
127-
assert_eq!(fee_charge_event.data[0], account_address);
126+
assert_eq!(
127+
fee_charge_event.keys,
128+
vec![
129+
get_selector_from_name("Transfer").unwrap(),
130+
account_address,
131+
Felt::from_hex_unchecked("0x1000") // this is sequencer address
132+
]
133+
);
128134
}
129135
_ => panic!("Invalid receipt {:?}", deployment_receipt),
130136
};

0 commit comments

Comments
 (0)